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

namespace CommonAI.Zone.ZoneEditor.EventTrigger
{
    [DescAttribute("Flag开启(包括空气墙)", "Flag")]
    public class FlagOpenedTrigger : AbstractTrigger
    {
        [DescAttribute("Flag")]
        public FlagValue Flag = new FlagValue.NA();

        public override string ToString()
        {
            return string.Format("当({0})开启时", Flag);
        }
        public override void Listen(EventTriggerAdapter api, EventArguments args)
        {
            InstanceFlag flag = Flag.GetValue(api, args);
            if (flag != null)
            {
                //flag.OnFlagEnabled += api.onFlagOpened;
                api.listen_FlagOpened(args, flag);
            }
        }
    }

    [DescAttribute("Flag关闭(包括空气墙)", "Flag")]
    public class FlagClosedTrigger : AbstractTrigger
    {
        [DescAttribute("Flag")]
        public FlagValue Flag = new FlagValue.NA();

        public override string ToString()
        {
            return string.Format("当({0})关闭时", Flag);
        }
        public override void Listen(EventTriggerAdapter api, EventArguments args)
        {
            InstanceFlag flag = Flag.GetValue(api, args);
            if (flag != null)
            {
                //flag.OnFlagEnabled += api.onFlagClosed;
                api.listen_FlagClosed(args, flag);
            }
        }
    }
    //-------------------------------------------------------------------------------------------
    #region __区域事件__



    [DescAttribute("单位进入区域", "区域")]
    public class UnitEnterRegion : AbstractTrigger
    {
        [DescAttribute("区域")]
        public FlagValue.EditorRegion Region = new FlagValue.EditorRegion();
        public override string ToString()
        {
            return string.Format("当单位进入({0})", Region);
        }
        public override void Listen(EventTriggerAdapter api, EventArguments args)
        {
            ZoneRegion region = Region.GetValue(api, args) as ZoneRegion;
            if (region != null)
            {
                api.listen_RegionEntered(args, region);
            }
        }
    }
    [DescAttribute("单位离开区域", "区域")]
    public class UnitLeaveRegion : AbstractTrigger
    {
        [DescAttribute("区域")]
        public FlagValue.EditorRegion Region = new FlagValue.EditorRegion();
        public override string ToString()
        {
            return string.Format("当单位离开({0})", Region);
        }
        public override void Listen(EventTriggerAdapter api, EventArguments args)
        {
            ZoneRegion region = Region.GetValue(api, args) as ZoneRegion;
            if (region != null)
            {
                api.listen_RegionLeft(args, region);
            }
        }
    }

    [DescAttribute("区域刷新单位结束", "区域 - 刷新点")]
    public class SpawnUnitRegionIsDone : AbstractTrigger
    {
        [DescAttribute("区域")]
        public FlagValue.EditorRegion Region = new FlagValue.EditorRegion();
        public override string ToString()
        {
            return string.Format("当({0})单位刷新结束时", Region);
        }
        public override void Listen(EventTriggerAdapter api, EventArguments args)
        {
            ZoneRegion region = Region.GetValue(api, args) as ZoneRegion;
            if (region != null)
            {
                api.listen_RegionSpawnOver(args, region);
            }
        }
    }



    [DescAttribute("指定单位进入区域一次", "区域")]
    public class UnitEnterRegionOnce : AbstractTrigger
    {
        [DescAttribute("单位")]
        public UnitValue Unit = new UnitValue.Trigging();
        [DescAttribute("区域")]
        public FlagValue.EditorRegion Region = new FlagValue.EditorRegion();
   
        public override string ToString()
        {
            return string.Format("({0})进入({1})一次", Unit, Region);
        }
        public override void Listen(EventTriggerAdapter api, EventArguments args)
        {
            ZoneRegion region = Region.GetValue(api, args) as ZoneRegion;
            InstanceUnit unit = Unit.GetValue(api, args);
            if (region != null && unit != null)
            {
                args = args.Clone();
                region.ListenUnitEnterOnce(unit, (r, u) =>
                {
                    args.TriggingFlag = r;
                    args.TriggingUnit = u;
                    api.TestAndDoAction(args);
                });
            }
        }
    }
    [DescAttribute("指定单位离开区域一次", "区域")]
    public class UnitLeaveRegionOnce : AbstractTrigger
    {
        [DescAttribute("单位")]
        public UnitValue Unit = new UnitValue.Trigging();
        [DescAttribute("区域")]
        public FlagValue.EditorRegion Region = new FlagValue.EditorRegion();

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



    #endregion
    //-------------------------------------------------------------------------------------------
    #region __Area事件__


    [DescAttribute("单位进入Area", "Area")]
    public class UnitEnterArea : AbstractTrigger
    {
        [DescAttribute("Area")]
        public FlagValue.EditorArea Area = new FlagValue.EditorArea();

        public override string ToString()
        {
            return string.Format("当单位进入({0})", Area);
        }
        public override void Listen(EventTriggerAdapter api, EventArguments args)
        {
            ZoneArea region = Area.GetValue(api, args) as ZoneArea;
            if (region != null)
            {
                api.listen_AreaEntered(args, region);
            }
        }
    }
    [DescAttribute("单位离开Area", "Area")]
    public class UnitLeaveArea : AbstractTrigger
    {
        [DescAttribute("Area")]
        public FlagValue.EditorArea Area = new FlagValue.EditorArea();

        public override string ToString()
        {
            return string.Format("当单位离开({0})", Area);
        }
        public override void Listen(EventTriggerAdapter api, EventArguments args)
        {
            ZoneArea region = Area.GetValue(api, args) as ZoneArea;
            if (region != null)
            {
                api.listen_AreaLeft(args, region);
            }
        }
    }

    [DescAttribute("指定单位进入Area一次", "区域")]
    public class UnitEnterAreaOnce : AbstractTrigger
    {
        [DescAttribute("单位")]
        public UnitValue Unit = new UnitValue.Trigging();
        [DescAttribute("Area")]
        public FlagValue.EditorArea Area = new FlagValue.EditorArea();

        public override string ToString()
        {
            return string.Format("({0})进入({1})一次", Unit, Area);
        }
        public override void Listen(EventTriggerAdapter api, EventArguments args)
        {
            ZoneArea area = Area.GetValue(api, args) as ZoneArea;
            InstanceUnit unit = Unit.GetValue(api, args);
            if (area != null && unit != null)
            {
                args = args.Clone();
                area.ListenUnitEnterOnce(unit, (r, u) =>
                {
                    args.TriggingFlag = r;
                    args.TriggingUnit = u;
                    api.TestAndDoAction(args);
                });
            }
        }
    }
    [DescAttribute("指定单位离开Area一次", "区域")]
    public class UnitLeaveAreaOnce : AbstractTrigger
    {
        [DescAttribute("单位")]
        public UnitValue Unit = new UnitValue.Trigging();
        [DescAttribute("Area")]
        public FlagValue.EditorArea Area = new FlagValue.EditorArea();

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

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