using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using pomelo.item;
using XmdsBattleClientBot;
using pomelo.area;
using CommonLang.Property;
using pomelo.connector;

namespace XmdsBotTest.Runner
{
    public class ModuleEquip : BotRunner.RunnerModule
    {
        List<Grid> Equips;
        List<Grid> Bags;
        int pro;
        int upLevel;
        Dictionary<int, string> proTable;
        Dictionary<string, ItemDetail> ItemDetails;
        Dictionary<string, int> equipPosition;

        bool isFirstBind = true;
        public ModuleEquip() {
            module_name = "装备";
        }

        public ModuleEquip(BotRunner r) : base(r)
        {
            proTable = new Dictionary<int, string>();
            ItemDetails = new Dictionary<string, ItemDetail>();
            equipPosition = new Dictionary<string, int>();

            this.proTable[1] = "狂战士";
            this.proTable[2] = "刺客";
            this.proTable[3] = "魔法师";
            this.proTable[4] = "猎人";
            this.proTable[5] = "牧师";

            this.equipPosition["主手"] = 1;
            this.equipPosition["副手"] = 2;
            this.equipPosition["头部"] = 3;
            this.equipPosition["上衣"] = 4;
            this.equipPosition["腿部"] = 5;
            this.equipPosition["腰部"] = 6;
            this.equipPosition["手套"] = 7;
            this.equipPosition["鞋子"] = 8;
            this.equipPosition["勋章"] = 9;
            this.equipPosition["项链"] = 10;
            this.equipPosition["戒指"] = 11;
            this.equipPosition["护身符"] = 12;

            client.GameSocket.listen<BagItemUpdatePush>(on_item_update);
            client.GameSocket.listen<EquipmentSimplePush>(on_equip_update);
            client.GameSocket.listen<ItemDetailPush>(on_item_detail_update);
        }
        protected internal override void OnGateBindPlayer(BindPlayerResponse e)
        {
            base.OnGateBindPlayer(e);
            Equips = e.s2c_player.equipments.equips;
            Bags = e.s2c_player.store.bag.bagGrids;
            pro = e.s2c_player.pro;
            upLevel = e.s2c_player.upLevel;
            try_get_all_equip_detail();
            if (isFirstBind)
            {
                runner.do_gm_add_item();
                runner.do_gm_add_gold(99999999);
                runner.do_gm_add_diamond(99999999);
                isFirstBind = false;
            }
        }
        protected internal override void OnBattleActorReady(CommonAI.ZoneClient.ZoneLayer layer, CommonAI.ZoneClient.ZoneActor actor)
        {
            layer.AddTimeDelayMS(Config.CheckIntervalMS, (t) =>
            {
                if (Enable)
                {
                    
                    
                }
            });
            layer.AddTimePeriodicMS(Config.CheckIntervalMS, (t) =>
            {
                if (Enable)
                {
                    try_equip();
                    //try_un_equip();
                    try_equip_melt();

                }
            });
        }
        private void try_get_all_equip_detail()
        {
            client.GameSocket.itemHandler.getAllEquipDetailsRequest(
                    (err, rsp) =>
                    {
                        foreach (var item in rsp.s2c_items)
                        {
                            ItemDetails[item.id] = item;
                        }
                    });
        }
        private void try_un_equip()
        {
            int randValue = bot.Random.Next(0, Equips.Count - 1);

            client.GameSocket.equipHandler.unEquipRequest(
                Equips[randValue].gridIndex, (err, rsp) =>
                { });
        }
        private void try_equip()
        {
            foreach (var bag in Bags)
            {
                if (bag.item == null || bag.item.itemType < 1 || bag.item.itemType > 4) continue;

                object qc;
                int qid;
                Dictionary<string, object> template = BotClientManager.GetItemTemplate(bag.item.code);

                if (!template.TryGetValue("Pro", out qc) || proTable[pro] != qc.ToString()) continue;

                if (!template.TryGetValue("UpReq", out qc) || !int.TryParse(qc.ToString(), out qid) || (qid > 0 && qid > upLevel)) continue;

                ItemDetail ItemDetail = ItemDetails[bag.item.id];

                if (null == ItemDetail) continue;

                if (null == ItemDetail.equipDetail) continue;

                if (0 == ItemDetail.equipDetail.isIdentfied) continue;

                if (!template.TryGetValue("Type", out qc)) continue;

                //武器不用换
                if (equipPosition[qc.ToString()] == 1) continue;


                pomelo.item.Item equip = get_equip_by_pos(equipPosition[qc.ToString()]);

              

                if(null != equip)
                {
                    ItemDetail equipDetail = ItemDetails[equip.id];

                    if(null != equipDetail && ItemDetail.equipDetail.score < equipDetail.equipDetail.score)
                    {
                        continue;
                    }

                   
                }

                client.GameSocket.equipHandler.equipRequest(
            bag.gridIndex, (err, rsp) =>
            { });
            }
        }
        private void on_item_update(BagItemUpdatePush e)
        {
            foreach (var i in e.s2c_data)
            {
                foreach (var bag in Bags)
                {
                    if (i.gridIndex == bag.gridIndex)
                    {
                        bag.item = i.item;
                        break;
                    }
                }
            }
        }
        private void on_equip_update(EquipmentSimplePush e)
        {
            foreach (var i in e.s2c_data)
            {
                foreach (var equip in Equips)
                {
                    if (i.gridIndex == equip.gridIndex)
                    {
                        equip.item = i.item;
                        break;
                    }
                }
            }
        }
        private void on_item_detail_update(ItemDetailPush e)
        {
            foreach (var i in e.s2c_data)
            {
                ItemDetails[i.id] = i;
            }
        }
        private pomelo.item.Item get_equip_by_pos(int pos)
        {
            foreach (var equip in Equips)
            {
                if(equip.gridIndex == pos)
                {
                    return equip.item;
                }
            }
            return null;
        }
        private void try_equip_melt()
        {
            List<int> indexs = new List<int>();

            foreach (var bag in Bags)
            {
                if (bag.item == null || bag.item.itemType < 1 || bag.item.itemType > 4) continue;

                object qc;
                int qid;
                Dictionary<string, object> template = BotClientManager.GetItemTemplate(bag.item.code);

                if (!template.TryGetValue("NoMelt", out qc) || !int.TryParse(qc.ToString(), out qid) || (qid == 1)) continue;

                indexs.Add(bag.gridIndex);
            }

            client.GameSocket.equipHandler.equipMeltRequest(
                indexs, (err, rsp) =>
                { });
        }
        [Desc("装备配置")]
        [Expandable]
        public class Config : ConfigBase
        {
            [Desc("装备检测间隔")]
            public static int CheckIntervalMS = 5000;

            public override string ToString()
            {
                return "装备配置";
            }

            public override void popG2DPropertyDialog()
            {
                CommonFroms.G2D.G2DPropertyDialog<ModuleEquip.Config>.Show("修改配置", this);
            }
        }
    }
}