using UI.CommonGame;
using System;
using FairyGUI;
using System.Collections.Generic;
using UnityEngine;
namespace GFGGame
{
    public class BuyCountView : BaseWindow
    {
        private UI_BuyCountUI _ui;
        // private ClothingShopCfg _cfg;
        private float _selectTimeCount = 0;//长按时间
        private int _consumeSelectIndex = 0;//0为减,1为加
        private float _delay = 300;
        private float longpress = 900;//大于900毫秒才算长按
        /// 
        /// 购买物品编号
        /// 
        private int _buyId;
        /// 
        /// 最低购买次数
        /// 
        private int _minBuyCount;
        /// 
        /// 当前购买次数
        /// 
        private int _count;
        /// 
        /// 购买消耗Id
        /// 
        private int _costId;//购买消耗Id
        /// 
        /// 购买物品数量
        /// 
        private int _buyNum;
        /// 
        /// 购买物品消耗数量
        /// 
        private int _costNum;
        /// 
        /// 最大购买次数
        /// 
        private int _maxCanBuy;
        // private int _perCount;
        // private int _perCostCount;
        // private int _maxCount;
        private bool _openSource;
        private bool _showTips;
        private int _buyType;
        private int _shopType;
        private int _itemId;
        private Action _onSuccess;
        public override void Dispose()
        {
            base.Dispose();
        }
        protected override void OnInit()
        {
            base.OnInit();
            _ui = UI_BuyCountUI.Create();
            this.viewCom = _ui.target;
            this.viewCom.Center();
            this.modal = true;
            viewAnimationType = EnumViewAnimationType.ZOOM_CENTER;
            _ui.m_btnPlus.onClick.Add(OnClickBtnPlus);
            _ui.m_btnMinus.onClick.Add(OnClickBtnMinus);
            _ui.m_btnAll.onClick.Add(OnClickBtnAll);
            _ui.m_btnPlus.onTouchBegin.Add(OnTouchPlusBegin);
            _ui.m_btnMinus.onTouchBegin.Add(OnTouchMinusBegin);
            _ui.m_btnPlus.onTouchEnd.Add(() => { Timers.inst.Remove(OnTimedEvent); });
            _ui.m_btnMinus.onTouchEnd.Add(() => { Timers.inst.Remove(OnTimedEvent); });
            _ui.m_btnSure.onClick.Add(OnClickBtnSure);
            _ui.m_btnCancel.onClick.Add(OnClickBtnCancel);
        }
        /// 
        /// 
        /// 
        /// 购买物品对应的编号,非必须为物品Id
        /// 最低兑换个数
        /// 购买类型,对应ConstBuyType
        /// 商店类型,仅buytype为TYPE_SHOP时有用
        /// 
        /// 是否弹购买成功飘字,默认是
        /// 是否打开来源界面。默认否
        /// 
        public void SetParams(int buyId, int minBuyCount, int buyType, int shopType = 0, Action onSuccess = null, bool showTips = true, bool openSource = false, int maxCount = 9990)
        {
            _buyId = buyId;
            _itemId = buyId;
            _minBuyCount = minBuyCount;
            _count = _minBuyCount;
            _onSuccess = onSuccess;
            _openSource = openSource;
            _showTips = showTips;
            _buyType = buyType;
            _shopType = shopType;
            if (buyType == ConstBuyType.TYPE_SHOP)
            {
                ShopCfg shopCfg = ClothingShopCfgManager.Instance.GetShopCfg(buyId, shopType);
                int maxBuyCount = (int)Math.Floor((decimal)(ItemDataManager.GetItemNum(shopCfg.costID) / shopCfg.costNum));
                _maxCanBuy = Math.Min(maxCount, maxBuyCount);
                _itemId = shopCfg.itemID;
            }
            else if (buyType == ConstBuyType.TYPE_ITEM)
            {
                ItemExchangeCfg itemExchangeCfg = ItemExchangeCfgArray.Instance.GetCfg(buyId);
                _count = (int)Math.Ceiling(Convert.ToDecimal(minBuyCount) / Convert.ToDecimal(itemExchangeCfg.num));
                int maxBuyCount = (int)Math.Floor((decimal)(ItemDataManager.GetItemNum(itemExchangeCfg.costId) / itemExchangeCfg.costNumArr[0]));
                _maxCanBuy = Math.Min(Math.Min(maxCount, maxBuyCount), itemExchangeCfg.maxLimit == 0 ? maxCount : itemExchangeCfg.maxLimit - ItemDataManager.GetItemExchangeTimes(buyId));
                _itemId = buyId;
            }
            GetMoneyIdAndNum(minBuyCount, out _costId, out _costNum, out _buyNum);
        }
        protected override void OnShown()
        {
            base.OnShown();
            UpdateView();
        }
        private void UpdateView()
        {
            ItemCfg itemCfg = ItemCfgArray.Instance.GetCfg(_itemId);
            _ui.m_icon.url = ResPathUtil.GetIconPath(itemCfg);
            _ui.m_txtName.text = itemCfg.name;
            _ui.m_rarity.visible = false;
            if (ItemUtilCS.IsDressUpItem(_itemId))
            {
                _ui.m_rarity.visible = true;
                RarityIconController.UpdateRarityIcon(_ui.m_rarity, _itemId, false);
            }
            ItemCfg costItemCfg = ItemCfgArray.Instance.GetCfg(_costId);
            _ui.m_iconPrice.url = ResPathUtil.GetCommonGameResPath(costItemCfg.res);
            _ui.m_txtBuyTips.visible = false;
            UpdateCost();
        }
        private void UpdateCost()
        {
            GetMoneyIdAndNum(_count, out _costId, out _costNum, out _buyNum);
            _ui.m_txtCount.text = _buyNum.ToString();
            _ui.m_txtPrice.text = _costNum.ToString();
            SetBtnState();
        }
        private void OnClickBtnAll()
        {
            _count = _maxCanBuy;
            UpdateCost();
        }
        private void OnClickBtnPlus()
        {
            if (_count < _maxCanBuy)
            {
                _count += 1;
            }
            UpdateCost();
        }
        private void OnClickBtnMinus()
        {
            _count -= 1;
            _count = Math.Max(_minBuyCount, _count);
            UpdateCost();
        }
        private void SetBtnState()
        {
            string inputStr = _ui.m_txtCount.text.Trim();
            if (_count <= _minBuyCount)
            {
                _ui.m_btnMinus.enabled = false;
            }
            else
            {
                _ui.m_btnMinus.enabled = true;
            }
            if (_count >= _maxCanBuy)
            {
                _ui.m_btnPlus.enabled = false;
                _ui.m_btnAll.enabled = false;
            }
            else
            {
                _ui.m_btnPlus.enabled = true;
                _ui.m_btnAll.enabled = true;
            }
        }
        private async void OnClickBtnSure()
        {
            int count = int.Parse(_ui.m_txtCount.text.Trim());
            int price = int.Parse(_ui.m_txtPrice.text.Trim());
            if (_count > 0)
            {
                if (price > ItemDataManager.GetItemNum(_costId))
                {
                    if (_openSource)
                    {
                        if (_buyId == ConstItemID.DIAMOND_RED)
                        {
                            ItemUtil.AddDiamondPurple();
                        }
                    }
                    else
                    {
                        ItemCfg costCfg = ItemCfgArray.Instance.GetCfg(_costId);
                        PromptController.Instance.ShowFloatTextPrompt(string.Format("{0}不足!", costCfg.name));
                    }
                }
                else
                {
                    bool result = false;
                    switch (_buyType)
                    {
                        case ConstBuyType.TYPE_NORMAL:
                            break;
                        case ConstBuyType.TYPE_ITEM:
                            result = await ItemExchangeSProxy.ItemExchange(_buyId, _count);
                            break;
                        case ConstBuyType.TYPE_SHOP:
                            result = await ShopSProxy.ShopBuy(_shopType, _buyId, _count);
                            break;
                    }
                    if (_onSuccess != null)
                    {
                        _onSuccess();
                    }
                    if (result && _showTips)
                    {
                        PromptController.Instance.ShowFloatTextPrompt("购买成功", MessageType.SUCCESS);
                    }
                }
            }
            else
            {
                PromptController.Instance.ShowFloatTextPrompt("购买异常", MessageType.ERR);
            }
            this.Hide();
        }
        private void OnClickBtnCancel()
        {
            this.Hide();
        }
        private void GetMoneyIdAndNum(int count, out int _costId, out int _costNum, out int _buyNum)
        {
            _costId = 0;
            _costNum = 0;
            _buyNum = 0;
            if (_buyType == ConstBuyType.TYPE_SHOP)
            {
                ClothingShopCfgManager.Instance.GetMoneyIdAndNum(_buyId, count, _shopType, out _costId, out _costNum, out _buyNum);
            }
            else if (_buyType == ConstBuyType.TYPE_ITEM)
            {
                ItemExchangeCfg itemExchangeCfg = ItemExchangeCfgArray.Instance.GetCfg(_itemId);
                int _exchangeCount = (int)Math.Ceiling(Convert.ToDecimal(count) / Convert.ToDecimal(itemExchangeCfg.num));
                ItemExchangeCfgArray.Instance.GetMoneyIdAndNum(_itemId, ItemDataManager.GetItemExchangeTimes(_itemId), count, out _costId, out _costNum, out _buyNum);
            }
        }
        private void OnTouchPlusBegin()
        {
            _selectTimeCount = 0;
            _consumeSelectIndex = 1;
            Timers.inst.Add(_delay / 1000, 0, OnTimedEvent);
        }
        private void OnTouchMinusBegin()
        {
            _selectTimeCount = 0;
            _consumeSelectIndex = 0;
            Timers.inst.Add(_delay / 1000, 0, OnTimedEvent);
        }
        private void OnTimedEvent(object param)
        {
            _selectTimeCount += _delay;
            if (_selectTimeCount >= longpress)
            {
                if (_consumeSelectIndex == 0)
                {
                    if (!CommonUtil.Instance.CheckPointIsOnComponent(_ui.m_btnMinus, CommonUtil.Instance.GetMouseV2Point()))
                    {
                        Timers.inst.Remove(OnTimedEvent);
                        return;
                    }
                    this.OnClickBtnMinus();
                }
                else
                {
                    if (!CommonUtil.Instance.CheckPointIsOnComponent(_ui.m_btnPlus, CommonUtil.Instance.GetMouseV2Point()))
                    {
                        Timers.inst.Remove(OnTimedEvent);
                        return;
                    }
                    this.OnClickBtnPlus();
                }
            }
        }
        public void Reset()
        {
            _buyId = 0;
            _costId = 0;
            // _perCount = 0;
            // _perCostCount = 0;
            _minBuyCount = 0;
            // _maxCount = 0;
        }
        protected override void OnHide()
        {
            base.OnHide();
            // _cfg = null;
            Reset();
        }
        /// 
        /// 是否显示购买提示
        /// 
        /// 
        public bool showTxtBuyTips
        {
            set
            {
                _ui.m_txtBuyTips.visible = value;
            }
        }
        protected override void UpdateToCheckGuide(object param)
        {
            if (!ViewManager.CheckIsTopView(this.viewCom)) return;
            GuideController.TryGuide(_ui.m_btnSure, ConstGuideId.BUY_CLOTHING, 3, "找到需要的物品了,点击购买吧");
        }
    }
}