using System;
using System.Collections.Generic;
using System.Collections;
using System.Text;

using FormulaEditor;
using DiagramUI;

namespace DataPerformer
{
    /// <summary>
    /// Measurement
    /// </summary>
    public class Measure : IMeasure
    {

        /// <summary>
        /// Names of types
        /// </summary>
        public static readonly string[] TypeNames = {"Double", "Boolean", "Byte", "UInt16", "UInt32", "UInt64", "SByte",
														"Int16", "Int32", "Int64", "String"};


        /// <summary>
        /// Measurement parameter
        /// </summary>
        private MeasureParameter parameter;

        /// <summary>
        /// Measurement parameter time derivation
        /// </summary>
        //private MeasureParameter derivation;

        /// <summary>
        /// Measurement name
        /// </summary>
        private string name;

        /// <summary>
        /// Factor
        /// </summary>
        //private double factor = 1;


        /// <summary>
        /// Type of parameter
        /// </summary>
        private object type;

        private static readonly Double a = 0;

        /// <summary>
        /// Constructor
        /// </summary>
        /// <param name="type">Type of parameter</param>
        /// <param name="parameter">Measurement parameter</param>
        /// <param name="derivation">Measurement parameter time derivation</param>
        /// <param name="name">Measurement name</param>
        public Measure(object type, MeasureParameter parameter, string name)
        {
            this.parameter = parameter;
            this.name = name;
            this.type = type;
        }

        public Measure(MeasureParameter parameter, string name)
            :
            this(a, parameter, name)
        {
            Double a = 0;
        }


        /// <summary>
        /// Parameter of measurement
        /// </summary>
        public MeasureParameter Parameter
        {
            get
            {
                return parameter;
            }
        }

        /// <summary>
        /// Type of parameter
        /// </summary>
        public object Type
        {
            get
            {
                return type;
            }
        }

        /// <summary>
        /// The measurement name
        /// </summary>
        public string Name
        {
            get
            {
                return name;
            }
        }

  
        public static string GetTypeName(object type)
        {
            string str = "";
            object t = ArrayReturnType.GetBaseType(type);
            if (t is Double)
            {
                str = "Double";
            }
            if (t is Boolean)
            {
                str = "Boolean";
            }
            if (t is Byte)
            {
                str = "Byte";
            }
            if (t is UInt16)
            {
                str = "UInt16";
            }
            if (t is UInt32)
            {
                str = "UInt32";
            }
            if (t is UInt64)
            {
                str = "UInt64";
            }
            if (t is SByte)
            {
                str = "SByte";
            }
            if (t is Int16)
            {
                str = "Int16";
            }
            if (t is Int32)
            {
                str = "Int32";
            }
            if (t is Int64)
            {
                str = "Int64";
            }
            if (t is string)
            {
                str = "String";
            }
            if (type is ArrayReturnType)
            {
                str = PureDesktop.GetResourceString(str);
                ArrayReturnType art = type as ArrayReturnType;
                int[] n = art.Dimension;
                for (int i = n.Length - 1; i >= 0; i--)
                {
                    str = str + "[" + n[i] + "]";
                }
                return str;
            }
            return PureDesktop.GetResourceString(str);
        }

        public static object GetType(string s)
        {
            for (int i = 0; i < TypeNames.Length; i++)
            {
                if (TypeNames[i].Equals(s))
                {
                    return ElementaryBinaryOperation.Types[i];
                }
            }
            return 0;
        }
    }
}
