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


namespace CommonAI.Zone.ZoneEditor.EventTrigger
{

    [DescAttribute("单位 - 某个单位")]
    public abstract class UnitValue : AbstractValue<InstanceUnit>
    {
        [DescAttribute("值 - 没有单位", "值")]
        public class NA : UnitValue
        {
            public override string ToString()
            {
                return "没有单位";
            }
            public override InstanceUnit GetValue(IEditorValueAdapter api, EventArguments args)
            {
                return null;
            }
        }

        [DescAttribute("(废弃)遍历迭代中的 - 单位", "(废弃)")]
        public class PickedUnit : UnitValue
        {
            public override string ToString()
            {
                return "遍历迭代中的单位";
            }
            public override InstanceUnit GetValue(IEditorValueAdapter api, EventArguments args)
            {
                return args.IteratingUnit;
            }
        }
        [DescAttribute("遍历迭代中的 - 单位", "循环迭代")]
        public class PickingIteratingUnit : UnitValue
        {
            public override string ToString()
            {
                return "遍历迭代中的单位";
            }
            public override InstanceUnit GetValue(IEditorValueAdapter api, EventArguments args)
            {
                return args.IteratingUnit;
            }
        }


        [DescAttribute("编辑器 - 单位", "编辑器")]
        public class Editor : UnitValue
        {
            [DescAttribute("场景中的名字")]
            [SceneObjectIDAttribute(typeof(UnitData))]
            public string EditorName;
            public override string ToString()
            {
                return "单位:" + EditorName;
            }
            public override InstanceUnit GetValue(IEditorValueAdapter api, EventArguments args)
            {
                return api.ZoneAPI.get_edit_unit(EditorName) as InstanceUnit;
            }
        }

        [DescAttribute("功能 - 触发的单位", "功能")]
        public class Trigging : UnitValue
        {
            public override string ToString()
            {
                return "触发的单位";
            }
            public override InstanceUnit GetValue(IEditorValueAdapter api, EventArguments args)
            {
                return args.TriggingUnit;
            }
        }

        [DescAttribute("功能 - 最后添加的单位", "功能")]
        public class LastAdded : UnitValue
        {
            public override string ToString()
            {
                return "最后添加的单位";
            }
            public override InstanceUnit GetValue(IEditorValueAdapter api, EventArguments args)
            {
                return api.ZoneAPI.LastAddedUnit;
            }
        }
        [DescAttribute("功能 - 最后激活的单位", "功能")]
        public class LastActivated : UnitValue
        {
            public override string ToString()
            {
                return "最后激活的单位";
            }
            public override InstanceUnit GetValue(IEditorValueAdapter api, EventArguments args)
            {
                return api.ZoneAPI.LastActivatedUnit;
            }
        }
        [DescAttribute("功能 - 最后复活的单位", "功能")]
        public class LastRebirth : UnitValue
        {
            public override string ToString()
            {
                return "最后复活的单位";
            }
            public override InstanceUnit GetValue(IEditorValueAdapter api, EventArguments args)
            {
                return api.ZoneAPI.LastRebirthUnit;
            }
        }

        [DescAttribute("功能 - 最后发动攻击的单位", "功能")]
        public class LastAttack : UnitValue
        {
            public override string ToString()
            {
                return "最后发动攻击的单位";
            }
            public override InstanceUnit GetValue(IEditorValueAdapter api, EventArguments args)
            {
                return api.ZoneAPI.LastAttackUnit;
            }
        }

        [DescAttribute("功能 - 发动攻击的单位", "功能")]
        public class AttackUnit : UnitValue
        {
            public override string ToString()
            {
                return "发动攻击的单位";
            }
            public override InstanceUnit GetValue(IEditorValueAdapter api, EventArguments args)
            {
                return args.AttackUnit;
            }
        }

        [DescAttribute("功能 - 最后被打的单位", "功能")]
        public class LastHitted : UnitValue
        {
            public override string ToString()
            {
                return "最后被打的单位";
            }
            public override InstanceUnit GetValue(IEditorValueAdapter api, EventArguments args)
            {
                return api.ZoneAPI.LastHittedUnit;
            }
        }
        [DescAttribute("功能 - 最后被杀死的单位", "功能")]
        public class LastKilled : UnitValue
        {
            public override string ToString()
            {
                return "最后被杀死的单位";
            }
            public override InstanceUnit GetValue(IEditorValueAdapter api, EventArguments args)
            {
                return api.ZoneAPI.LastKilledUnit;
            }
        }

        [DescAttribute("场景 - 随机单位", "场景")]
        public class RandomUnit : UnitValue
        {
            public override string ToString()
            {
                return "随机单位";
            }
            public override InstanceUnit GetValue(IEditorValueAdapter api, EventArguments args)
            {
                return api.ZoneAPI.selectRandomUnit<InstanceUnit>((InstanceUnit unit) => 
                { 
                    return true; 
                });
            }
        }

        [DescAttribute("场景 - 随机阵营单位", "场景")]
        public class RandomForceUnit : UnitValue
        {
            [DescAttribute("阵营")]
            public IntegerValue Force = new IntegerValue.VALUE(0);
            public override string ToString()
            {
                return string.Format("阵营{0}随机单位", Force);
            }
            public override InstanceUnit GetValue(IEditorValueAdapter api, EventArguments args)
            {
                int force = Force.GetValue(api, args);
                return api.ZoneAPI.selectRandomUnit<InstanceUnit>((InstanceUnit unit) => 
                {
                    return unit.Force == force;
                });
            }
        }


        [DescAttribute("检取物品中的单位", "功能")]
        public class LastPickingItemUnit : UnitValue
        {
            public override string ToString()
            {
                return string.Format("检取物品中的单位");
            }
            public override InstanceUnit GetValue(IEditorValueAdapter api, EventArguments args)
            {
                return api.ZoneAPI.LastPickingItemUnit;
            }
        }

        [DescAttribute("最后被点选的单位", "功能")]
        public class LastPickableUnit : UnitValue
        {
            public override string ToString()
            {
                return string.Format("最后被点选的单位");
            }
            public override InstanceUnit GetValue(IEditorValueAdapter api, EventArguments args)
            {
                return api.ZoneAPI.LastPickableUnit;
            }
        }


        [DescAttribute("最后释放的技能的单位", "功能")]
        public class LastLaunchSkillUnit : UnitValue
        {
            public override string ToString()
            {
                return string.Format("最后释放的技能的单位");
            }
            public override InstanceUnit GetValue(IEditorValueAdapter api, EventArguments args)
            {
                return api.ZoneAPI.LastLaunchSkillUnit;
            }
        }


        [DescAttribute("指定名字的单位", "功能")]
        public class NamedUnit : UnitValue
        {
            [DescAttribute("名字")]
            public StringValue Name = new StringValue.VALUE();
            public override string ToString()
            {
                return string.Format("名字为\"{0}\"的单位", Name);
            }
            public override InstanceUnit GetValue(IEditorValueAdapter api, EventArguments args)
            {
                return api.ZoneAPI.getUnitByName(Name.GetValue(api, args));
            }
        }

        [DescAttribute("指定ID的单位", "功能")]
        public class PointTemplateIDUnit : UnitValue
        {
            [DescAttribute("模板ID")]
            public int templateIOd = 0;
            public override string ToString()
            {
                return string.Format("ID为\"{0}\"的单位", templateIOd);
            }
            public override InstanceUnit GetValue(IEditorValueAdapter api, EventArguments args)
            {
                return api.ZoneAPI.getUnitByTemplateID(templateIOd);
            }
        }


        [DescAttribute("绑定的单位", "单位触发器")]
        public class UnitAPI : UnitValue
        {
            public override string ToString()
            {
                return string.Format("单位触发器绑定的单位");
            }
            public override InstanceUnit GetValue(IEditorValueAdapter api, EventArguments args)
            {
                return api.UnitAPI;
            }
        }
    }

}