/*******************************************************************************
 * Crown Copyright (c) 2006, 2012, Copyright (c) 2006, 2008 Kestral Computing P/L.
 * 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:
 *    Kestral Computing P/L - initial implementation
 *    Werner Keil - updates and consolidation with core
 *******************************************************************************/

package org.eclipse.uomo.ucum.model;

import java.util.ArrayList;
import java.util.List;

import org.eclipse.uomo.core.ICode;
import org.eclipse.uomo.core.IDescription;
import org.eclipse.uomo.core.INames;
import org.eclipse.uomo.core.ISymbol;

public class Concept implements ICode<String>, IDescription, ISymbol, INames {

	private final ConceptKind kind;
	/**
	 * case sensitive code for this concept
	 */
	private String code;
	
	/**
	 * case insensitive (UPPERCASE) code for this concept
	 */
	private String codeUC;
	
	/**
	 * print symbol for this code 
	 */
	private String printSymbol;
	
	/**
	 * names for the concept
	 */
	private List<String> names = new ArrayList<String>();
	
	
	/**
	 * @param code
	 * @param codeUC
	 */
	public Concept(ConceptKind kind, String code, String codeUC) {
		super();
		this.kind = kind;
		this.code = code;
		this.codeUC = codeUC;
	}

	/**
	 * @return the code
	 */
	public String getCode() {
		return code;
	}

	/**
	 * @param code the code to set
	 */
	public void setCode(String code) {
		this.code = code;
	}

	/**
	 * @return the codeUC
	 */
	public String getCodeUC() {
		return codeUC;
	}

	/**
	 * @param codeUC the codeUC to set
	 */
	public void setCodeUC(String codeUC) {
		this.codeUC = codeUC;
	}

	/**
	 * @return the printSymbol
	 */
	public String getPrintSymbol() {
		return printSymbol;
	}

	/**
	 * @param printSymbol the printSymbol to set
	 */
	public void setPrintSymbol(String printSymbol) {
		this.printSymbol = printSymbol;
	}
	
	@Override
	public String getSymbol() {
		return getPrintSymbol();
	}

	/**
	 * @return the names
	 */
	public List<String> getNames() {
		return names;
	}

	/**
	 * @return the kind
	 */
	public ConceptKind getKind() {
		return kind;
	}

	public String getDescription() {
		return  kind.toString().toLowerCase()+" "+code+" ('"+names.get(0)+"')"; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
	}
	
	@Override
	public String toString() {
		return this.getCode() + " = " + getDescription(); //$NON-NLS-1$
	}
}
