using System; 
 | 
using System.Collections.Generic; 
 | 
using UnityEngine.UI; 
 | 
using System.Linq; 
 | 
using LitJson; 
 | 
  
 | 
public class InvestModel : GameSystemManager<InvestModel> 
 | 
{ 
 | 
    // public ILOpenServerActivityProxy activity; 
 | 
  
 | 
    public const int FuncID = 119; 
 | 
  
 | 
  
 | 
    //投资对应奖励 
 | 
    Dictionary<int, Dictionary<int, List<Item>>> m_InvestItems = new Dictionary<int, Dictionary<int, List<Item>>>(); 
 | 
    //投资对应充值ID 
 | 
    Dictionary<int, int[]> m_InvestRechargeIds = new Dictionary<int, int[]>(); 
 | 
    //投资对应购买情况 
 | 
    Dictionary<int, InvestInfo> m_InvestInfos = new Dictionary<int, InvestInfo>(); 
 | 
    //{投资类型:[领取天,当前天]} 天从1开始 
 | 
    Dictionary<int, List<List<int>>> m_InvestSingleInfos = new Dictionary<int, List<List<int>>>(); 
 | 
    //投资对应的红点 
 | 
    Dictionary<int, Redpoint> m_Redpoints = new Dictionary<int, Redpoint>(); 
 | 
    //投资类型 
 | 
    public List<int> investTypes = new List<int>(); 
 | 
  
 | 
  
 | 
    //永久卡 权限 
 | 
    public const int foreverCardType = 12; //投资类型    
 | 
    public const int monthCardType = 7; // 月卡7 
 | 
  
 | 
  
 | 
  
 | 
    public event Action onSelectUpdate; 
 | 
    public event Action<int> onInvestUpdate; 
 | 
  
 | 
    public const int redpointID = 20931; 
 | 
    public Redpoint redpoint = new Redpoint(MainRedDot.REDPOINT_OPENSERVER, redpointID); 
 | 
  
 | 
  
 | 
    public override void Init() 
 | 
    { 
 | 
        FuncOpen.Instance.OnFuncStateChangeEvent += OnFuncStateChangeEvent; 
 | 
        DTC0102_tagCDBPlayer.beforePlayerDataInitializeEvent += OnBeforePlayerDataInitialize; 
 | 
        DTC0403_tagPlayerLoginLoadOK.playerLoginOkEvent += OnPlayerLoginOk; 
 | 
  
 | 
        //通过配置决定是否有此投资项,如港台没有登录投资 
 | 
        ParseConfig(); 
 | 
  
 | 
    } 
 | 
  
 | 
  
 | 
  
 | 
    public override void Release() 
 | 
    { 
 | 
        FuncOpen.Instance.OnFuncStateChangeEvent -= OnFuncStateChangeEvent; 
 | 
        DTC0102_tagCDBPlayer.beforePlayerDataInitializeEvent -= OnBeforePlayerDataInitialize; 
 | 
        DTC0403_tagPlayerLoginLoadOK.playerLoginOkEvent -= OnPlayerLoginOk; 
 | 
    } 
 | 
  
 | 
    public bool IsOpen() 
 | 
    { 
 | 
        return FuncOpen.Instance.IsFuncOpen(FuncID); 
 | 
    } 
 | 
  
 | 
     
 | 
    public void OnBeforePlayerDataInitialize() 
 | 
    { 
 | 
        m_InvestInfos.Clear(); 
 | 
        m_InvestSingleInfos.Clear(); 
 | 
    } 
 | 
  
 | 
    public void OnPlayerLoginOk() 
 | 
    { 
 | 
        UpdateRedpoint(); 
 | 
    } 
 | 
  
 | 
  
 | 
    void ParseConfig() 
 | 
    { 
 | 
        investTypes.Clear(); 
 | 
        var funcConfig = FuncConfigConfig.Get("InvestCost"); 
 | 
        m_InvestRechargeIds = ConfigParse.ParseIntArrayDict(funcConfig.Numerical3); 
 | 
        //m_Redpoints 
 | 
  
 | 
        investTypes = m_InvestRechargeIds.Keys.ToList(); 
 | 
  
 | 
        investTypes.Sort(); 
 | 
  
 | 
        var configs = InvestConfig.GetValues(); 
 | 
        for (int i = 0; i < configs.Count; i++) 
 | 
        { 
 | 
            var config = configs[i]; 
 | 
            if (!investTypes.Contains(config.type)) 
 | 
            { 
 | 
                continue; 
 | 
            } 
 | 
  
 | 
            Dictionary<int, List<Item>> dict; 
 | 
            if (!m_InvestItems.TryGetValue(config.type, out dict)) 
 | 
            { 
 | 
                dict = new Dictionary<int, List<Item>>(); 
 | 
                m_InvestItems.Add(config.type, dict); 
 | 
            } 
 | 
  
 | 
            List<Item> items; 
 | 
            if (!dict.TryGetValue(config.id, out items)) 
 | 
            { 
 | 
                items = new List<Item>(); 
 | 
                dict.Add(config.id, items); 
 | 
            } 
 | 
  
 | 
            var itemArray = config.award[1];    //1暂时约定月卡 永久卡,其他的自定义后续再定 
 | 
            for (int j = 0; j < itemArray.Length; j++) 
 | 
            { 
 | 
                items.Add(new Item() 
 | 
                { 
 | 
                    id = itemArray[j][0], 
 | 
                    countEx = itemArray[j][1], 
 | 
                    bind = itemArray[j][2], 
 | 
                }); 
 | 
            } 
 | 
        } 
 | 
    } 
 | 
  
 | 
    public OrderInfoConfig GetOrderInfoId(int type) 
 | 
    { 
 | 
        var ids = m_InvestRechargeIds[type]; 
 | 
        for (int i = 0; i < ids.Length; i++) 
 | 
        { 
 | 
            OrderInfoConfig config; 
 | 
            if (RechargeManager.Instance.TryGetOrderInfo(ids[i], out config)) 
 | 
            { 
 | 
                return config; 
 | 
            } 
 | 
        } 
 | 
        return null; 
 | 
    } 
 | 
  
 | 
  
 | 
    public bool hasInvestType(int type) 
 | 
    { 
 | 
        return investTypes.Contains(type); 
 | 
    } 
 | 
  
 | 
  
 | 
    public int GetInvestPassDays(int type) 
 | 
    { 
 | 
        return m_InvestInfos.ContainsKey(type) ? m_InvestInfos[type].days : 0; 
 | 
    } 
 | 
  
 | 
    //获得单投资的总收益 
 | 
    public long GetTotalIncome(int type) 
 | 
    { 
 | 
        long income = 0; 
 | 
        if (m_InvestItems.ContainsKey(type)) 
 | 
        { 
 | 
            var keyList = m_InvestItems[type].Keys.ToList(); 
 | 
            for (int i = 0; i < keyList.Count; i++) 
 | 
            { 
 | 
                var items = m_InvestItems[type][keyList[i]]; 
 | 
                for (var j = 0; j < items.Count; j++) 
 | 
                { 
 | 
                    var item = items[j]; 
 | 
                    if (item.id == 20 || item.id == 30) 
 | 
                        income += item.countEx; 
 | 
                } 
 | 
            } 
 | 
        } 
 | 
        return income; 
 | 
    } 
 | 
  
 | 
  
 | 
    //id 为表里的ID 
 | 
    //0-未投资 1-未达成 2-可领取 3-已领取 
 | 
    public int GetSingleInvestState(int type, int id) 
 | 
    { 
 | 
        if (IsInvested(type)) 
 | 
        { 
 | 
            var day = GetInvestPassDays(type); 
 | 
            if (m_InvestItems.ContainsKey(type) 
 | 
                && m_InvestItems[type].ContainsKey(id)) 
 | 
            { 
 | 
                if (IsRewardGot(type, id)) 
 | 
                { 
 | 
                    return 3; 
 | 
                } 
 | 
                var config = InvestConfig.Get(id); 
 | 
  
 | 
                if (!m_InvestSingleInfos.ContainsKey(type)) 
 | 
                { 
 | 
                    return 0; 
 | 
                } 
 | 
  
 | 
                var index = id % 100; 
 | 
                //每个数按位存31个激活索引 
 | 
                var listIndex = index / 31; 
 | 
                var bitIndex = index % 31; 
 | 
  
 | 
  
 | 
                return day < config.needDay ? 1 : 2; 
 | 
            } 
 | 
        } 
 | 
        return 0; 
 | 
    } 
 | 
  
 | 
  
 | 
  
 | 
    public bool TryGetItems(int type, int id, out List<Item> items) 
 | 
    { 
 | 
        items = null; 
 | 
        if (m_InvestItems.ContainsKey(type)) 
 | 
        { 
 | 
            return m_InvestItems[type].TryGetValue(id, out items); 
 | 
        } 
 | 
        return false; 
 | 
    } 
 | 
  
 | 
    public List<int> GetIdsByType(int type) 
 | 
    { 
 | 
        if (m_InvestItems.ContainsKey(type)) 
 | 
        { 
 | 
            return m_InvestItems[type].Keys.ToList(); 
 | 
        } 
 | 
        return null; 
 | 
    } 
 | 
  
 | 
    //判断是否购买了投资 
 | 
    public bool IsInvested(int type) 
 | 
    { 
 | 
        return m_InvestInfos.ContainsKey(type) && m_InvestInfos[type].money > 0; 
 | 
    } 
 | 
  
 | 
    //奖励是否已领取 
 | 
    public bool IsRewardGot(int type, int id) 
 | 
    { 
 | 
        if (m_InvestSingleInfos.ContainsKey(type)) 
 | 
        { 
 | 
            var index = id % 100; 
 | 
            //每个数按位存31个激活索引 
 | 
            var listIndex = index / 31; 
 | 
            var bitIndex = index % 31; 
 | 
            return ((int)Math.Pow(2, bitIndex) & m_InvestSingleInfos[type][1][listIndex]) != 0; 
 | 
        } 
 | 
        return false; 
 | 
    } 
 | 
  
 | 
  
 | 
    private void OnFuncStateChangeEvent(int id) 
 | 
    { 
 | 
        if (id == FuncID) 
 | 
        { 
 | 
            // activity.StateUpdate(id); 
 | 
            UpdateRedpoint(); 
 | 
        } 
 | 
  
 | 
    } 
 | 
  
 | 
     
 | 
  
 | 
    public void SendGetReward(int type, int id) 
 | 
    { 
 | 
        var pak = new CA541_tagCMGetInvestReward(); 
 | 
        pak.InvestType = (byte)type; 
 | 
        pak.RewardIndex = (byte)(id % 100); 
 | 
        GameNetSystem.Instance.SendInfo(pak); 
 | 
    } 
 | 
  
 | 
    //购买投资 
 | 
    public void BuyInvest(int type) 
 | 
    { 
 | 
        RechargeManager.Instance.CTG(GetOrderInfoId(type)); 
 | 
    } 
 | 
  
 | 
    public void UpdateInvestInfo(HA338_tagMCInvestInfo package) 
 | 
    { 
 | 
        if (!investTypes.Contains(package.InvestType)) 
 | 
        { 
 | 
            return; 
 | 
        } 
 | 
  
 | 
        m_InvestInfos[package.InvestType] = new InvestInfo() 
 | 
        { 
 | 
            days = (int)package.CurDay, 
 | 
            money = package.CurDay >= 1 ? 1 : 0, 
 | 
        }; 
 | 
  
 | 
        List<List<int>> singleInfos; 
 | 
        if (!m_InvestSingleInfos.TryGetValue(package.InvestType, out singleInfos)) 
 | 
        { 
 | 
            singleInfos = new List<List<int>>(); 
 | 
            m_InvestSingleInfos.Add(package.InvestType, singleInfos); 
 | 
        } 
 | 
        singleInfos.Clear(); 
 | 
        singleInfos.Add(new List<int>()); 
 | 
        singleInfos.Add(new List<int>()); 
 | 
        singleInfos.Add(new List<int>()); 
 | 
        singleInfos[0].Add((int)package.CurDay); 
 | 
        for (int i = 0; i < package.ValueCount; i++) 
 | 
        { 
 | 
            singleInfos[1].Add((int)package.RewardValue[i]); 
 | 
            singleInfos[2].Add((int)package.ProgressValue[i]); 
 | 
        } 
 | 
        UpdateRedpoint(); 
 | 
  
 | 
        if (onInvestUpdate != null) 
 | 
        { 
 | 
            onInvestUpdate(package.InvestType); 
 | 
        } 
 | 
    } 
 | 
  
 | 
    void UpdateRedpoint() 
 | 
    { 
 | 
        List<int> redpointTypes = new List<int>(); 
 | 
        if (IsOpen()) 
 | 
        { 
 | 
            for (var i = 0; i < investTypes.Count; i++) 
 | 
            { 
 | 
                var type = investTypes[i]; 
 | 
                if (!IsInvested(type)) 
 | 
                { 
 | 
                    continue; 
 | 
                } 
 | 
                var keyList = m_InvestItems[type].Keys.ToList(); 
 | 
                for (int j = 0; j < keyList.Count; j++) 
 | 
                { 
 | 
                    var id = keyList[j]; 
 | 
                    if (GetSingleInvestState(type, id) == 2) 
 | 
                    { 
 | 
                        redpointTypes.Add(type); 
 | 
                        break; 
 | 
                    } 
 | 
                } 
 | 
            } 
 | 
        } 
 | 
  
 | 
        var redList = m_Redpoints.Keys.ToList(); 
 | 
        for (int j = 0; j < redList.Count; j++) 
 | 
        { 
 | 
            var type = redList[j]; 
 | 
            m_Redpoints[type].state = redpointTypes.Contains(type) ? RedPointState.Simple : RedPointState.None; 
 | 
        } 
 | 
    } 
 | 
  
 | 
     
 | 
  
 | 
    //已经购买并领取所有物品 
 | 
    public bool IsFinish() 
 | 
    { 
 | 
        for (int i = 0; i < investTypes.Count; i++) 
 | 
        { 
 | 
            int type = investTypes[i]; 
 | 
            //忽略永久卡 
 | 
            if (type == foreverCardType) 
 | 
                continue; 
 | 
            var idsList = GetIdsByType(type); 
 | 
            if (idsList.IsNullOrEmpty()) 
 | 
                continue; 
 | 
            for (int j = 0; j < idsList.Count; j++) 
 | 
            { 
 | 
                int id = idsList[j]; 
 | 
                if (GetSingleInvestState(type, id) != 3) 
 | 
                { 
 | 
                    return false; 
 | 
                } 
 | 
            } 
 | 
        } 
 | 
        return true; 
 | 
    } 
 | 
  
 | 
    public struct InvestInfo 
 | 
    { 
 | 
        public int money; 
 | 
        public int days; 
 | 
    } 
 | 
} 
 |