using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using CommonLang.Property;
using CommonAI.Zone.Instance;
using CommonAI.Zone.Attributes;
using CommonAI.Zone.EventTrigger;
using CommonLang.Formula;
using CommonLang.Vector;

namespace CommonAI.Zone.ZoneEditor.EventTrigger
{
  
    [DescAttribute("小数点型")]
    public abstract class RealValue : AbstractValue<Single>
    {
        [DescAttribute("值", "值")]
        public class VALUE : RealValue
        {
            [DescAttribute("值")]
            public float Value = 20.00f;

            public VALUE() { }
            public VALUE(float value) { this.Value = value; }

            public override string ToString()
            {
                return Value + "";
            }
            public override Single GetValue(IEditorValueAdapter api, EventArguments args)
            {
                return Value;
            }
        }


        //------------------------------------------------------------------------------------------------------------

        #region __MathAndConverter__

        [DescAttribute("小数计算", "数学")]
        public class RealOP : RealValue
        {
            [DescAttribute("值1")]
            public RealValue Value1 = new RealValue.VALUE();
            [DescAttribute("运算符")]
            public NumericOP OP = NumericOP.ADD;
            [DescAttribute("值2")]
            public RealValue Value2 = new RealValue.VALUE();
            public override string ToString()
            {
                return string.Format("({0}) {1} ({2})", Value1, FormulaHelper.ToString(OP), Value2);
            }
            public override Single GetValue(IEditorValueAdapter api, EventArguments args)
            {
                float ret = FormulaHelper.Calculate(Value1.GetValue(api, args), OP, Value2.GetValue(api, args));
                return ret;
            }
        }

        [DescAttribute("函数-返回最小值", "数学")]
        public class MinFunction : RealValue
        {
            [DescAttribute("值1")]
            public RealValue Value1 = new RealValue.VALUE();
            [DescAttribute("值2")]
            public RealValue Value2 = new RealValue.VALUE();

            public override string ToString()
            {
                return string.Format("取{0}和{1}最小值", Value1, Value2);
            }
            public override Single GetValue(IEditorValueAdapter api, EventArguments args)
            {
                float v1 = Value1.GetValue(api, args);
                float v2 = Value2.GetValue(api, args);
                return Math.Min(v1, v2);
            }
        }

        [DescAttribute("函数-返回最大值", "数学")]
        public class MaxFunction : RealValue
        {
            [DescAttribute("值1")]
            public RealValue Value1 = new RealValue.VALUE();
            [DescAttribute("值2")]
            public RealValue Value2 = new RealValue.VALUE();

            public override string ToString()
            {
                return string.Format("取{0}和{1}最大值", Value1, Value2);
            }
            public override Single GetValue(IEditorValueAdapter api, EventArguments args)
            {
                float v1 = Value1.GetValue(api, args);
                float v2 = Value2.GetValue(api, args);
                return Math.Max(v1, v2);
            }
        }

        [DescAttribute("随机小数", "数学")]
        public class RandomReal : RealValue
        {
            public override string ToString()
            {
                return string.Format("介于0.0和1.0之间的随机数");
            }
            public override Single GetValue(IEditorValueAdapter api, EventArguments args)
            {
                return (float)api.ZoneAPI.RandomN.NextDouble();
            }
        }


        [DescAttribute("从整数转换", "转换")]
        public class ConvertFromInteger : RealValue
        {
            [DescAttribute("值")]
            public IntegerValue Value = new IntegerValue.VALUE();

            public override string ToString()
            {
                return string.Format("从{0}转换", Value);
            }
            public override Single GetValue(IEditorValueAdapter api, EventArguments args)
            {
                int value = Value.GetValue(api, args);
                return (float)value;
            }
        }

        [DescAttribute("从字符串转换", "转换")]
        public class ParseFromString : RealValue
        {
            [DescAttribute("值")]
            public StringValue Value = new StringValue.VALUE("1");

            public override string ToString()
            {
                return string.Format("从{0}转换", Value);
            }
            public override Single GetValue(IEditorValueAdapter api, EventArguments args)
            {
                string value = Value.GetValue(api, args);
                float ret = 0;
                float.TryParse(value, out ret);
                return ret;
            }
        }

        #endregion
        //------------------------------------------------------------------------------------------------------------
        #region __Attributes__

        [DescAttribute("场景用户自定义属性", "场景")]
        public class ZoneRealAttribute : RealValue
        {
            [DescAttribute("键值")]
            public string Key;
            public override string ToString()
            {
                return string.Format("场景键值[{0}]", Key);
            }
            public override Single GetValue(IEditorValueAdapter api, EventArguments args)
            {
                try
                {
                    return Single.Parse(api.ZoneAPI.GetAttribute(Key) as string);
                }
                catch (Exception err)
                {
					Console.WriteLine("ZoneRealAttribute : " + Key + ", catch: " + err);
				}
                return 0;
            }
        }

        [DescAttribute("单位用户自定义属性", "单位")]
        public class UnitRealAttribute : RealValue
        {
            [DescAttribute("单位")]
            public UnitValue Unit = new UnitValue.Trigging();
            [DescAttribute("键值")]
            public string Key;
            public override string ToString()
            {
                return string.Format("单位({0})键值[{1}]", Unit, Key);
            }
            public override Single GetValue(IEditorValueAdapter api, EventArguments args)
            {
                InstanceUnit unit = Unit.GetValue(api, args);
                if (unit != null)
                {
                    try
                    {
                        return Single.Parse(unit.GetAttribute(Key) as string);
                    }
                    catch (Exception err)
                    {
						Console.WriteLine("UnitRealAttribute : " + Key + ", catch: " + err);
					}
                    return 0;
                }
                return 0;
            }
        }

        #endregion
        //------------------------------------------------------------------------------------------------------------

        #region __TowUnit__

        [DescAttribute("获得两个单位的夹角(弧度)", "2单位")]
        public class GetTowUnitAngle : RealValue
        {
            [DescAttribute("单位A")]
            public UnitValue UnitA = new UnitValue.Trigging();
            [DescAttribute("单位B")]
            public UnitValue UnitB = new UnitValue.Trigging();

            public override string ToString()
            {
                return string.Format("GetDirect({0}, {1})", UnitA, UnitB);
            }
            public override Single GetValue(IEditorValueAdapter api, EventArguments args)
            {
                InstanceUnit a = UnitA.GetValue(api, args);
                InstanceUnit b = UnitB.GetValue(api, args);
                if (a != null && b!=null)
                {
                    return MathVector.getDegree(a.X, a.Y, b.X, b.Y);
                }
                return 0;
            }
        }
        [DescAttribute("获得两个单位的距离", "2单位")]
        public class GetTowUnitDistance : RealValue
        {
            [DescAttribute("单位A")]
            public UnitValue UnitA = new UnitValue.Trigging();
            [DescAttribute("单位B")]
            public UnitValue UnitB = new UnitValue.Trigging();

            public override string ToString()
            {
                return string.Format("GetDistance({0}, {1})", UnitA, UnitB);
            }
            public override Single GetValue(IEditorValueAdapter api, EventArguments args)
            {
                InstanceUnit a = UnitA.GetValue(api, args);
                InstanceUnit b = UnitB.GetValue(api, args);
                if (a != null && b != null)
                {
                    return MathVector.getDistance(a.X, a.Y, b.X, b.Y);
                }
                return 0;
            }
        }

        #endregion
    }


}