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

public class MarketSystemLogic : UIControllerBase<MarketSystemLogic>
{
	// Use this for initialization
	void OnEnable ()
    {
        SetInstance(this);
        //_TagPanel.ShowPage(0);
        //OnTabPage(0);
        GUIData.delMoneyChanged += UpdateOwnMoney;
        UpdateOwnMoney();
    }

    void OnDisable()
    {
        SetInstance(null);
        GUIData.delMoneyChanged -= UpdateOwnMoney;
    }
	
    void Awake()
    {
        InitBuyPage();
    }

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

    public void OnTabPage(int page)
    {
        switch (page)
        {
            case 0:
                _OwnMoney.ShowOwnCurrency(MONEYTYPE.MONEYTYPE_YUANBAO_BIND);
                //InitBuyPage();
                break;
            case 1:
                InitSell();
                break;
        }
    }

    public void UpdateMarketItems(GC_UPDATE_SHOP_SYS_ITEM packet)
    {
        switch (_TagPanel.GetShowingPage())
        {
            case 0:
                UpdateMarketSysItems(packet);
                break;
            case 1:
                UpdateSellItem(packet);
                break;
        }
    }

    public void UpdateBackPackItems()
    {
        switch (_TagPanel.GetShowingPage())
        {
            case 0:
                UpdateBuyBackPackItems();
                break;
            case 1:
                UpdateSellBackPackItems();
                break;
        }
    }

    public void ShowSeletcedSell(GameItem sellItem)
    {
        _TagPanel.ShowPage(1);
        _DefaultSellItem = sellItem;
        UpdateSellBackPackItems();
    }

    public UITagPanel _TagPanel;

    #region buy page

    public UISubScollMenu _SubMenu;
    public UICurrencyItem _OwnMoney;
    public UINumBoardInput _BuyNum;
    public UIContainerSelect _ItemContainer;
    public Text _ItemOwnCnt;

    private ExchangeShopItem _SelectedItem;
    private int _DefaultSelectedItem = -1;
    private Market.MarketItemClass _SelectedClass;
    private GameItem _DefaultSellItem;

    public void InitBuyPage()
    {
        _SubMenu.PushMenu(new Market.MarketItemClass(3, 2));
        //_SubMenu.PushMenu(new Market.MarketItemClass(3, 1));
        //_SubMenu.PushMenu(Market.GetMarketClassName(4, -1), new Market.MarketItemClass[2] { new Market.MarketItemClass(4, 1), new Market.MarketItemClass(4, 2) });
        //_SubMenu.PushMenu(new Market.MarketItemClass(5, -1));
        //_SubMenu.ShowDefaultFirst();

        //_OwnMoney.ShowOwnCurrency(MONEYTYPE.MONEYTYPE_YUANBAO_BIND);
    }

    public void UpdateOwnMoney()
    {
        //_OwnMoney.ShowOwnCurrency(MONEYTYPE.MONEYTYPE_YUANBAO_BIND);
        _SellOwnMoney.ShowOwnCurrency(MONEYTYPE.MONEYTYPE_YUANBAO_BIND);
    }

    public void OnMenuSelect(int classType, int subClassType, int defaultSelectedItem = -1)
    {
        //CG_ASK_SHOP_SYS_ITEM packet = (CG_ASK_SHOP_SYS_ITEM)PacketDistributed.CreatePacket(MessageID.PACKET_CG_ASK_SHOP_SYS_ITEM);
        //packet.ItemClassId = classType;
        //packet.ItemSubClassId = subClassType;
        //packet.DataId = -1;
        //packet.SendPacket();

        _DefaultSelectedItem = defaultSelectedItem;
        foreach (var menuObj in _SubMenu.SubBtns)
        {
            if (menuObj.Value.Count > 0)
            {
                foreach (var menuSubObj in menuObj.Value)
                {
                    Market.MarketItemClass marketClass = menuSubObj.MenuObj as Market.MarketItemClass;
                    if (marketClass.ItemClass == classType && marketClass.ItemSubClass == subClassType)
                    {
                        _SubMenu.ShowMenu(menuObj.Key.MenuObj, menuSubObj.MenuObj);
                    }
                }
            }
            else
            {
                Market.MarketItemClass marketClass = menuObj.Key.MenuObj as Market.MarketItemClass;
                if (marketClass.ItemClass == classType && marketClass.ItemSubClass == subClassType)
                {
                    _SubMenu.ShowMenu(menuObj.Key.MenuObj);
                }
            }
            
        }
    }

    public void OnMenuSelect(object menuObj)
    {
        _SelectedClass = menuObj as Market.MarketItemClass;
        if (_SelectedClass == null)
            return;

        CG_ASK_SHOP_SYS_ITEM packet = (CG_ASK_SHOP_SYS_ITEM)PacketDistributed.CreatePacket(MessageID.PACKET_CG_ASK_SHOP_SYS_ITEM);
        packet.ItemClassId = _SelectedClass.ItemClass;
        packet.ItemSubClassId = _SelectedClass.ItemSubClass;
        packet.DataId = -1;
        packet.SendPacket();

        LogModule.DebugLog(menuObj.ToString());

        //List<ExchangeShopItem> itemList = new List<ExchangeShopItem>();
        //itemList.Add(new ExchangeShopItem() { DataId = 1201, CurPrice = 40, NewPrice = 42, HadBuyNum = 4});
        //itemList.Add(new ExchangeShopItem() { DataId = 1202, CurPrice = 40, NewPrice = 38, HadBuyNum = 3 });
        //itemList.Add(new ExchangeShopItem() { DataId = 1203, CurPrice = 40, NewPrice = 45, HadBuyNum = 2 });
        //itemList.Add(new ExchangeShopItem() { DataId = 1204, CurPrice = 40, NewPrice = 30, HadBuyNum = 1 });
        //itemList.Add(new ExchangeShopItem() { DataId = 1205, CurPrice = 40, NewPrice = 42, HadBuyNum = 4 });
        //itemList.Add(new ExchangeShopItem() { DataId = 1206, CurPrice = 40, NewPrice = 42, HadBuyNum = 4 });
        //itemList.Add(new ExchangeShopItem() { DataId = 1207, CurPrice = 40, NewPrice = 42, HadBuyNum = 4 });
        //itemList.Add(new ExchangeShopItem() { DataId = 1208, CurPrice = 40, NewPrice = 42, HadBuyNum = 4 });
        //itemList.Add(new ExchangeShopItem() { DataId = 1209, CurPrice = 40, NewPrice = 42, HadBuyNum = 4 });
        //itemList.Add(new ExchangeShopItem() { DataId = 1210, CurPrice = 40, NewPrice = 42, HadBuyNum = 4 });

        //_ItemContainer.InitSelectContent(itemList, new List<ExchangeShopItem>() { itemList[0]}, OnItemSelect);
    }

    private void UpdateMarketSysItems(GC_UPDATE_SHOP_SYS_ITEM packet)
    {
        if (packet.shopItemsList.Count == 1)
        {
            var packetItem = packet.GetShopItems(0);
            _ItemContainer.ForeachActiveItem<MarketSystemItem>((shopItem) =>
            {
                if (shopItem.ShowMarketItem.DataId == packetItem.DataId)
                {
                    shopItem.UpdateMarketItem(packetItem);
                    OnItemSelect(packetItem);
                }
            });
            return;
        }

        for (int i = 0; i < packet.shopItemsList.Count; ++i)
        {
            LogModule.DebugLog("packet shop item:" + packet.shopItemsList[i].DataId);
        }

        if (_SelectedClass != null && _SelectedClass.ItemClass == 5)
        {
            List<ExchangeShopItem> expBookItems = new List<ExchangeShopItem>();
            List<ExchangeShopItem> selectItems = new List<ExchangeShopItem>();
            var shopItemTabs = TableManager.GetExchangeMarket().Values;
            foreach (var shopItem in shopItemTabs)
            {
                if (shopItem.ClassType == 5)
                {
                    ExchangeShopItem expBook = null;
                    for (int i = 0; i < packet.shopItemsList.Count; ++i)
                    {
                        if (packet.shopItemsList[i].DataId == shopItem.Id)
                        {
                            expBook = packet.shopItemsList[i];
                            break;
                        }
                    }
                    if (expBook == null)
                    {
                        expBook = new ExchangeShopItem();
                        expBook.DataId = shopItem.Id;
                        expBook.CurPrice = -1;
                        expBook.HadBuyNum = -1;
                    }
                    expBookItems.Add(expBook);

                    if (shopItem.Id == _DefaultSelectedItem)
                    {
                        selectItems.Add(expBook);
                    }
                }
            }
            if (selectItems.Count == 0)
            {
                selectItems.Add(expBookItems[0]);
            }
            _ItemContainer.InitSelectContent(expBookItems, selectItems, OnItemSelect);
        }
        else
        {
            List<ExchangeShopItem> selectItems = new List<ExchangeShopItem>();
            if (_DefaultSelectedItem > 0)
            {
                for (int i = 0; i < packet.shopItemsList.Count; ++i)
                {
                    if (packet.shopItemsList[i].DataId == _DefaultSelectedItem)
                    {
                        selectItems.Add(packet.shopItemsList[i]);
                        break;
                    }
                }
            }
            else
            {
                if (packet.shopItemsList.Count != 0)
                {
                    selectItems.Add(packet.shopItemsList[0]);
                }
                else
                {
                    LogModule.ErrorLog("packet.shopItemsList length is 0!!!");
                }
            }
            _ItemContainer.InitSelectContent(packet.shopItemsList, selectItems, OnItemSelect);
        }

    }

    private void UpdateBuyBackPackItems()
    {
        if (_SelectedItem != null)
        {
            var ownItemCnt = GameManager.gameManager.PlayerDataPool.BackPack.GetItemCountByDataId(_SelectedItem.DataId);
            
            _ItemOwnCnt.text = StrDictionary.GetClientDictionaryString("#{9301}", ownItemCnt);

            RefreshBuyNum();
        }
        //_OwnMoney.ShowOwnCurrency(MONEYTYPE.MONEYTYPE_YUANBAO_BIND);
    }

    private void OnItemSelect(object selectItem)
    {
        _SelectedItem = selectItem as ExchangeShopItem;

        var ownItemCnt = GameManager.gameManager.PlayerDataPool.BackPack.GetItemCountByDataId(_SelectedItem.DataId);
        _ItemOwnCnt.text = StrDictionary.GetClientDictionaryString("#{9301}", ownItemCnt);

        RefreshBuyNum();
    }

    private void RefreshBuyNum()
    {
        if (_SelectedItem == null)
            return;

        var ownvalue = GameManager.gameManager.PlayerDataPool.GetLongPropty((int)CONSUM_TYPE.MONEY, (int)MONEYTYPE.MONEYTYPE_YUANBAO_BIND);
        int canBuyNum = (int)(ownvalue / _SelectedItem.CurPrice);
        var marketItemTab = TableManager.GetExchangeMarketByID(_SelectedItem.DataId, 0);
        int limitBuyCnt = canBuyNum;
        if (marketItemTab.LimitNum > 0)
        {
            int limitCnt = marketItemTab.LimitNum - _SelectedItem.HadBuyNum;
            limitBuyCnt = Mathf.Min(canBuyNum, limitCnt);
        }
        if (marketItemTab.ClassType == 5)
        {
            limitBuyCnt = 1;
        }
        limitBuyCnt = Mathf.Clamp(limitBuyCnt, 1, 999);
        _BuyNum.Init(1, 1, limitBuyCnt);
    }

    public void OnBtnBuy()
    {
        if (_SelectedItem == null)
            return;

        CG_SHOP_SYS_HANDDLE packet = (CG_SHOP_SYS_HANDDLE)PacketDistributed.CreatePacket(MessageID.PACKET_CG_SHOP_SYS_HANDDLE);
        packet.HanddleType = 1;
        packet.ItemDataId = _SelectedItem.DataId;
        packet.ItemNum = _BuyNum.Value;
        packet.SendPacket();
        LogModule.DebugLog("OnBtnBuy:" + _SelectedItem.DataId);

        //CG_ASK_SHOP_SYS_ITEM shopItemPacket = (CG_ASK_SHOP_SYS_ITEM)PacketDistributed.CreatePacket(MessageID.PACKET_CG_ASK_SHOP_SYS_ITEM);
        //shopItemPacket.ItemClassId = -1;
        //shopItemPacket.ItemSubClassId = -1;
        //shopItemPacket.DataId = _SelectedItem.DataId;
        //packet.SendPacket();
    }
    #endregion

    #region sell page

    public UIContainerSelect _SellItems;
    public UIDynamicText _ItemDesc;
    public Text _Name;
    public Text _Num;
    public Text _SellPriceUp;
    public Text _SellPriceDown;
    public UINumBoardInput _SellNum;
    public UICurrencyItem _TotleMoney;
    public UICurrencyItem _SellOwnMoney;
    public GameObject _InfoGO;

    private ExchangeShopItem _SellItemInfo;
    private GameItem _SelectedSellItem;

    public void InitSell()
    {
        UpdateSellBackPackItems();
    }

    private void OnSelectSellItem(object selectGO)
    {
        _InfoGO.SetActive(true);
        _SelectedSellItem = selectGO as GameItem;

        var commonItem = TableManager.GetCommonItemByID(_SelectedSellItem.DataID, 0);
        _ItemDesc.SetText(StrDictionary.GetClientString_WithNameSex(commonItem.Tips));
        _Name.text = commonItem.Name;
        _Num.text = _SelectedSellItem.StackCount.ToString();
        //_SellOwnMoney.ShowOwnCurrency(MONEYTYPE.MONEYTYPE_YUANBAO_BIND);
        UpdateOwnMoney();
        _SellNum.Init(1, 1, _SelectedSellItem.StackCount);

        CG_ASK_SHOP_SYS_ITEM packet = (CG_ASK_SHOP_SYS_ITEM)PacketDistributed.CreatePacket(MessageID.PACKET_CG_ASK_SHOP_SYS_ITEM);
        packet.ItemClassId = -1;
        packet.ItemSubClassId = -1;
        packet.DataId = _SelectedSellItem.DataID;
        packet.SendPacket();
    }

    private void UpdateSellItem(GC_UPDATE_SHOP_SYS_ITEM packet)
    {
        if (packet.shopItemsCount > 0)
        {
            _SellItemInfo = packet.GetShopItems(0);
            _TotleMoney.ShowCurrency(MONEYTYPE.MONEYTYPE_YUANBAO_BIND, _SellItemInfo.NewPrice * _SellNum.Value);
            float delta = (_SellItemInfo.NewPrice - _SellItemInfo.CurPrice) / ((float)_SellItemInfo.CurPrice) * 100.0f;
            if (delta > 0)
            {
                _SellPriceUp.gameObject.SetActive(true);
                _SellPriceDown.gameObject.SetActive(false);
                _SellPriceUp.text = string.Format("{0:0.00}", delta) + "%";
            }
            else if (delta < 0)
            {
                _SellPriceUp.gameObject.SetActive(false);
                _SellPriceDown.gameObject.SetActive(true);
                _SellPriceDown.text = string.Format("{0:0.00}", delta) + "%";
            }
            else
            {
                _SellPriceUp.gameObject.SetActive(false);
                _SellPriceDown.gameObject.SetActive(false);
            }
        }
    }

    private void UpdateSellBackPackItems()
    {
        _SellPriceUp.gameObject.SetActive(false);
        _SellPriceDown.gameObject.SetActive(false);

        var itemList = GameManager.gameManager.PlayerDataPool.BackPack.GetList();
        List<GameItem> containerItems = new List<GameItem>();
        foreach (var ownItem in itemList)
        {
            if (!ownItem.IsValid())
                continue;

            if (ownItem.BindFlag == true)
                continue;

            var marketItemTab = TableManager.GetExchangeMarketByID(ownItem.DataID, 0);
            if (marketItemTab == null)
                continue;

            containerItems.Add(ownItem);
        }

        if (containerItems.Count > 0)
        {
            var selectedItem = _SelectedSellItem;
            if (_DefaultSellItem != null)
            {
                selectedItem = _DefaultSellItem;
            }
            if (!containerItems.Contains(selectedItem))
            {
                selectedItem = containerItems[0];
            }

            _SellItems.InitSelectContent(containerItems, new List<GameItem>() { selectedItem }, OnSelectSellItem);
            _DefaultSellItem = null;

        }
        else
        {
            _InfoGO.SetActive(false);
            _SellItems.InitSelectContent(containerItems, null, OnSelectSellItem);
            _ItemDesc.SetText("");
            _Name.text = "";
            _Num.text = "";
            _TotleMoney.ShowCurrency(MONEYTYPE.MONEYTYPE_YUANBAO_BIND, 0);
            _SellNum.Init(0, 0, 0);
        }
        //_SellOwnMoney.ShowOwnCurrency(MONEYTYPE.MONEYTYPE_YUANBAO_BIND);
        UpdateOwnMoney();
    }

    public void OnSellNumChange()
    {
        if (_SellItemInfo != null)
        {
            _TotleMoney.ShowCurrency(MONEYTYPE.MONEYTYPE_YUANBAO_BIND, _SellItemInfo.NewPrice * _SellNum.Value);
        }
        else
        {
            _TotleMoney.ShowCurrency(MONEYTYPE.MONEYTYPE_YUANBAO_BIND, 0);
        }
    }

    public void OnBtnSell()
    {
        if (_SelectedSellItem == null)
            return;

        CG_SHOP_SYS_HANDDLE packet = (CG_SHOP_SYS_HANDDLE)PacketDistributed.CreatePacket(MessageID.PACKET_CG_SHOP_SYS_HANDDLE);
        packet.HanddleType = 2;
        packet.ItemDataId = _SelectedSellItem.DataID;
        packet.ItemNum = _SellNum.Value;
        packet.SendPacket();
        LogModule.DebugLog("Sell:" + _SelectedSellItem.DataID + " Num:" + _SellNum.Value);
    }

    #endregion


}