/*******************************************************************************
 * Copyright (c) 2004 IBM Corporation and others.
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v1.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/epl-v10.html
 * 
 * Contributors:
 *     IBM Corporation - initial API and implementation
 *******************************************************************************/
package org.eclipse.wst.css.core.internal.document;

import java.util.ArrayList;
import java.util.List;

import org.eclipse.wst.css.core.internal.provisional.document.ICSSSimpleSelector;


/**
 * 
 */
class CSSSimpleSelector extends CSSSelectorItem implements ICSSSimpleSelector {

	private String fName = null;
	private String fCachedString = null;
	private StringBuffer fStringBuf = null;
	private List fPseudoName = null;
	private List fAttribute = null;
	private List fClass = null;
	private List fID = null;

	/**
	 * CSSSimpleSelector constructor comment.
	 */
	public CSSSimpleSelector() {
		super();
	}

	/**
	 * 
	 */
	void addAttribute(String attribute) {
		if (fAttribute == null) {
			fAttribute = new ArrayList();
		}
		fAttribute.add(attribute);
		addToBuf("[");//$NON-NLS-1$
		addToBuf(attribute);
		addToBuf("]");//$NON-NLS-1$
		fCachedString = null;
	}

	/**
	 * 
	 */
	void addClass(String cls) {
		if (fClass == null) {
			fClass = new ArrayList();
		}
		fClass.add(cls);
		addToBuf(".");//$NON-NLS-1$
		addToBuf(cls);
		fCachedString = null;
	}

	/**
	 * 
	 */
	void addID(String id) {
		if (fID == null) {
			fID = new ArrayList();
		}
		fID.add(id);
		addToBuf("#");//$NON-NLS-1$
		addToBuf(id);
		fCachedString = null;
	}

	/**
	 * 
	 */
	void addPseudoName(String cls) {
		if (fPseudoName == null) {
			fPseudoName = new ArrayList();
		}
		fPseudoName.add(cls);
		addToBuf(":");//$NON-NLS-1$
		addToBuf(cls);
		fCachedString = null;
	}

	/**
	 * 
	 */
	private void addToBuf(String str) {
		if (fStringBuf == null) {
			fStringBuf = new StringBuffer();
		}
		fStringBuf.append(str);
	}

	/**
	 * @return boolean
	 * @param obj
	 *            java.lang.Object
	 */
	public boolean equals(Object obj) {
		if (this == obj)
			return true;

		if (obj == null || this.getClass() != obj.getClass())
			return false;

		CSSSimpleSelector foreign = (CSSSimpleSelector) obj;

		if (getName().compareToIgnoreCase(foreign.getName()) != 0)
			return false;

		int i;

		// compare pseudo-classes / pseudo-elements
		if (getNumOfPseudoNames() != foreign.getNumOfPseudoNames())
			return false;
		for (i = 0; i < getNumOfPseudoNames(); i++) {
			if (getPseudoName(i).compareToIgnoreCase(foreign.getPseudoName(i)) != 0)
				return false;
		}

		// compare classes
		if (getNumOfClasses() != foreign.getNumOfClasses())
			return false;
		for (i = 0; i < getNumOfClasses(); i++) {
			if (getClass(i).compareToIgnoreCase(foreign.getClass(i)) != 0)
				return false;
		}

		// compare IDs
		if (getNumOfIDs() != foreign.getNumOfIDs())
			return false;
		for (i = 0; i < getNumOfIDs(); i++) {
			if (getID(i).compareToIgnoreCase(foreign.getID(i)) != 0)
				return false;
		}

		// compare Attributes
		if (getNumOfAttributes() != foreign.getNumOfAttributes())
			return false;
		for (i = 0; i < getNumOfAttributes(); i++) {
			if (getAttribute(i).compareToIgnoreCase(foreign.getAttribute(i)) != 0)
				return false;
		}
		return true;
	}

	/**
	 * @return java.lang.String
	 * @param index
	 *            int
	 */
	public String getAttribute(int index) {
		if (fAttribute != null && 0 <= index && index < fAttribute.size()) {
			return (String) fAttribute.get(index);
		}
		else {
			return "";//$NON-NLS-1$
		}
	}

	/**
	 * @return java.lang.String
	 * @param index
	 *            int
	 */
	public String getClass(int index) {
		if (fClass != null && 0 <= index && index < fClass.size()) {
			return (String) fClass.get(index);
		}
		else {
			return "";//$NON-NLS-1$
		}
	}

	/**
	 * @return java.lang.String
	 * @param index
	 *            int
	 */
	public String getID(int index) {
		if (fID != null && 0 <= index && index < fID.size()) {
			return (String) fID.get(index);
		}
		else {
			return "";//$NON-NLS-1$
		}
	}

	/**
	 * @return int
	 */
	public int getItemType() {
		return SIMPLE;
	}

	/**
	 * @return java.lang.String
	 */
	public String getName() {
		return (fName != null) ? fName : "";//$NON-NLS-1$
	}

	/**
	 * @return boolean
	 */
	public int getNumOfAttributes() {
		return (fAttribute != null) ? fAttribute.size() : 0;
	}

	/**
	 * @return boolean
	 */
	public int getNumOfClasses() {
		return (fClass != null) ? fClass.size() : 0;
	}

	/**
	 * @return boolean
	 */
	public int getNumOfIDs() {
		return (fID != null) ? fID.size() : 0;
	}

	/**
	 * @return boolean
	 */
	public int getNumOfPseudoNames() {
		return (fPseudoName != null) ? fPseudoName.size() : 0;
	}

	/**
	 * @return java.lang.String
	 * @param index
	 *            int
	 */
	public String getPseudoName(int index) {
		if (fPseudoName != null && 0 <= index && index < fPseudoName.size()) {
			return (String) fPseudoName.get(index);
		}
		else {
			return "";//$NON-NLS-1$
		}
	}

	/**
	 * @return java.lang.String
	 */
	public String getString() {
		if (fCachedString == null) {
			StringBuffer buf = new StringBuffer(getName());
			if (fStringBuf != null) {
				buf.append(fStringBuf.toString());
			}
			fCachedString = buf.toString();
		}
		return fCachedString;
	}

	/**
	 * @return boolean
	 */
	public boolean isUniversal() {
		return (fName == null || fName.equals("*"));//$NON-NLS-1$
	}

	/**
	 * 
	 */
	void setName(String name) {
		fName = name;
		fCachedString = null;
	}
}