/**
 * <copyright>
 * 
 * Copyright (c) 2009-2010 Thales Corporate Services S.A.S.
 * 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:
 * Thales Corporate Services S.A.S - initial API and implementation
 * 
 * </copyright>
 */
package org.eclipse.egf.portfolio.task.ant.engine;

import java.math.BigDecimal;
import java.math.BigInteger;
import java.text.SimpleDateFormat;
import java.util.Date;

import org.apache.tools.ant.Project;
import org.apache.tools.ant.util.StringUtils;
import org.eclipse.core.commands.ExecutionException;
import org.eclipse.emf.common.util.URI;

public class DataConvert {
    // simplest case - setAttribute expects String
    public final static String TYPE_String = "type:string";

    // setAttribute expects Integer
    public final static String TYPE_Integer = "type:integer";

    // setAttribute expects BigInteger
    public final static String TYPE_BigInteger = "type:biginteger";

    // setAttribute expects BigDecimal
    public final static String TYPE_BigDecimal = "type:bigdecimal";

    // setAttribute expects Float
    public final static String TYPE_Float = "type:float";

    // setAttribute expects Byte
    public final static String TYPE_Byte = "type:byte";

    // setAttribute expects Short
    public final static String TYPE_Short = "type:short";

    // setAttribute expects Double
    public final static String TYPE_Double = "type:double";

    // setAttribute expects Long
    public final static String TYPE_Long = "type:long";

    // char and Character get special treatment - take the first character
    public final static String TYPE_Character = "type:character";

    // boolean and Boolean get special treatment
    public final static String TYPE_Boolean = "type:boolean";

    // setAttribute expects BigDecimal
    public final static String TYPE_Date = "type:date";

    // setAttribute expects URI
    public final static String TYPE_URI = "type:uri";

    /**
     * Creates an implementation of AttributeSetter for the given
     * attribute type. Conversions (where necessary) are automatically
     * made for the following types:(When there is no type mapping, throw
     * exception).
     * <ul>
     * <li>String (left as it is)
     * <li>Character (first character is used)
     * <li>Boolean ({@link Project#toBoolean(String)
     * Project.toBoolean(String)} is used)
     * <li>Long
     * <li>Integer
     * <li>BigInteger
     * <li>BigDecimal
     * <li>Float
     * <li>Byte
     * <li>Double
     * <li>Date (java.util.Date)
     * <li>URI (org.eclipse.emf.common.util.URI)
     * </ul>
     */
    public static Object getConvertVaule(String type, String value) throws Exception {

        type = type.toLowerCase();

        if (TYPE_String.equals(type)) {
            return value;
        }

        if (TYPE_Long.equals(type)) {
            Long longValue = new Long(StringUtils.parseHumanSizes(value));
            return longValue;
        }

        if (TYPE_Integer.equals(type)) {
            Integer integerValue = Integer.valueOf(value);
            return integerValue;
        }

        if (TYPE_BigInteger.equals(type)) {
            BigInteger bigIntegerValue = BigInteger.valueOf(new Long(StringUtils.parseHumanSizes(value)));
            return bigIntegerValue;
        }

        if (TYPE_BigDecimal.equals(type)) {
            BigDecimal bigIntegerValue = new BigDecimal(value);
            return bigIntegerValue;
        }

        if (TYPE_Float.equals(type)) {
            Float floatValue = Float.valueOf(value);
            return floatValue;
        }

        if (TYPE_Byte.equals(type)) {
            Byte byteValue = Byte.valueOf(value);
            return byteValue;
        }

        if (TYPE_Short.equals(type)) {
            Short shortValue = Short.valueOf(value);
            return shortValue;
        }

        if (TYPE_Double.equals(type)) {
            Double doubleValue = Double.valueOf(value);
            return doubleValue;
        }

        if (TYPE_Boolean.equals(type)) {
            Boolean booleanValue = Project.toBoolean(value) ? Boolean.TRUE : Boolean.FALSE;
            return booleanValue;
        }

        if (TYPE_Character.equals(type)) {
            Character characterValue = new Character(value.charAt(0));
            return characterValue;
        }

        if (TYPE_Date.equals(type)) {
            SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd");
            Date dateValue = simpleDateFormat.parse(value.replace("/", "-"));
            return dateValue;
        }

        if (TYPE_URI.equals(type)) {
            URI uriValue = URI.createURI(value);
            return uriValue;
        }

        throw new ExecutionException("It dosen't support to rewriting the contract with the type:\'" + type + "\' in ant script directly, please rewrite it in the task class.");
    }

    /**
     * Get the Class<?> for the given attribute type.Conversions (where
     * necessary) are automatically made for the following Class<?>:(When there
     * is no type mapping, throw exception).
     * <ul>
     * <li>String.class
     * <li>Character.class
     * <li>Boolean.class
     * <li>Long.class
     * <li>Integer.class
     * <li>BigInteger.class (java.math.BigInteger)
     * <li>BigDecimal.class (java.math.BigDecimal)
     * <li>Float.class
     * <li>Byte.class
     * <li>Double.class
     * <li>Date.class
     * <li>URI.class (org.eclipse.emf.common.util.URI)
     * </ul>
     */
    public static Class<?> getType(String type) throws Exception {

        type = type.toLowerCase();

        if (TYPE_String.equals(type)) {
            return String.class;
        }

        if (TYPE_Long.equals(type)) {
            return Long.class;
        }

        if (TYPE_Integer.equals(type)) {
            return Integer.class;
        }

        if (TYPE_BigInteger.equals(type)) {
            return BigInteger.class;
        }

        if (TYPE_BigDecimal.equals(type)) {
            return BigDecimal.class;
        }

        if (TYPE_Float.equals(type)) {
            return Float.class;
        }

        if (TYPE_Byte.equals(type)) {
            return Byte.class;
        }

        if (TYPE_Short.equals(type)) {
            return Short.class;
        }

        if (TYPE_Double.equals(type)) {
            return Double.class;
        }

        if (TYPE_Boolean.equals(type)) {
            return Boolean.class;
        }

        if (TYPE_Character.equals(type)) {
            return Character.class;
        }

        if (TYPE_Date.equals(type)) {
            return Date.class;
        }

        if (TYPE_URI.equals(type)) {
            return URI.class;
        }

        throw new ExecutionException("It dosen't support to read the contract with the type:\'" + type + "\' in ant script directly, please read it in the task class.");
    }
}
