using System;
using System.Collections.Generic;
using System.Linq;
using System.Text.RegularExpressions;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;

namespace ET.Server
{
    [FriendOf(typeof (MapEventComponent))]
    [FriendOf(typeof (Map))]
    public static class MapEventComponentSystem
    {
        public class MapEventComponentAwakeSystem: AwakeSystem<MapEventComponent>
        {
            /// <summary>
            /// 场景事件组件创建
            /// </summary>
            /// <param name="self"></param>
            protected override void Awake(MapEventComponent self)
            {
                Log.Info($"创建战斗服事件组件...");
            }
        }

        public class MapEventComponentDestroySystem: DestroySystem<MapEventComponent>
        {
            /// <summary>
            /// 场景事件组件销毁
            /// </summary>
            /// <param name="self"></param>
            protected override void Destroy(MapEventComponent self)
            {
                Log.Info($"销毁战斗服事件组件...");
            }
        }

        /// <summary>
        /// 副本消息
        /// </summary>
        /// <param name="self"></param>
        /// <param name="msg"></param>
        public static void OnMessage(this MapEventComponent self, JObject json)
        {
            string msg = Convert.ToString(json.SelectToken("msg"));

            string[] parames = msg.Split(":");

            switch (parames[0])
            {
                case "Dead":
                {
                    if ("Tower1".Equals(parames[1]))
                    {

                        return;
                    }
                    else if ("Tower2".Equals(parames[1]))
                    {
                        Log.Debug($"塔2死亡事件...");
                        self.GetParent<Map>().DeadUnits.Add(1002);
                        return;
                    } else if ("Tower3".Equals(parames[1]))
                    {
                        Log.Debug($"塔3死亡事件...");
                        self.GetParent<Map>().DeadUnits.Add(1003);
                        return;
                    }
                    else
                    {
                        int objId = int.Parse(parames[1]);
                        if (objId > 0)
                        {
                            Log.Debug($"单位:{objId}死亡事件...");
                            Map map = self.GetParent<Map>();
                            Struct.UnitPlayerData unitPlayerData = map.GetUnitPlayerByObjId(objId);
                            if (unitPlayerData != null)
                            {
                                unitPlayerData.DeadState = 1;
                            }
                            return;
                        }
                    }
                    return;
                }
                case "Revive":
                {
                    int objId = int.Parse(parames[1]);
                    if (objId > 0)
                    {
                        Log.Debug($"单位:{objId}复活事件...");
                        Map map = self.GetParent<Map>();
                        Struct.UnitPlayerData unitPlayerData = map.GetUnitPlayerByObjId(objId);
                        if (unitPlayerData != null)
                        {
                            unitPlayerData.DeadState = 0;
                        }
                        return;
                    }
                    return;
                }
            }
        }

        private static void TransferUnitsToNewTower(this MapEventComponent self)
        {
            Map map = self.GetParent<Map>();

            int cnt = 0;
            foreach(Struct.UnitPlayerData player in map.UnitPlayers.Values)
            {
                //TODO: 转移坐标为当前战斗区域中的随机位置
                map.GetXmdsManager().transferUnit(map.Id.ToString(), player.ObjId, 178f + (cnt++), 139f);
            }
            Log.Debug($"transfer unit: {cnt}");
        }

        /// <summary>
        /// 场景结算事件
        /// </summary>
        /// <param name="self"></param>
        public static void OnGameOver(this MapEventComponent self)
        {
            Map map = self.GetParent<Map>();

            map.IsGameOver = true;

            if (map.Player == null)
            {
                return;
            }
            // 场景结束逻辑
            map.GetComponent<MapRankComponent>().OnGameOver();
            // 记录玩家历史
            map.SyncPlayerHistoryData(map.Player);
            // 战斗服场景玩家离开
            map.PlayerLeaveRequest(map.Player, false);
            // 本地场景移除玩家
            map.RemovePlayer(map.Player, false);
            // 战斗服结束场景
            map.GetZoneManager().destroyZoneRequest(map.Id.ToString());

            map.Player.Map = null;
        }

        /// <summary>
        /// 拾取道具
        /// </summary>
        /// <param name="self"></param>
        /// <param name="msg"></param>
        public static void OnPickItem(this MapEventComponent self, JObject msg)
        {
        }

        /// <summary>
        /// 击杀boss
        /// </summary>
        /// <param name="self"></param>
        /// <param name="msg"></param>
        public static void OnKillBoss(this MapEventComponent self, JObject msg)
        {
        }

        /// <summary>
        /// 战报统计
        /// </summary>
        /// <param name="self"></param>
        /// <param name="msg"></param>
        public static void OnBattleReport(this MapEventComponent self, JObject msg)
        {
        }
    }
}