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;
using CommonLang;

namespace CommonAI.Zone.ZoneEditor.EventTrigger
{
    [DescAttribute("添加物品", "物品")]
    public class AddItemAction : AbstractAction
    {
        [DescAttribute("物品模板ID")]
        [TemplateIDAttribute(typeof(ItemTemplate))]
        public int ItemTemplateID = 0;
        [DescAttribute("名字")]
        public string Name = "";
        [DescAttribute("阵营")]
        public IntegerValue TargetForce = new IntegerValue.VALUE(0);
        [DescAttribute("位置")]
        public PositionValue Position = new PositionValue.VALUE();
        [DescAttribute("方向")]
        public RealValue Direction = new RealValue.VALUE();
        public override string ToString()
        {
            return string.Format("添加物品({0}-{1})到({2})", ItemTemplateID, Name, Position);
        }
        override public void DoAction(EventTriggerAdapter api, EventArguments args)
        {
            Vector2 pos = Position.GetValue(api, args);
            ItemTemplate temp = api.Templates.getItem(ItemTemplateID);
            if (pos != null && temp != null)
            {
                byte force = (byte)TargetForce.GetValue(api, args);
                float direction = Direction.GetValue(api, args);
                api.ZoneAPI.AddItem(temp, Name, pos.X, pos.Y, direction, force, null, null);
            }
        }
    }


    [DescAttribute("直接移除物品", "物品")]
    public class RemoveItemAction : AbstractAction
    {
        [DescAttribute("物品")]
        public ItemValue Item = new ItemValue.NamedItem();
        public override string ToString()
        {
            return string.Format("直接移除({0})", Item);
        }
        override public void DoAction(EventTriggerAdapter api, EventArguments args)
        {
            InstanceItem item = Item.GetValue(api, args);
            if (item != null)
            {
                api.ZoneAPI.RemoveObject(item);
            }
        }
    }



#region __物品组__



    [DescAttribute("遍历坐标半径范围内所有物品", "遍历物品组")]
    public class EveryRangedItemDoAction : AbstractAction
    {
        [DescAttribute("坐标")]
        public PositionValue Position = new PositionValue.VALUE();
        [DescAttribute("半径")]
        public float Range = 10f;
        [DescAttribute("动作")]
        public AbstractAction Action = new DoNoting();

        public override string ToString()
        {
            return string.Format("遍历坐标({0})半径({1})范围内的物品 DO {2}", Position, Range, Action);
        }
        override public void DoAction(EventTriggerAdapter api, EventArguments args)
        {
            Vector2 pos = Position.GetValue(api, args);
            if (pos != null)
            {
                using(var units = ListObjectPool<InstanceItem>.AllocAutoRelease())
                {
                    var args2 = args.Clone();
                    api.ZoneAPI.getObjectsRoundRange<InstanceItem>(
                         Collider.Object_Pos_IncludeInRound, pos.X, pos.Y, Range,
                         units , null);
                    foreach (InstanceItem u in units)
                    {
                        args2.IteratingItem = (u);
                        Action.DoAction(api, args2);
                        args2.IteratingItem = (null);
                    }
                }
            }

        }
    }

    [DescAttribute("遍历区域内所有物品", "遍历物品组")]
    public class EveryItemInRegionDoAction : AbstractAction
    {
        [DescAttribute("区域")]
        public FlagValue Region = new FlagValue.EditorRegion();

        [DescAttribute("动作")]
        public AbstractAction Action = new DoNoting();

        public override string ToString()
        {
            return string.Format("遍历区域({0})内的物品 DO {1}", Region, Action);
        }
        override public void DoAction(EventTriggerAdapter api, EventArguments args)
        {
            ZoneRegion region = Region.GetValue(api, args) as ZoneRegion;
            if (region != null)
            {
                using (var list = ListObjectPool<InstanceItem>.AllocAutoRelease())
                {
                    var args2 = args.Clone();
                    region.getObjectsInRegion<InstanceItem>(list);
                    foreach (InstanceItem u in list)
                    {
                        args2.IteratingItem = (u);
                        Action.DoAction(api, args2);
                        args2.IteratingItem = (null);
                    }
                }
            }

        }
    }



#endregion
}