/*******************************************************************************
 * Copyright (c) 2005, 2008 Intel 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:
 * Intel Corporation - Initial API and implementation
 *******************************************************************************/
package org.eclipse.cdt.internal.core.cdtvariables;

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

import org.eclipse.cdt.core.cdtvariables.CdtVariable;
import org.eclipse.cdt.core.settings.model.ICStorageElement;
import org.eclipse.cdt.utils.cdtvariables.CdtVariableResolver;

/**
 * This class represents the Build Macro that could be loaded
 * and stored in XML
 * 
 * @since 3.0
 *
 */
public class StorableCdtVariable extends CdtVariable {
	public static final String STRING_MACRO_ELEMENT_NAME = "stringMacro"; //$NON-NLS-1$
	public static final String STRINGLIST_MACRO_ELEMENT_NAME = "stringListMacro"; //$NON-NLS-1$
	public static final String NAME = "name"; //$NON-NLS-1$
	public static final String VALUE = "value"; //$NON-NLS-1$
	public static final String TYPE = "type"; //$NON-NLS-1$
	
	public static final String VALUE_ELEMENT_NAME = "value"; //$NON-NLS-1$
	public static final String VALUE_ELEMENT_VALUE = "name"; //$NON-NLS-1$
	
    public static final String TYPE_TEXT = "VALUE_TEXT"; //$NON-NLS-1$
    public static final String TYPE_TEXT_LIST = "VALUE_TEXT_LIST"; //$NON-NLS-1$
    public static final String TYPE_PATH_FILE = "VALUE_PATH_FILE"; //$NON-NLS-1$
    public static final String TYPE_PATH_FILE_LIST = "VALUE_PATH_FILE_LIST"; //$NON-NLS-1$
    public static final String TYPE_PATH_DIR = "VALUE_PATH_DIR"; //$NON-NLS-1$
    public static final String TYPE_PATH_DIR_LIST = "VALUE_PATH_DIR_LIST"; //$NON-NLS-1$
    public static final String TYPE_PATH_ANY = "VALUE_PATH_ANY"; //$NON-NLS-1$
    public static final String TYPE_PATH_ANY_LIST = "VALUE_PATH_ANY_LIST";  //$NON-NLS-1$
	
	public StorableCdtVariable(String name, int type, String value){
		super(name,type,value);
	}
	
	public StorableCdtVariable(String name, int type, String value[]){
		super(name,type,value);
	}

	public StorableCdtVariable(ICStorageElement element){
		load(element);
	}
	
	private void load(ICStorageElement element){
		fName = element.getAttribute(NAME);

		fType = typeStringToInt(element.getAttribute(TYPE));
		
		if(!CdtVariableResolver.isStringListVariable(fType))
			fStringValue = element.getAttribute(VALUE);
		else {
			ICStorageElement nodeList[] = element.getChildren();
			List<String> values = new ArrayList<String>();
			for (int i = 0; i < nodeList.length; ++i) {
				ICStorageElement node = nodeList[i];
				if (node.getName().equals(VALUE_ELEMENT_NAME)) {
					values.add(node.getAttribute(VALUE_ELEMENT_VALUE));
				}
			}
			fStringListValue = values.toArray(new String[values.size()]);
		}
	}
	
	private int typeStringToInt(String typeString){
		int type;
		
		if(TYPE_TEXT_LIST.equals(typeString))
			type = VALUE_TEXT_LIST;
		else if(TYPE_PATH_FILE.equals(typeString))
			type = VALUE_PATH_FILE;
		else if(TYPE_PATH_FILE_LIST.equals(typeString))
			type = VALUE_PATH_FILE_LIST;
		else if(TYPE_PATH_DIR.equals(typeString))
			type = VALUE_PATH_DIR;
		else if(TYPE_PATH_DIR_LIST.equals(typeString))
			type = VALUE_PATH_DIR_LIST;
		else if(TYPE_PATH_ANY.equals(typeString))
			type = VALUE_PATH_ANY;
		else if(TYPE_PATH_ANY_LIST.equals(typeString))
			type = VALUE_PATH_ANY_LIST;
		else
			type = VALUE_TEXT;
		
		return type;
	}
	
	private String typeIntToString(int type){
		String stringType;

		switch(type){
		case VALUE_TEXT_LIST:
			stringType = TYPE_TEXT_LIST;
			break;
		case VALUE_PATH_FILE:
			stringType = TYPE_PATH_FILE;
			break;
		case VALUE_PATH_FILE_LIST:
			stringType = TYPE_PATH_FILE_LIST;
			break;
		case VALUE_PATH_DIR:
			stringType = TYPE_PATH_DIR;
			break;
		case VALUE_PATH_DIR_LIST:
			stringType = TYPE_PATH_DIR_LIST;
			break;
		case VALUE_PATH_ANY:
			stringType = TYPE_PATH_ANY;
			break;
		case VALUE_PATH_ANY_LIST:
			stringType = TYPE_PATH_ANY_LIST;
			break;
		case VALUE_TEXT:
		default:
			stringType = TYPE_TEXT;
			break;
		}
		
		return stringType;
	}

	public void serialize(ICStorageElement element){
		if(fName != null)
			element.setAttribute(NAME,fName);
		
		element.setAttribute(TYPE,typeIntToString(fType));

		if(!CdtVariableResolver.isStringListVariable(fType)){
			if(fStringValue != null)
				element.setAttribute(VALUE,fStringValue);
		}
		else {
			if(fStringListValue != null && fStringListValue.length > 0){
				for(int i = 0; i < fStringListValue.length; i++){
					ICStorageElement valEl = element.createChild(VALUE_ELEMENT_NAME);
					if(fStringListValue[i] != null)
						valEl.setAttribute(VALUE_ELEMENT_VALUE, fStringListValue[i]);
				}
			}
		}

	}
}
