using UnityEngine;
using UnityEngine.UI;
using System.Collections;
using GCGame;
using System;
using Games.GlobeDefine;
using GCGame.Table;
using System.Collections.Generic;
using Module.Log;

public class ItemGetPathPopRoot : UIControllerBase<ItemGetPathPopRoot>
{
    // 获得路径数据结构
    public class GetPathData
    {
        public int pathType;                // 获得路径类型
        public string info;                 // 具体数据含义,更具路径类型而定
        public int itemID;
        // 因为两个获取表 MissionItemGetPath 和 ItemGetPath 的一些需求不一致
        // 所以标记下,特殊处理。
        public int tabType = 0;                // 0-itemGetPath;1-missionItemGetPath
    }

    void OnEnable()
    {
        SetInstance(this);
        // 取消自动选择
        pathScoll.AutoSelect = false;
    }

    void OnDisable()
    {
        SetInstance(null);
        HideAllGetPath();

        if (_ClickCallBack != null)
        {
            _ClickCallBack();
        }
    }

    void HideAllGetPath()
    {
        //for (int index = 0; index < _PathObjs.Length; ++index)
        //{
        //    _PathObjs[index].SetActive(false);
        //}
        pathScoll.gameObject.SetActive(false);
    }

    public UISubScollMenu pathScoll;

    public void CloseWindow()
    {
        UIManager.CloseUI(UIInfo.ItemGetPathPop);
    }

    #region show

    public delegate void ClickCallBack();
    public static ClickCallBack _ClickCallBack;
    public static void Show(int itemID, Vector2 showPos, ClickCallBack clickCallBack = null)
    {
        Hashtable hash = new Hashtable();
        hash.Add("DataID", itemID);
        hash.Add("ShowPos", showPos);
        _ClickCallBack = clickCallBack;
        UIManager.ShowUI(UIInfo.ItemGetPathPop, ItemGetPathPopRoot.ShowUIOver, hash);
    }

    static void ShowUIOver(bool bSuccess, object param)
    {
        if (bSuccess)
        {
            Hashtable hash = param as Hashtable;
            if (ItemGetPathPopRoot.Instance() != null)
            {
                ItemGetPathPopRoot.Instance().ShowInner((int)hash["DataID"], (Vector2)hash["ShowPos"]);
            }
        }
    }

    void ShowInner(int itemID, Vector2 showPos)
    {
        ShowItemGetPath(itemID, showPos);
    }

    #endregion

    #region 

    public RectTransform _AnchorTrans;
    //public GameObject[] _PathObjs;
    //public Text[] _ShowTexts;

    private Tab_ItemGetPath _ItemPathTab;

    private void ShowItemGetPath(int itemID, Vector2 showPos)
    {
        _ItemPathTab = TableManager.GetItemGetPathByID(itemID, 0);
        if (_ItemPathTab == null)
        {
            LogModule.ErrorLog("没有配置这个物品");
            UIManager.CloseUI(UIInfo.ItemGetPathPop);
            return;
        }

        pathScoll.gameObject.SetActive(true);
        SetPos(showPos);

        pathScoll.Clear();
        List<GetPathData> pathList = new List<GetPathData>();
        for (int i = 0; i < _ItemPathTab.getItemPathCount(); ++i)
        {
            if (string.IsNullOrEmpty(_ItemPathTab.GetItemPathbyIndex(i)))
            {
                continue;
            }

            if("-1" == _ItemPathTab.GetItemPathbyIndex(i))
            {
                continue;
            }

            switch (i)
            {
                case 0:
                case 4:
                case 5:
                case 7:
                case 10:
                    {
                        // 以上为只会有一种情况的路径
                        GetPathData pathType = new GetPathData();
                        pathType.pathType = i;
                        pathType.info = _ItemPathTab.GetItemPathbyIndex(i).Trim('"');
                        pathType.itemID = _ItemPathTab.Id;
                        pathScoll.PushMenu(pathType);
                    }
                    break;
                case 1:
                case 2:
                case 3:
                case 6:
                case 8:
                case 11:
                    {
                        // 多种情况的路径
                        // 类别
                        GetPathData classMenu = new GetPathData();
                        classMenu.pathType = i;
                        classMenu.info = "";
                        classMenu.itemID = _ItemPathTab.Id;


                        // 详细
                        string infoRaw = _ItemPathTab.GetItemPathbyIndex(i).Trim('"');
                        string[] infos = infoRaw.Split('|');
                        GetPathData[] detailItem = new GetPathData[infos.Length];
                        for (int j = 0; j < infos.Length; ++j)
                        {
                            GetPathData item = new GetPathData();
                            item.pathType = i;
                            item.info = infos[j];
                            item.itemID = _ItemPathTab.Id;

                            detailItem[j] = item;
                        }

                        pathScoll.PushMenu(classMenu, detailItem);
                    }
                    break;
                // 运营活动的特殊处理一下,会出现类似的活动,需要先判断。
                case 9:
                    {
                        // 多种情况的路径
                        // 类别
                        GetPathData classMenu = new GetPathData();
                        classMenu.pathType = i;
                        classMenu.info = "";
                        classMenu.itemID = _ItemPathTab.Id;

                        // 详细
                        string infoRaw = _ItemPathTab.GetItemPathbyIndex(i).Trim('"');
                        string[] infos = infoRaw.Split('|');
                        List<GetPathData> detailItem = new List<GetPathData>();

                        for (int j = 0; j < infos.Length; ++j)
                        {
                            if (IsMarketingActActive(infos[j]))
                            {
                                GetPathData item = new GetPathData();
                                item.pathType = i;
                                item.info = infos[j];
                                item.itemID = _ItemPathTab.Id;

                                detailItem.Add(item);
                            }
                        }

                        pathScoll.PushMenu(classMenu, detailItem.ToArray());
                    }
                    break;
            }
        }
    }

    public static bool IsMarketingActActive(string info)
    {
        // 活动特殊处理,必须用‘,’区分入口和ID
        string[] infos = info.Split(';');
        if (infos.Length < 2)
        {
            LogModule.ErrorLog("Config error !!!");
            return false;
        }

        if (infos[0] == "-1")
        {
            return true;
        }

        int actID = string.IsNullOrEmpty(infos[1]) ? -1 : Convert.ToInt32(infos[1]);
        if (GlobalData.IsMarketingActActive(actID))
        {
            return true;
        }

        return false;
    }

    private void SetPos(Vector2 pos)
    {
        _AnchorTrans.position = pos;

        float newY;
        float newX;

        // 优先在右显示
        if (Screen.width - _AnchorTrans.anchoredPosition.x >= _AnchorTrans.rect.width)
        {
            newX = _AnchorTrans.anchoredPosition.x + _AnchorTrans.rect.width / 2;
        }
        else if (_AnchorTrans.anchoredPosition.x >= _AnchorTrans.rect.width)
        {
            newX = _AnchorTrans.anchoredPosition.x - _AnchorTrans.rect.width / 2;
        }
        else
        {
            newX = Screen.width - _AnchorTrans.rect.width / 2;
        }

        if (Screen.height - _AnchorTrans.anchoredPosition.y < _AnchorTrans.rect.height / 2)
        {
            newY = Screen.height - _AnchorTrans.rect.height / 2;
        }
        else if (_AnchorTrans.anchoredPosition.y <= _AnchorTrans.rect.height / 2)
        {
            newY = _AnchorTrans.rect.height / 2;
        }
        else
        {
            newY = _AnchorTrans.anchoredPosition.y;
        }

        _AnchorTrans.anchoredPosition = new Vector2(newX, newY);
    }

    public void OnItemPathClick(object menuData)
    {
        GetPathData data = menuData as GetPathData;
        // 10类型仅做展示,不做跳转,甚至不能关闭这个界面
        if (data == null)
        {
            CloseWindow();
        }
        else if(data.pathType == 10)
        {
            // do nothing
        }
        else
        {
            GoGetPath(data, CloseWindow);
        }
    }

    public static void GoGetPath(GetPathData data, Action onClick = null)
    {
        switch (data.pathType)
        {
            case 0://元宝商城
                int goodID = Convert.ToInt32(data.info);
                var shopItemTab = TableManager.GetYuanBaoShopByID(goodID, 0);
                YuanBaoShopLogic.OpenShopForItem(shopItemTab.ItemID);
                break;
            case 1://系统商店
                if (string.IsNullOrEmpty(data.info))
                {
                    return;
                }

                int shopID = Convert.ToInt32(data.info);

                if (shopID > 0 && shopID < 4)
                {
                    SysShopController.ShowShopForItem(shopID, data.itemID);
                }
                else
                {
                    YuanBaoShopLogic.OpenShopForJiFenItem(shopID, data.itemID);
                }
                break;
            case 2://NPC商店
                if (string.IsNullOrEmpty(data.info))
                {
                    return;
                }

                int NPCId = Convert.ToInt32(data.info);
                SysShopController._SelectedItem = data.itemID;
                UIManager.ClosePopUI();
                FindNpc(NPCId);
                break;
            case 3://怪物掉落
                if (string.IsNullOrEmpty(data.info))
                {
                    return;
                }
                break;
            case 4://交易市场
                Market.ShowMarket(data.itemID);
                break;
            case 5://玩家商店
                if(data.tabType == 0)
                {
                    Market.ShowMarket(data.itemID);
                }
                else
                {
                    if(!string.IsNullOrEmpty(data.info))
                    {
                        string[] param = data.info.Split(',');
                        if(param.Length == 2)
                        {
                            int classType = Convert.ToInt32(param[0]);
                            int subClassType = Convert.ToInt32(param[1]);
                            Market.ShowPlayerShopMarket(classType, subClassType);
                        }
                    }
                }
                break;
            case 6://活动
                if (string.IsNullOrEmpty(data.info))
                {
                    return;
                }
                UIManager.ShowUI(UIInfo.Activity);
                break;
            case 7://百晓生
                //UIManager.ShowUI(UIInfo.Activity);
                int helpID = int.Parse(data.info);
                var helpRecord = TableManager.GetChatHelperByID(helpID, 0);
                ChatHelperRoot.ShowChatHelperStr(helpRecord.KeyWord);
                break;
            case 8:
                if (string.IsNullOrEmpty(data.info))
                {
                    return;
                }
                ShowUI(data.info);
                break;
            case 9:
                if(string.IsNullOrEmpty(data.info))
                {
                    return;
                }

                string[] actInfo = data.info.Split(';');

                if(actInfo.Length < 2)
                {
                    LogModule.ErrorLog("Config error");
                }
                GotoOperationalAct(Convert.ToInt32(actInfo[0]), Convert.ToInt32(actInfo[1]));
                break;
            case 11:
                {
                    UIManager.ShowUI(UIInfo.Boss, delegate (bool bSuccess, object param)
                    {
                        BossUI worldBoss = UIManager.GetUIComponent<BossUI>(UIInfo.Boss);
                        if (worldBoss != null)
                        {
                            int bossType = Convert.ToInt32((string)param);
                            worldBoss.ShowPage(bossType);
                        }
                    }, data.info);
                }
                break;
        }

        if (onClick != null)
        {
            onClick();
        }
    }

    public static void FindNPCStr(string npcIDStr)
    {
        int npcID = int.Parse(npcIDStr);
        FindNpc(npcID);
    }

    // 前往NPC商店
    private static void FindNpc(int npcID)
    {
        Tab_AutoSearch sceneNpc = TableManager.GetAutoSearchByID(npcID, 0); 
        if (sceneNpc == null)
            return;
        AutoSearchPoint point = new AutoSearchPoint(sceneNpc.DstSceneID, sceneNpc.X, sceneNpc.Z);
        if (GameManager.gameManager && GameManager.gameManager.AutoSearch)
        {
            Tab_RoleBaseAttr role = TableManager.GetRoleBaseAttrByID(sceneNpc.DataId, 0);
            GameManager.gameManager.AutoSearch.BuildPath(point);
            if (role != null)
            {
                GameManager.gameManager.AutoSearch.Path.AutoSearchTargetName = role.Name;
            }
        }
    }
    #endregion

    private enum UICLASSTYPE
    {
        MARRY = 0,  //结婚副本
        COPY = 1,  //活动界面副本
    }

    private enum UISUBCLASSTYPE
    {
        ADVANCECOPY = 0,  //进阶副本
        MAINMISSION = 1, //主线副本
        EQUIP = 2, //装备副本 
    }

    // 副本UI跳转
    public static void ShowUI(string info)
    {
        int _ClassType = -1;
        int _SubClass = -1;
        int _SubSubClass = -1;

        int _OptParam = string.IsNullOrEmpty(info) ? -1 : Convert.ToInt32(info);

        if (_OptParam == -1)
        {
            return;
        }

        _SubSubClass = _OptParam % 10 - 1;
        _SubClass = (_OptParam / 10) % 10;
        _ClassType = _OptParam / 100;

        switch (_ClassType)
        {
            case (int)UICLASSTYPE.MARRY:
                {
                    if (!GameManager.gameManager.PlayerDataPool.IsMarried)
                    {
                        GUIData.AddNotifyData("#{47012}");
                        return;
                    }

                    UIManager.ShowUI(UIInfo.MarryRoot, delegate (bool bSucess, object param)
                    {
                        if (bSucess)
                        {
                            MarryRoot.Instance.OnMenuItemClick(MarryRoot.MarryMenuItemType.Copy);
                        }
                    });
                }
                break;
            case (int)UICLASSTYPE.COPY:
                {
                    Hashtable tempParam = new Hashtable();
                    tempParam["_SubClass"] = _SubClass;
                    tempParam["_SubSubClass"] = _SubSubClass;
                    UIManager.ShowUI(UIInfo.CopyScenePanelCtr, delegate (bool bSucess, object param)
                    {
                        if (bSucess)
                        {
                            int sc = (int)((Hashtable)param)["_SubClass"];
                            int ssc = (int)((Hashtable)param)["_SubSubClass"];
                            CopyScenePanelCtr.Instance.OnMenuItemClick(sc, ssc);
                        }
                    }, tempParam);
                }
                break;
        }
    }

    // 运营活动跳转
    // enhanceID 入口ID
    // actID 活动ID
    public static void GotoOperationalAct(int enhanceID, int actID)
    {
        switch (enhanceID)
        {
            case -2:
                YuanBaoShopLogic.OpenChargePage();
                break;
            // vip
            case -1:
                YuanBaoShopLogic.OpenVipPage();
                break;
            case 0:
                // 福利大厅 有分页
                UIManager.ShowUI(UIInfo.WelfareRoot,
                (bool bSuccess, object param) =>
                {
                    if (bSuccess)
                    {
                        // 等级礼包NodeID = 203
                        WelfareRootCtr.Instance.OpenWith(actID);
                    }
                }); break;
            case 1:
                // 进阶特惠 有分页
                MarketingWinRootCS.OpenWithAct = actID;
                if (MarketingActsRoot.Instance() != null)
                {
                    MarketingActsRoot.Instance().ShowActById(enhanceID, actID);
                }
                break;
            case 5:
                // 开服活动 有分页
                OpenServiceRootCS.OpenWithAct = actID;
                if (MarketingActsRoot.Instance() != null)
                {
                    MarketingActsRoot.Instance().ShowActById(enhanceID, actID);
                }
                break;
            case 6:
                // 每日首冲/累充 有分页
                DailyRechargeRoot.OpenWithAct = actID;
                if (MarketingActsRoot.Instance() != null)
                {
                    MarketingActsRoot.Instance().ShowActById(enhanceID, actID);
                }
                break;
            case 17:
                // 节日活动 有分页
                NewYearPage.OpenWithAct = actID;
                if (MarketingActsRoot.Instance() != null)
                {
                    MarketingActsRoot.Instance().ShowActById(enhanceID, actID);
                }
                break;
            default:
                // 其他无分页活动
                if (MarketingActsRoot.Instance() != null)
                {
                    MarketingActsRoot.Instance().ShowActById(enhanceID, actID);
                }
                break;
        }
    }
}