using CommonAI.Zone.Attributes;
using CommonAI.Zone.EventTrigger;
using CommonAI.Zone.Helper;
using CommonAI.Zone.Instance;
using CommonLang.Property;
using CommonLang.Vector;
using System;
using System.Collections.Generic;

namespace CommonAI.Zone.ZoneEditor.EventTrigger
{

    [DescAttribute("发送系统聊天消息", "场景")]
    public class SendChatMessage : AbstractAction
    {
        [DescAttribute("消息")]
        public StringValue Message = new StringValue.VALUE("你好世界!");
        [DescAttribute("消息类型")]
        public ChatMessageType SendTo = ChatMessageType.SystemToAll;
        [DescAttribute("持续时间(毫秒)")]
        public uint KeepTimeMS = 2000;

        [DescAttribute("预计发送的阵营", "可选")]
        public IntegerValue ToForce = new IntegerValue.VALUE(0);
        [DescAttribute("预计发送的单位", "可选")]
        public UnitValue ToPlayer = new UnitValue.NA();
        public override string ToString()
        {
            return string.Format("发送聊天消息: \"{0}\"", Message);
        }
        override public void DoAction(EventTriggerAdapter api, EventArguments args)
        {
            string msg = Message.GetValue(api, args);
            if (!string.IsNullOrEmpty(msg))
            {
                ChatEvent chat = new ChatEvent(SendTo, KeepTimeMS);
                chat.Message = msg;
                chat.To = SendTo;
                switch (SendTo)
                {
                    case ChatMessageType.SystemToPlayer:
                        InstancePlayer target = ToPlayer.GetValue(api, args) as InstancePlayer;
                        if (target == null)
                        {
                            break;
                        }
                        chat.ToPlayerUUID = target.PlayerUUID;
                        #region <<判断演绎位面>>
                        if (target.isTeamMemberAndFollow())
                        {
                            return;
                        }
                        var evt_param = msg.Split('|');
                        if (evt_param.Length == 2)
                        {
                            var e = evt_param[0];
                            var p = evt_param[1].Split(',');
                            if (e == "Drama.Start" && p.Length > 1 && p[1] == "AOI")
                            {
                                if (!target.IsRobot)
                                {
                                    target.setAoiStatus(new DarmaAOI(p[0]));
                                }
                            }
                        }
                        #endregion
                        break;
                    case ChatMessageType.SystemToForce:
                        chat.Force = (byte)ToForce.GetValue(api, args);
                        break;
                    case ChatMessageType.SystemToAll:
                        break;
                }
                api.ZoneAPI.queueEvent(chat);
            }
        }
    }

    [DescAttribute("游戏结束", "场景")]
    public class GameOverAction : AbstractAction
    {
        [DescAttribute("胜利方")]
        public IntegerValue WinForce = new IntegerValue.VALUE(0);
        [DescAttribute("消息")]
        public string Message;
        public override string ToString()
        {
            return string.Format("游戏结束 胜利方:{0} 消息:\"{1}\"", WinForce, Message);
        }
        override public void DoAction(EventTriggerAdapter api, EventArguments args)
        {
            api.ZoneAPI.send_game_over(WinForce.GetValue(api, args), Message);
        }
    }
    [DescAttribute("游戏结束(变量)", "场景")]
    public class GameOverActionVar : AbstractAction
    {
        [DescAttribute("胜利方")]
        public IntegerValue WinForce = new IntegerValue.VALUE(0);
        [DescAttribute("消息")]
        public StringValue Message = new StringValue.VALUE("");
        public override string ToString()
        {
            return string.Format("游戏结束 胜利方:{0} 消息:\"{1}\"", WinForce, Message);
        }
        override public void DoAction(EventTriggerAdapter api, EventArguments args)
        {
            api.ZoneAPI.send_game_over(WinForce.GetValue(api, args), Message.GetValue(api, args));
        }
    }

    [DescAttribute("客户端执行脚本文件", "场景")]
    public class RunClientScriptFileAction : AbstractAction
    {
        [DescAttribute("脚本文件")]
        public StringValue Script = new StringValue.NULL();
        public override string ToString()
        {
            return string.Format("客户端执行脚本文件:{0}", Script);
        }
        override public void DoAction(EventTriggerAdapter api, EventArguments args)
        {
            string sc = Script.GetValue(api, args);
            if (sc != null)
            {
                api.ZoneAPI.do_client_script(sc);
            }
        }
    }

    [DescAttribute("客户端执行脚本代码", "场景")]
    public class RunScriptCodeAction : AbstractAction
    {
        [DescAttribute("脚本代码")]
        public StringValue Script = new StringValue.NULL();
        public override string ToString()
        {
            return string.Format("客户端执行脚本代码:{0}", Script);
        }
        override public void DoAction(EventTriggerAdapter api, EventArguments args)
        {
            string sc = Script.GetValue(api, args);
            if (sc != null)
            {
                api.ZoneAPI.send_script_command(sc);
            }
        }
    }

    [DescAttribute("改变背景音乐", "场景")]
    public class ChangeBGMAction : AbstractAction
    {
        [DescAttribute("背景音乐文件")]
        [ResourceIDAttribute]
        public string MusicFile;
        public override string ToString()
        {
            return string.Format("改变背景音乐");
        }
        override public void DoAction(EventTriggerAdapter api, EventArguments args)
        {
            api.ZoneAPI.queueEvent(new ChangeBGMEvent(MusicFile));
        }
    }

    [DescAttribute("激活场景事件触发器", "场景触发器")]
    public class EventTriggerActive : AbstractAction
    {
        [DescAttribute("事件触发器名字")]
        [SceneEventIDAttribute]
        public string EventName;
        public override string ToString()
        {
            return string.Format("激活场景事件触发器({0})", EventName);
        }
        override public void DoAction(EventTriggerAdapter api, EventArguments args)
        {
            api.Group.EventActive(EventName, args);
        }
    }
    [DescAttribute("关闭场景事件触发器", "场景触发器")]
    public class EventTriggerDeactive : AbstractAction
    {
        [DescAttribute("事件触发器名字")]
        [SceneEventIDAttribute]
        public string EventName;
        public override string ToString()
        {
            return string.Format("关闭场景事件触发器({0})", EventName);
        }
        override public void DoAction(EventTriggerAdapter api, EventArguments args)
        {
            api.Group.EventDeactive(EventName, args);
        }
    }


    [DescAttribute("在指定地点放一个特效", "特效表现")]
    public class AddZoneEffect : AbstractAction
    {
        [DescAttribute("特效")]
        public LaunchEffect Effect = new LaunchEffect();
        [DescAttribute("位置")]
        public PositionValue Pos = new PositionValue.VALUE();
        [DescAttribute("方向")]
        public RealValue Direction = new RealValue.VALUE();

        public override string ToString()
        {
            return string.Format("在({0})位置添加特效({1})", Pos, Effect);
        }
        override public void DoAction(EventTriggerAdapter api, EventArguments args)
        {
            Vector2 pos = Pos.GetValue(api, args);
            if (pos != null)
            {
                float d = Direction.GetValue(api, args);
                api.ZoneAPI.queueEvent(new AddEffectEvent(0 , pos.X, pos.Y, d, Effect));
            }
        }
    }

    [DescAttribute("在指定单位身上放一个特效", "特效表现")]
    public class AddUnitEffect : AbstractAction
    {
        [DescAttribute("特效")]
        public LaunchEffect Effect = new LaunchEffect();
        [DescAttribute("单位 - 某个单位")]
        public UnitValue Unit = new UnitValue.Trigging();
        public override string ToString()
        {
            return string.Format("在({0})添加特效({1})", Unit, Effect);
        }
        override public void DoAction(EventTriggerAdapter api, EventArguments args)
        {
            InstanceUnit u = Unit.GetValue(api, args);
            if (u != null)
            {
                u.queueEvent(new UnitEffectEvent(u.ID, Effect));
            }
        }
    }


    [DescAttribute("发送消息到游戏服", "游戏服")]
    public class SendMessageToGS : AbstractAction
    {
        [DescAttribute("消息")]
        public StringValue Message = new StringValue.VALUE("msg");
        public override string ToString()
        {
            return string.Format("发送消息到游戏服:{0}", Message);
        }
        override public void DoAction(EventTriggerAdapter api, EventArguments args)
        {
            string msg = Message.GetValue(api, args);
            if (!string.IsNullOrEmpty(msg))
            {
                if(msg.Contains("{objid}"))
                {
                    var unit = args.TriggingUnit;
                    if(unit == null)
                    {
                        return;
                    }
                    msg = msg.Replace("objid", $"{unit.get_id()}");
                }
                api.ZoneAPI.SendMessageToGameServer(msg);
            }
        }
    }

    [DescAttribute("气泡聊天", "场景")]
    public class BubbleTalk : AbstractAction
    {
        [DescAttribute("是否暂停战斗")]
        public bool PauseBattle = false;

        [DescAttribute("内容")]
        [ListAttribute(typeof(TalkInfo))]
        public List<TalkInfo> Talks = new List<TalkInfo>();

		[DescAttribute("单位 - 某个单位")]
		public UnitValue TalkUnit = new UnitValue.NA();

		public override string ToString()
        {
            return string.Format("气泡聊天");  
        }
        public override void DoAction(EventTriggerAdapter api, EventArguments args)
        {
			InstancePlayer pointUnit = TalkUnit.GetValue(api, args) as InstancePlayer;

			BubbleTalkEvent e = new BubbleTalkEvent();
            e.PauseBattle = PauseBattle;
            e.TalkInfos.Clear();
            foreach (TalkInfo t in Talks)
            {
                if (t.IsNarrator)
                {
                    BubbleTalkEvent.TalkInfo info = new BubbleTalkEvent.TalkInfo(0, t.TalkContent, t.TalkActionType, t.TalkDelayTimeMS, t.TalkKeepTimeMS);
                    e.TalkInfos.Add(info);
                }
                else
                {
                    InstanceUnit unit = t.TalkUnit.GetValue(api, args);
                    if (unit != null)
                    {
                        BubbleTalkEvent.TalkInfo info = new BubbleTalkEvent.TalkInfo(unit.ID, t.TalkContent, t.TalkActionType, t.TalkDelayTimeMS, t.TalkKeepTimeMS);
                        e.TalkInfos.Add(info);
                    }
                }
            }

			if(pointUnit == null)
			{
				api.ZoneAPI.queueEvent(e);
			}
			else
			{
				api.ZoneAPI.doSendMsgToPlayer(pointUnit, e);
			}
        }

        [DescAttribute("聊天内容")]
        [Expandable]
        public class TalkInfo
        {
            [DescAttribute("单位 - 某个单位")]
            public UnitValue TalkUnit = new UnitValue.NA();
            [DescAttribute("是否是旁边白")]
            public bool IsNarrator = false;
            [LocalizationTextAttribute]
            [DescAttribute("内容")]
            public string TalkContent;
            [DescAttribute("动作")]
            public string TalkActionType;
            [DescAttribute("延迟时间")]
            public int TalkDelayTimeMS;
            [DescAttribute("持续时间")]
            public int TalkKeepTimeMS;
        }
    }
}