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

using CommonAI.RTS; using CommonLang.Vector;
using CommonAI.Zone.Instance;
using CommonAI.Zone.EventTrigger;

namespace CommonAI.Zone.ZoneEditor.EventTrigger
{

    [DescAttribute("关闭Flag(包括空气墙)", "Flag")]
    public class FlagCloseAction : AbstractAction
    {
        [DescAttribute("Flag")]
        public FlagValue Flag = new FlagValue.EditorPoint();
        public override string ToString()
        {
            return string.Format("关闭({0})", Flag);
        }
        override public void DoAction(EventTriggerAdapter api, EventArguments args)
        {
            InstanceFlag flag = Flag.GetValue(api, args);
            if (flag != null)
            {
                flag.set_enable(false);
            }
        }
    }

    [DescAttribute("开启Flag(包括空气墙)", "Flag")]
    public class FlagOpenAction : AbstractAction
    {
        [DescAttribute("Flag")]
        public FlagValue Flag = new FlagValue.EditorPoint();
        public override string ToString()
        {
            return string.Format("开启({0})", Flag);
        }
        override public void DoAction(EventTriggerAdapter api, EventArguments args)
        {
            InstanceFlag flag = Flag.GetValue(api, args);
            if (flag != null)
            {
                flag.set_enable(true);
            }
        }
    }

    [DescAttribute("设置Flag的Tag", "Flag")]
    public class FlagTagAction : AbstractAction
    {
        [DescAttribute("Flag")]
        public FlagValue Flag = new FlagValue.EditorPoint();
        [DescAttribute("Tag")]
        public StringValue Tag = new StringValue.NULL();

        public override string ToString()
        {
            return string.Format("{0}.Tag={1}", Flag, Tag);
        }
        override public void DoAction(EventTriggerAdapter api, EventArguments args)
        {
            var flag = Flag.GetValue(api, args);
            var tag = Tag.GetValue(api, args);
            if (flag != null)
            {
                flag.Tag = tag;
            }
        }
    }



    [DescAttribute("当指定单位进入区域一次DO", "Flag")]
    public class WhenUnitEnterRegionOnceDo : AbstractAction
    {
        [DescAttribute("单位")]
        public UnitValue Unit = new UnitValue.Trigging();
        [DescAttribute("区域")]
        public FlagValue Region = new FlagValue.EditorRegion();
        [DescAttribute("动作")]
        public AbstractAction Action = new DoNoting();

        public override string ToString()
        {
            return string.Format("WHEN ({0})进入({1})一次 DO ({2})", Unit, Region, Action);
        }
        public override void DoAction(EventTriggerAdapter api, EventArguments args)
        {
            ZoneRegion region = Region.GetValue(api, args) as ZoneRegion;
            InstanceUnit unit = Unit.GetValue(api, args);
            if (region != null && unit != null)
            {
                var args2 = args.Clone();
                region.ListenUnitEnterOnce(unit, (r, u) =>
                {
                    args2.TriggingFlag = r;
                    args2.TriggingUnit = u;
                    Action.DoAction(api, args2);
                });
            }
        }
    }
    [DescAttribute("当指定单位离开区域一次DO", "Flag")]
    public class WhenUnitLeaveRegionOnceDo : AbstractAction
    {
        [DescAttribute("单位")]
        public UnitValue Unit = new UnitValue.Trigging();
        [DescAttribute("区域")]
        public FlagValue Region = new FlagValue.EditorRegion();
        [DescAttribute("动作")]
        public AbstractAction Action = new DoNoting();

        public override string ToString()
        {
            return string.Format("WHEN ({0})离开({1})一次 DO ({2})", Unit, Region, Action);
        }
        public override void DoAction(EventTriggerAdapter api, EventArguments args)
        {
            ZoneRegion region = Region.GetValue(api, args) as ZoneRegion;
            InstanceUnit unit = Unit.GetValue(api, args);
            if (region != null && unit != null)
            {
                var args2 = args.Clone();
                region.ListenUnitLeaveOnce(unit, (r, u) =>
                {
                    args2.TriggingFlag = r;
                    args2.TriggingUnit = u;
                    Action.DoAction(api, args2);
                });
            }
        }
    }


    [DescAttribute("当指定单位进入Area一次DO", "Flag")]
    public class WhenUnitEnterAreaOnceDo : AbstractAction
    {
        [DescAttribute("单位")]
        public UnitValue Unit = new UnitValue.Trigging();
        [DescAttribute("Area")]
        public FlagValue Area = new FlagValue.EditorArea();
        [DescAttribute("动作")]
        public AbstractAction Action = new DoNoting();

        public override string ToString()
        {
            return string.Format("WHEN ({0})进入({1})一次 DO ({2})", Unit, Area, Action);
        }
        public override void DoAction(EventTriggerAdapter api, EventArguments args)
        {
            var area = Area.GetValue(api, args) as ZoneArea;
            var unit = Unit.GetValue(api, args);
            if (area != null && unit != null)
            {
                var args2 = args.Clone();
                area.ListenUnitEnterOnce(unit, (r, u) =>
                {
                    args2.TriggingFlag = r;
                    args2.TriggingUnit = u;
                    Action.DoAction(api, args2);
                });
            }
        }
    }
    [DescAttribute("当指定单位离开Area一次DO", "Flag")]
    public class WhenUnitLeaveAreaOnceDo : AbstractAction
    {
        [DescAttribute("单位")]
        public UnitValue Unit = new UnitValue.Trigging();
        [DescAttribute("Area")]
        public FlagValue Area = new FlagValue.EditorArea();
        [DescAttribute("动作")]
        public AbstractAction Action = new DoNoting();

        public override string ToString()
        {
            return string.Format("WHEN ({0})离开({1})一次 DO ({2})", Unit, Area, Action);
        }
        public override void DoAction(EventTriggerAdapter api, EventArguments args)
        {
            var area = Area.GetValue(api, args) as ZoneArea;
            var unit = Unit.GetValue(api, args);
            if (area != null && unit != null)
            {
                var args2 = args.Clone();
                area.ListenUnitLeaveOnce(unit, (r, u) =>
                {
                    args2.TriggingFlag = r;
                    args2.TriggingUnit = u;
                    Action.DoAction(api, args2);
                });
            }
        }
    }

}