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

public class CangKuLogic : MonoBehaviour
{

    const int MAX_ITEM_PAGE = 25;   //每页最大格子数量
    const int MAX_PAGE = 4;         //最大页数

    

    private static CangKuLogic m_Instance = null;
    public static CangKuLogic Instance()
    {
        return m_Instance;
    }

    void Awake()
    {
        m_Instance = this;
    }

    void OnEnable()
    {
        m_Instance = this;
        InitCangKu();
        InitBackPack();
        _PagePanel.SetActive(false);
    }

    void OnDisable()
    {
        m_Instance = null;

        if(MessageBoxLogic.Instance())
        {
            UIManager.CloseUI(UIInfo.MessageBox);
        }
    }

    void InitCangKu()
    {
        ReqCangKuPackData();
        UpdateCangKu();
    }

    void ReqCangKuPackData()
    {
        CG_ASK_UPDATE_STORAGEPACK pak = (CG_ASK_UPDATE_STORAGEPACK)PacketDistributed.CreatePacket(MessageID.PACKET_CG_ASK_UPDATE_STORAGEPACK);
        pak.SetType(1);
        pak.SetOpentype((IsFastOPen ? 1 : 0));
        pak.SendPacket();
    }

    public void UpdateCangKu()
    {
        if (!gameObject.activeInHierarchy)
            return;

        UpdateCangKu_Page(_SelectedPage);
    }

    #region pages

    public const string LOCKED_STR = "Locked";
    public const int _PageLayoutCnt = 3;

    public UISubScollMenu _PageMenu;
    List<string> _PageList = new List<string>();
    public GameObject _PagePanel;

    //public Text _ShowingPage;
    public Sprite[] pageSprites;
    public Image showingPageImage;
    public GridLayoutGroup _GridLayout;
    public bool IsFastOPen = false;                 // 是否是快捷打开仓库,此值在Inspector中被设为true,不知为何在外赋值

    public GameObject PointObjClone;
    public GameObject PagePoints;

    private int _SelectedPage = 0;
    public int SelectedPage
    {
        get
        {
            return _SelectedPage;
        }
    }

    List<GameObject> PointObjs = new List<GameObject>();

    void CheckPointShow()
    {
        if (GameManager.gameManager.PlayerDataPool.StoragePack.CangkuPage <= 1)
        {
            PagePoints.SetActive(false);
            return;
        }
        PagePoints.SetActive(true);
        if (PointObjs.Count != GameManager.gameManager.PlayerDataPool.StoragePack.CangkuPage)
        {
            for (int i = 0; i < PointObjs.Count; i++)
            {
                PointObjs[i].SetActive(false);
                PointObjs[i].transform.SetParent(null);
                GameObject.Destroy(PointObjs[i]);
            }
            PointObjs.Clear();
            for (int i=0;i< GameManager.gameManager.PlayerDataPool.StoragePack.CangkuPage;i++)
            {
                GameObject newMenuObj = Utils.CloneObj(PointObjClone);
                if (newMenuObj == null)
                    continue;
                PointObjs.Add(newMenuObj);
                Transform point1 = newMenuObj.transform.Find("point1");
                if (point1 != null)
                {
                    point1.gameObject.SetActive(true);
                }
                Transform point2 = newMenuObj.transform.Find("point2");
                if (point2 != null)
                {
                    point2.gameObject.SetActive(false);
                }
            }
        }
        ShowPoint();
    }

    void ShowPoint()
    {
        if (_SelectedPage < PointObjs.Count)
        {
            for (int i = 0; i < PointObjs.Count; i++)
            {
                GameObject newMenuObj = PointObjs[i];
                Transform point1 = newMenuObj.transform.Find("point1");
                if (point1 != null)
                {
                    point1.gameObject.SetActive(_SelectedPage != i);
                }
                Transform point2 = newMenuObj.transform.Find("point2");
                if (point2 != null)
                {
                    point2.gameObject.SetActive(_SelectedPage == i);
                }
            }
        }
    }

    public void OnCangkuPagePanelOpen()
    {
        _PagePanel.SetActive(true);
        _PageList.Clear();
        _PageMenu.Clear();
        for (int i = 0; i < GameManager.gameManager.PlayerDataPool.StoragePack.CangkuPage; ++i)
        {
            string title = StrDictionary.GetClientDictionaryString("#{3903}") + (i + 1).ToString();
            _PageList.Add(title);
        }
        int pageCount = TableManager.GetCangKuUnlock().Count;
        if (GameManager.gameManager.PlayerDataPool.StoragePack.CangkuPage < pageCount)
        {
            _PageList.Add(LOCKED_STR);
        }
      
        for (int i = 0; i < _PageList.Count; i++)
        {
            _PageMenu.PushMenu(_PageList[i]);
            if (i==SelectedPage)
            {
                _PageMenu.HightLightMenu(_PageList[i]);
            }
        }
        InitItemLockIcon();
    }

    public void InitItemLockIcon()
    {
        foreach (var item in _PageMenu.SubBtns)
        {
            if(item.Key.MenuObj.Equals(LOCKED_STR))
            {
                item.Key.OpenSubGO();
                item.Key._MenuText.gameObject.SetActive(false);
            }else
            {
                item.Key.CloseSubGO();
                item.Key._MenuText.gameObject.SetActive(true);
            }
        }
    }

    public void OnCangkuPageClick(object pageObj)
    {
        string pageStr = pageObj as string;
        if (LOCKED_STR == pageStr)
        {
            int page = _PageList.Count;
            Tab_CangKuUnlock line = TableManager.GetCangKuUnlockByID(page, 0);

            if (line != null)
            {
                string str = StrDictionary.GetClientDictionaryString("#{5003}", PlayerData.MONEY.GetMoneyStr((MONEYTYPE)line.ConsumeSubType), line.ConsumeNum);
                MessageBoxLogic.OpenOKCancelBox(str, "", OnClickUnLock_OK, OnClickUnLock_Cancel);
            }
            else
            {
                GUIData.AddNotifyData("#{2699}", false);
            }
        }
        else
        {
            //_ShowingPage.text = pageStr;
            _SelectedPage = _PageList.IndexOf(pageStr);
            showingPageImage.overrideSprite = pageSprites[_SelectedPage];
            UpdateCangKu_Page(_SelectedPage);
        }

        _PagePanel.SetActive(false);
    }

    public void OnChangkuPagePanelClose()
    {
        _PagePanel.SetActive(false);
    }

    void OnClickUnLock_OK()
    {
        CG_STORAGEPACK_UNLOCK unlock = (CG_STORAGEPACK_UNLOCK)PacketDistributed.CreatePacket(MessageID.PACKET_CG_STORAGEPACK_UNLOCK);
        unlock.SetUnlocknum(1);
        unlock.SendPacket();
    }

    void OnClickUnLock_Cancel()
    {

    }

    #endregion

    #region items

    public UIContainerSelect _PackItemContainer;
    public UIContainerSelect _CangkuItemContainer;

    private List<CommonItemBackPackItem.BackPackItem> _ShowItems = new List<CommonItemBackPackItem.BackPackItem>();

    // 显示后一页
    public void PointClick_ShowNext()
    {
        int showPage = _SelectedPage;
        showPage++;
        if (showPage >= GameManager.gameManager.PlayerDataPool.StoragePack.CangkuPage)
            showPage = 0;
        UpdateCangKu_Page(showPage);
    }

    // 显示前一页
    public void PointClick_ShowLast()
    {
        int showPage = _SelectedPage;
        showPage--;
        if (showPage < 0)
            showPage = GameManager.gameManager.PlayerDataPool.StoragePack.CangkuPage - 1;
        UpdateCangKu_Page(showPage);
    }

    void UpdateCangKu_Page(int page)
    {
        if (page < 0 || page >= CangkuContainer.MAX_CANGKU_PAGE)
        {
            return;
        }
        UpdateCangKu_Item(page);
        _SelectedPage = page;
        //_ShowingPage.text = StrDictionary.GetClientDictionaryString("#{3903}") + (_SelectedPage + 1).ToString();
        if (_SelectedPage >= 0 && _SelectedPage < pageSprites.Length)
        {
            showingPageImage.overrideSprite = pageSprites[_SelectedPage];
        }
        CheckPointShow();
    }

    //获取当前特权等级下最大的解锁个数
    private Dictionary<int, int> _pageUnlockCountDic;
    void GetCurPrivilegeVipUnLockCountDic()
    {
        //应为开启之后就不再撤销,这边以服务器记录的最大值为主
        var totalUnLockCount = GameManager.gameManager.PlayerDataPool.SlotTotalUnLockCount;
        //foreach (var info in TableManager.GetPrivilegeFunction())
        //{
        //    if(info.Value[0].PrivilegeId == 1)  //解锁仓库
        //    {
        //        //拥有当前特权
        //        if(GameManager.gameManager.PlayerDataPool.PrivilegeTypeStateDic.ContainsKey(info.Value[0].PrivilegeVipType)
        //            && GameManager.gameManager.PlayerDataPool.PrivilegeTypeStateDic[info.Value[0].PrivilegeVipType])
        //        {
        //            if (int.Parse(info.Value[0].GetVipbyIndex(GameManager.gameManager.PlayerDataPool.VipCost)) >= totalUnLockCount)
        //                totalUnLockCount = int.Parse(info.Value[0].GetVipbyIndex(GameManager.gameManager.PlayerDataPool.VipCost));
        //        }
        //    }
        //}
        
        _pageUnlockCountDic = new Dictionary<int, int>();

        for(int indedx = 1; indedx <= TableManager.GetCangKuUnlock().Count; indedx++)
        {
            var cangKuTab = TableManager.GetCangKuUnlockByID(indedx, 0);
            if (cangKuTab == null)
                continue;

            if(totalUnLockCount > cangKuTab.CellNum)
            {
                _pageUnlockCountDic.Add(indedx, cangKuTab.CellNum);
                totalUnLockCount -= cangKuTab.CellNum;
            }
            else
            {
                _pageUnlockCountDic.Add(indedx, totalUnLockCount);
                totalUnLockCount = 0;
            }
        }
    }

    void UpdateCangKu_Item(int page)
    {
        GameItemContainer itemContainer = GameManager.gameManager.PlayerDataPool.StoragePack;
        
        _ShowItems.Clear();
        int startPos = page * CangkuContainer.MAX_ITEM_COUNT_CANGKU_PAGE;

        
        int vipLv = GameManager.gameManager.PlayerDataPool.VipCost;
        
        List<GameItem> itempack = ItemTool.GetPageItem(itemContainer, startPos, startPos + CangkuContainer.MAX_ITEM_COUNT_CANGKU_PAGE);

        // 获得当前页数的解锁条件列表
        Tab_CangKuUnlock tabCangku = TableManager.GetCangKuUnlockByID(page + 1, 0);

        // totalUnlock - 该页总的开启数,tabCangKu.UnlockNum - 该页默认开启数目
        int totalUnlock = tabCangku.UnlockNum;

        //这边必须要每次都判断了,应为VIP可能有变化
        GetCurPrivilegeVipUnLockCountDic();


        if (_pageUnlockCountDic.ContainsKey(page +1))
            totalUnlock = _pageUnlockCountDic[page + 1];
        for (int nIndex = 0; nIndex < itempack.Count; ++nIndex)
        {
            if (nIndex < totalUnlock)
            {
                _ShowItems.Add(new CommonItemBackPackItem.BackPackItem() { GameItem = itempack[nIndex], IsPosLock = false });
            }
            else
            {
                _ShowItems.Add(new CommonItemBackPackItem.BackPackItem() { GameItem = null, IsPosLock = true });
            }
        }

        _CangkuItemContainer.InitSelectContent(_ShowItems, null, CandkuItemClick);
    }

    public void OnBtnCangKuSort()
    {
        CG_REQ_TIDY_PACK packet = (CG_REQ_TIDY_PACK)PacketDistributed.CreatePacket(MessageID.PACKET_CG_REQ_TIDY_PACK);
        packet.PackType = 3;
        packet.IsSort = 1;
        packet.SendPacket();

        //_BtnSortTime.SetBtnDisableTime(_BtnSortDisableTime);
        //LogModule.DebugLog("Send sort Storagepack");
    }

    private float LastClickTime1 = 0;
    private CommonItemBackPackItem.BackPackItem LastPackItem1 = null;

    public void CandkuItemClick(object obj)
    {
        CommonItemBackPackItem.BackPackItem backPackItem = obj as CommonItemBackPackItem.BackPackItem;
        if (!backPackItem.IsPosLock)
        {
            if (backPackItem.GameItem != null && backPackItem.GameItem.IsValid())
            {
                if (Time.time - LastClickTime1 < 0.2f && LastPackItem1 == backPackItem)
                {
                    LastPackItem1 = null;
                    LastClickTime1 = 0;
                    Singleton<ObjManager>.Instance.MainPlayer.CangKuTakeOut(backPackItem.GameItem);
                    StopCoroutine(ItemClick(backPackItem, true));
                }
                else
                {
                    LastPackItem1 = backPackItem;
                    LastClickTime1 = Time.time;
                    StartCoroutine(ItemClick(backPackItem, true));
                }
            }
        }
        else
        {
            int idx = _ShowItems.IndexOf(backPackItem);
            if (idx < 0)
                return;

            // _SelectedPage 从 0 开始,表格是从 1 开始。
            Tab_CangKuUnlock curPagaVipTab = TableManager.GetCangKuUnlockByID(_SelectedPage + 1, 0);
            int selectLine =(idx - 10) / 5;
            int needVip = curPagaVipTab.GetVIPRestrictbyIndex(selectLine);

            GUIData.AddNotifyData(StrDictionary.GetClientDictionaryString("#{5004}", needVip));
        }
    }

    // backPackItem 被点击的物品信息
    // isInBackPack 被点击的物品是否现在仓库
    IEnumerator ItemClick(CommonItemBackPackItem.BackPackItem backPackItem, bool isInCangKu)
    {
        yield return new WaitForSeconds(0.25f);
        ShowTooltips(backPackItem.GameItem, isInCangKu);
    }

    private float LastClickTime = 0;
    private CommonItemBackPackItem.BackPackItem LastPackItem = null;
    public void CandkuBackPackItemClick(object obj)
    {
        CommonItemBackPackItem.BackPackItem backPackItem = obj as CommonItemBackPackItem.BackPackItem;
        if (!backPackItem.IsPosLock)
        {
            if (backPackItem.GameItem != null && backPackItem.GameItem.IsValid())
            {
                if (Time.time - LastClickTime < 0.2f && LastPackItem == backPackItem)
                {
                    LastPackItem = null;
                    LastClickTime = 0;
                    Singleton<ObjManager>.Instance.MainPlayer.CangKuPutIn(backPackItem.GameItem);
                    StopCoroutine(ItemClick(backPackItem, false));
                }
                else
                {
                    LastPackItem = backPackItem;
                    LastClickTime = Time.time;
                    StartCoroutine(ItemClick(backPackItem, false));
                }
            }
        }
    }

    private void ShowTooltips(GameItem gameItem, bool isCangku)
    {
        if (gameItem != null && gameItem.IsValid())
        {
            if (gameItem.IsEquipMent())
            {
                if (isCangku)
                {
                    EquipTooltipsLogic.ShowEquipTooltip(gameItem, ItemTooltipsLogic.ShowType.CangKu, transform.position);
                }
                else
                {
                    EquipTooltipsLogic.ShowEquipTooltip(gameItem, ItemTooltipsLogic.ShowType.CangKuBackPack, transform.position);
                }

            }
            else if (gameItem.IsMagicMent())
            {
                if (isCangku)
                {
                    MagicTooltipLogic.ShowEquipTooltip(gameItem, ItemTooltipsLogic.ShowType.CangKu);
                }
                else
                {
                    MagicTooltipLogic.ShowEquipTooltip(gameItem, ItemTooltipsLogic.ShowType.CangKuBackPack);
                }
            }
            else
            {
                if (isCangku)
                {
                    ItemTooltipsLogic.ShowItemTooltip(gameItem, ItemTooltipsLogic.ShowType.CangKu, transform.position);
                }
                else
                {
                    ItemTooltipsLogic.ShowItemTooltip(gameItem, ItemTooltipsLogic.ShowType.CangKuBackPack, transform.position);
                }

            }
        }
    }

    /// <summary>
    /// 初始化背包部分
    /// </summary>
    void InitBackPack()
    {
        //UIManager.LoadItem(UIInfo.CangKuBackItem, OnLoadBackPackItem);
        UpdateBackPack();
    }

    

    /// <summary>
    /// 刷新背包部分
    /// </summary>
    public void UpdateBackPack()
    {
        UpdateBackPack_Item();
        UpdateBackPack_Money();
        UpdateBackPack_Size();
    }

    public void OnBtnBackpackSort()
    {
        CG_REQ_TIDY_PACK packet = (CG_REQ_TIDY_PACK)PacketDistributed.CreatePacket(MessageID.PACKET_CG_REQ_TIDY_PACK);
        packet.PackType = 0;
        packet.IsSort = 1;
        packet.SendPacket();

        //_BtnSortTime.SetBtnDisableTime(_BtnSortDisableTime);
        LogModule.DebugLog("Send sort packet");
    }

    void UpdateBackPack_Item()
    {
        GameItemContainer BackPack = GameManager.gameManager.PlayerDataPool.BackPack;
        //List<GameItem> itemlist = ItemTool.ItemFilter(BackPack, 0);
        List<GameItem> itemlist = BackPack.Items;
        List<CommonItemBackPackItem.BackPackItem> showItems = new List<CommonItemBackPackItem.BackPackItem>();
        for (int nIndex = 0; nIndex < GameItemContainer.MAXSIZE_BACKPACK; ++nIndex)
        {
            if (nIndex < BackPack.ContainerSize)
            {
                if (nIndex < itemlist.Count)
                {
                    showItems.Add(new CommonItemBackPackItem.BackPackItem() { GameItem = itemlist[nIndex], IsPosLock = false });
                }
                else
                {
                    showItems.Add(new CommonItemBackPackItem.BackPackItem() { GameItem = null, IsPosLock = false });
                }
            }
            else
            {
                showItems.Add(new CommonItemBackPackItem.BackPackItem() { GameItem = null, IsPosLock = true });
            }
        }
        _PackItemContainer.InitSelectContent(showItems, null, CandkuBackPackItemClick);
    }

    public void UpdateBackPack_Money()
    {
        //m_Moneyinfo_CoinLable.text = Utils.ConvertLargeNumToString(GameManager.gameManager.PlayerDataPool.Money.GetMoney_Coin());
        //m_Moneyinfo_YuanBaoLable.text = GameManager.gameManager.PlayerDataPool.Money.GetMoney_YuanBao().ToString();
        //m_Moneyinfo_YuanBaoBindLable.text = GameManager.gameManager.PlayerDataPool.Money.GetMoney_YuanBaoBind().ToString();
    }

    void UpdateBackPack_Size()
    {
        // 更新背包大小
        //GameItemContainer BackPack = GameManager.gameManager.PlayerDataPool.BackPack;
        //m_BackPakcSize.text = string.Format("{0}/{1}", BackPack.GetItemCount(), BackPack.ContainerSize);
    }

    public void OnClickClose()
    {
        UIManager.CloseUI(UIInfo.CangKu);
    }

    #endregion
}