using System;
using System.Collections.Generic;
using System.Linq;
using System.Data;
using System.Threading;
using MySystem.Models;
using Library;
using LitJson;

namespace MySystem
{
    public class ActiveRewardService
    {
        public readonly static ActiveRewardService Instance = new ActiveRewardService();
        private ActiveRewardService()
        { }


        //激活奖
        public void StartAct()
        {
            Thread th = new Thread(StartActListen);
            th.IsBackground = true;
            th.Start();
        }
        
        private void StartActListen()
        {
            while(true)
            {
                if(RedisDbconn.Instance.Get<string>("ActiveRewardThreadStatus") == "1")
                {
                    StartActDo();
                    Thread.Sleep(5000);
                }
            }
        }

        public void StartActDo()
        {
            WebCMSEntities db = new WebCMSEntities();
            KxsMainModels.WebCMSEntities kxsdb = new KxsMainModels.WebCMSEntities();
            DateTime yesterday = DateTime.Now.AddDays(-1);
            IQueryable<MerchantDepositOrder> orderList = db.MerchantDepositOrder.Where(m => m.Status == 1 && m.UpdateDate >= yesterday);
            foreach (MerchantDepositOrder order in orderList.ToList())
            {
                doActiveReward(db, kxsdb, order, 300);
                RedisDbconn.Instance.AddList("OpenRewardQueue1", order.MerchantId);
                RedisDbconn.Instance.AddList("LeaderPrizeQueue1", order.MerchantId);
                RedisDbconn.Instance.AddList("OperatePrizeQueue1", order.MerchantId);
                MerchantDepositOrder edit = db.MerchantDepositOrder.FirstOrDefault(m => m.Id == order.Id);
                if(edit != null)
                {
                    edit.Status = 2;
                    db.SaveChanges();
                    Utils.Instance.SendActData(db.MerchantInfo.FirstOrDefault(m => m.Id == edit.MerchantId) ?? new MerchantInfo(), 4);
                }
            }
            db.Dispose();
            kxsdb.Dispose();
        }

        public void doActiveReward(WebCMSEntities db, KxsMainModels.WebCMSEntities kxsdb, MerchantDepositOrder order, decimal ActPrize)
        {
            MerchantInfo merchant = db.MerchantInfo.FirstOrDefault(m => m.Id == order.MerchantId) ?? new MerchantInfo();
            KxsMainModels.Users user = kxsdb.Users.FirstOrDefault(m => m.Id == merchant.UserId) ?? new KxsMainModels.Users();
            int GetUserId = user.Id;
            string ParentNav = user.ParentNav;
            int TopUserId = 0;
            if (!string.IsNullOrEmpty(ParentNav))
            {
                TopUserId = int.Parse(ParentNav.Trim(',').Replace(",,", ",").Split(',')[0]);
            }
            string IdBrand = GetUserId + "_0";
            UserMachineData userData = db.UserMachineData.FirstOrDefault(m => m.IdBrand == IdBrand);
            if (userData == null)
            {
                userData = db.UserMachineData.Add(new UserMachineData()
                {
                    IdBrand = IdBrand,
                }).Entity;
                db.SaveChanges();
            }
            userData.ActProfit += ActPrize;
            db.SaveChanges();
            KxsMainModels.UserAccount account = kxsdb.UserAccount.FirstOrDefault(m => m.Id == GetUserId);
            if (account == null)
            {
                account = kxsdb.UserAccount.Add(new KxsMainModels.UserAccount()
                {
                    Id = GetUserId,
                    UserId = GetUserId,
                }).Entity;
                kxsdb.SaveChanges();
            }
            decimal BeforeTotalAmount = account.TotalAmount; //变更前总金额
            decimal BeforeFreezeAmount = account.FreezeAmount; //变更前冻结金额
            decimal BeforeBalanceAmount = account.BalanceAmount; //变更前余额
            account.BalanceAmount += ActPrize;
            account.TotalAmount += ActPrize;
            decimal AfterTotalAmount = account.TotalAmount; //变更后总金额
            decimal AfterFreezeAmount = account.FreezeAmount; //变更后冻结金额
            decimal AfterBalanceAmount = account.BalanceAmount; //变更后余额
            KxsMainModels.UserAccountRecord userAccountRecord = kxsdb.UserAccountRecord.Add(new KxsMainModels.UserAccountRecord()
            {
                CreateDate = DateTime.Now,
                UpdateDate = DateTime.Now,
                UserId = GetUserId, //创客
                ChangeType = 311, //变动类型
                ChangeAmount = ActPrize, //变更金额
                BeforeTotalAmount = BeforeTotalAmount, //变更前总金额
                AfterTotalAmount = AfterTotalAmount, //变更后总金额
                BeforeFreezeAmount = BeforeFreezeAmount, //变更前冻结金额
                AfterFreezeAmount = AfterFreezeAmount, //变更后冻结金额
                BeforeBalanceAmount = BeforeBalanceAmount, //变更前余额
                AfterBalanceAmount = AfterBalanceAmount, //变更后余额
                QueryCount = merchant.Id,
            }).Entity;
            kxsdb.SaveChanges();
        }








        //开户奖
        public void StartOpenReward()
        {
            Thread th = new Thread(StartOpenRewardDo);
            th.IsBackground = true;
            th.Start();
        }
        public void StartOpenRewardDo()
        {
            while(true)
            {
                string content = RedisDbconn.Instance.RPop<string>("OpenRewardQueue1");
                if(!string.IsNullOrEmpty(content))
                {
                    try
                    {
                        WebCMSEntities db = new WebCMSEntities();
                        KxsMainModels.WebCMSEntities kxsdb = new KxsMainModels.WebCMSEntities();
                        function.WriteLog("\n\n" + DateTime.Now.ToString() + "\nposid:" + content, "开机奖励发放日志");
                        int MerchantId = int.Parse(content);
                        MerchantInfo merchant = db.MerchantInfo.FirstOrDefault(m => m.Id == MerchantId);
                        if (merchant != null)
                        {
                            function.WriteLog("商户:" + merchant.Name, "开机奖励发放日志");
                            KxsMainModels.Users user = kxsdb.Users.FirstOrDefault(m => m.Id == merchant.UserId);
                            if (user != null)
                            {
                                function.WriteLog("所属人:" + user.MakerCode, "开机奖励发放日志");
                                string ParentNav = function.CheckNull(user.ParentNav) + "," + user.Id + ",";
                                if (!string.IsNullOrEmpty(ParentNav))
                                {
                                    decimal Prize = 20;
                                    string[] ParentNavs = ParentNav.Trim(',').Replace(",,", ",").Split(',');
                                    for (int i = ParentNavs.Length - 1; i >= 0; i--)
                                    {
                                        int UserId = int.Parse(ParentNavs[i]);
                                        KxsMainModels.Users puser = kxsdb.Users.FirstOrDefault(m => m.Id == UserId && m.AuthFlag == 1 && m.Status > -1);
                                        if (puser != null && Prize > 0)
                                        {
                                            function.WriteLog("上级:" + puser.MakerCode, "开机奖励发放日志");
                                            function.WriteLog("条件:LeaderLevel:" + puser.LeaderLevel + ",UserType:" + puser.UserType, "开机奖励发放日志");
                                            if(puser.LeaderLevel > 0 || puser.UserType == 1)
                                            {
                                                bool leaderOp = true;
                                                if(puser.LeaderLevel > 0 && puser.UserType == 0)
                                                {
                                                    DateTime now = DateTime.Now;
                                                    leaderOp = kxsdb.Leaders.Any(m => m.Id == puser.Id && m.ExpiredDate >= now);
                                                    function.WriteLog("条件:leaderOp:" + leaderOp, "开机奖励发放日志");
                                                }
                                                if(leaderOp)
                                                {
                                                    function.WriteLog("满足条件", "开机奖励发放日志");
                                                    int pTopUserId = 0;
                                                    if (!string.IsNullOrEmpty(puser.ParentNav))
                                                    {
                                                        pTopUserId = int.Parse(puser.ParentNav.Trim(',').Replace(",,", ",").Split(',')[0]);
                                                    }
                                                    string IdBrand = puser.Id + "_0";
                                                    UserMachineData userData = db.UserMachineData.FirstOrDefault(m => m.IdBrand == IdBrand);
                                                    if (userData == null)
                                                    {
                                                        userData = db.UserMachineData.Add(new UserMachineData()
                                                        {
                                                            IdBrand = IdBrand,
                                                        }).Entity;
                                                        db.SaveChanges();
                                                    }
                                                    userData.OpenProfit += Prize;
                                                    db.SaveChanges();
                                                    //账户入库
                                                    KxsMainModels.UserAccount account = kxsdb.UserAccount.FirstOrDefault(m => m.Id == puser.Id);
                                                    if (account == null)
                                                    {
                                                        account = kxsdb.UserAccount.Add(new KxsMainModels.UserAccount()
                                                        {
                                                            Id = puser.Id,
                                                            UserId = puser.Id,
                                                        }).Entity;
                                                        kxsdb.SaveChanges();
                                                    }
                                                    //收支明细入库
                                                    decimal BeforeTotalAmount = account.TotalAmount; //变更前总金额
                                                    decimal BeforeFreezeAmount = account.FreezeAmount; //变更前冻结金额
                                                    decimal BeforeBalanceAmount = account.BalanceAmount; //变更前余额
                                                    account.BalanceAmount += Prize;
                                                    account.TotalAmount += Prize;
                                                    decimal AfterTotalAmount = account.TotalAmount; //变更后总金额
                                                    decimal AfterFreezeAmount = account.FreezeAmount; //变更后冻结金额
                                                    decimal AfterBalanceAmount = account.BalanceAmount; //变更后余额
                                                    KxsMainModels.UserAccountRecord userAccountRecord = kxsdb.UserAccountRecord.Add(new KxsMainModels.UserAccountRecord()
                                                    {
                                                        CreateDate = DateTime.Now,
                                                        UpdateDate = DateTime.Now,
                                                        UserId = puser.Id, //创客
                                                        ChangeType = 312, //变动类型
                                                        ChangeAmount = Prize, //变更金额
                                                        BeforeTotalAmount = BeforeTotalAmount, //变更前总金额
                                                        AfterTotalAmount = AfterTotalAmount, //变更后总金额
                                                        BeforeFreezeAmount = BeforeFreezeAmount, //变更前冻结金额
                                                        AfterFreezeAmount = AfterFreezeAmount, //变更后冻结金额
                                                        BeforeBalanceAmount = BeforeBalanceAmount, //变更前余额
                                                        AfterBalanceAmount = AfterBalanceAmount, //变更后余额
                                                        QueryCount = MerchantId,
                                                    }).Entity;
                                                    kxsdb.SaveChanges();
                                                    Prize = 0;
                                                }
                                            }
                                        }
                                    }
                                }
                            }
                        }
                        db.Dispose();
                        kxsdb.Dispose();
                    }
                    catch(Exception ex)
                    {
                        function.WriteLog(DateTime.Now.ToString() + "\r\n" + ex.ToString(), "实时获取开机奖励异常");
                    }
                }
                else
                {
                    Thread.Sleep(5000);
                }
            }
        }



        //盟主奖
        public void StartLeaderReward()
        {
            Thread th = new Thread(StartLeaderRewardDo);
            th.IsBackground = true;
            th.Start();
        }

        public void StartLeaderRewardDo()
        {
            while (true)
            {
                string content = RedisDbconn.Instance.RPop<string>("LeaderPrizeQueue1");
                if (!string.IsNullOrEmpty(content))
                {
                    try
                    {
                        WebCMSEntities db = new WebCMSEntities();
                        KxsMainModels.WebCMSEntities kxsdb = new KxsMainModels.WebCMSEntities();
                        function.WriteLog("\n\n" + DateTime.Now.ToString() + "\nposid:" + content, "盟主奖励发放日志");
                        int MerchantId = int.Parse(content);
                        MerchantInfo merchant = db.MerchantInfo.FirstOrDefault(m => m.Id == MerchantId);
                        if (merchant != null)
                        {
                            function.WriteLog("商户:" + merchant.Name, "盟主奖励发放日志");
                            KxsMainModels.Users user = kxsdb.Users.FirstOrDefault(m => m.Id == merchant.UserId);
                            if (user != null)
                            {
                                function.WriteLog("所属人:" + user.MakerCode, "盟主奖励发放日志");
                                string ParentNav = function.CheckNull(user.ParentNav) + "," + user.Id + ",";
                                if (!string.IsNullOrEmpty(ParentNav))
                                {
                                    decimal Prize = 10;
                                    string[] ParentNavs = ParentNav.Trim(',').Replace(",,", ",").Split(',');
                                    for (int i = ParentNavs.Length - 1; i >= 0; i--)
                                    {
                                        int UserId = int.Parse(ParentNavs[i]);
                                        KxsMainModels.Users puser = kxsdb.Users.FirstOrDefault(m => m.Id == UserId && m.AuthFlag == 1 && m.Status > -1);
                                        if (puser != null && Prize > 0)
                                        {
                                            function.WriteLog("上级:" + puser.MakerCode, "盟主奖励发放日志");
                                            function.WriteLog("条件:LeaderLevel:" + puser.LeaderLevel + ",UserType:" + puser.UserType, "盟主奖励发放日志");
                                            if(puser.LeaderLevel == 2)
                                            {
                                                DateTime now = DateTime.Now;
                                                bool leaderOp = kxsdb.Leaders.Any(m => m.Id == puser.Id && m.ExpiredDate >= now);
                                                function.WriteLog("条件:leaderOp:" + leaderOp, "盟主奖励发放日志");
                                                if(leaderOp)
                                                {
                                                    function.WriteLog("满足条件", "盟主奖励发放日志");
                                                    int pTopUserId = 0;
                                                    if (!string.IsNullOrEmpty(puser.ParentNav))
                                                    {
                                                        pTopUserId = int.Parse(puser.ParentNav.Trim(',').Replace(",,", ",").Split(',')[0]);
                                                    }
                                                    string IdBrand = puser.Id + "_0";
                                                    UserMachineData userData = db.UserMachineData.FirstOrDefault(m => m.IdBrand == IdBrand);
                                                    if (userData == null)
                                                    {
                                                        userData = db.UserMachineData.Add(new UserMachineData()
                                                        {
                                                            IdBrand = IdBrand,
                                                        }).Entity;
                                                        db.SaveChanges();
                                                    }
                                                    userData.OpenProfit += Prize;
                                                    db.SaveChanges();
                                                    //账户入库
                                                    KxsMainModels.UserAccount account = kxsdb.UserAccount.FirstOrDefault(m => m.Id == puser.Id);
                                                    if (account == null)
                                                    {
                                                        account = kxsdb.UserAccount.Add(new KxsMainModels.UserAccount()
                                                        {
                                                            Id = puser.Id,
                                                            UserId = puser.Id,
                                                        }).Entity;
                                                        kxsdb.SaveChanges();
                                                    }
                                                    //收支明细入库
                                                    decimal BeforeTotalAmount = account.TotalAmount; //变更前总金额
                                                    decimal BeforeFreezeAmount = account.FreezeAmount; //变更前冻结金额
                                                    decimal BeforeBalanceAmount = account.BalanceAmount; //变更前余额
                                                    account.BalanceAmount += Prize;
                                                    account.TotalAmount += Prize;
                                                    decimal AfterTotalAmount = account.TotalAmount; //变更后总金额
                                                    decimal AfterFreezeAmount = account.FreezeAmount; //变更后冻结金额
                                                    decimal AfterBalanceAmount = account.BalanceAmount; //变更后余额
                                                    KxsMainModels.UserAccountRecord userAccountRecord = kxsdb.UserAccountRecord.Add(new KxsMainModels.UserAccountRecord()
                                                    {
                                                        CreateDate = DateTime.Now,
                                                        UpdateDate = DateTime.Now,
                                                        UserId = puser.Id, //创客
                                                        ChangeType = 313, //变动类型
                                                        ChangeAmount = Prize, //变更金额
                                                        BeforeTotalAmount = BeforeTotalAmount, //变更前总金额
                                                        AfterTotalAmount = AfterTotalAmount, //变更后总金额
                                                        BeforeFreezeAmount = BeforeFreezeAmount, //变更前冻结金额
                                                        AfterFreezeAmount = AfterFreezeAmount, //变更后冻结金额
                                                        BeforeBalanceAmount = BeforeBalanceAmount, //变更前余额
                                                        AfterBalanceAmount = AfterBalanceAmount, //变更后余额
                                                        QueryCount = MerchantId,
                                                    }).Entity;
                                                    kxsdb.SaveChanges();
                                                    Prize = 0;
                                                }
                                            }
                                        }
                                    }
                                }
                            }
                        }
                        db.Dispose();
                        kxsdb.Dispose();
                    }
                    catch (Exception ex)
                    {
                        function.WriteLog(DateTime.Now.ToString() + "\r\n" + ex.ToString(), "盟主奖发放日志异常");
                    }
                    Thread.Sleep(100);
                }
                else
                {
                    Thread.Sleep(60000);
                }
            }
        }



        //运营中心奖
        public void StartOperateReward()
        {
            Thread th = new Thread(StartOperateRewardDo);
            th.IsBackground = true;
            th.Start();
        }

        public void StartOperateRewardDo()
        {
            while (true)
            {
                string content = RedisDbconn.Instance.RPop<string>("OperatePrizeQueue1");
                if (!string.IsNullOrEmpty(content))
                {
                    try
                    {
                        WebCMSEntities db = new WebCMSEntities();
                        KxsMainModels.WebCMSEntities kxsdb = new KxsMainModels.WebCMSEntities();
                        function.WriteLog("\n\n" + DateTime.Now.ToString() + "\nposid:" + content, "运营中心奖励发放日志");
                        int MerchantId = int.Parse(content);
                        MerchantInfo merchant = db.MerchantInfo.FirstOrDefault(m => m.Id == MerchantId);
                        if (merchant != null)
                        {
                            function.WriteLog("商户:" + merchant.Name, "运营中心奖励发放日志");
                            KxsMainModels.Users user = kxsdb.Users.FirstOrDefault(m => m.Id == merchant.UserId);
                            if (user != null)
                            {
                                function.WriteLog("所属人:" + user.MakerCode, "运营中心奖励发放日志");
                                string ParentNav = function.CheckNull(user.ParentNav) + "," + user.Id + ",";
                                if (!string.IsNullOrEmpty(ParentNav))
                                {
                                    decimal Prize = 5;
                                    string[] ParentNavs = ParentNav.Trim(',').Replace(",,", ",").Split(',');
                                    for (int i = ParentNavs.Length - 1; i >= 0; i--)
                                    {
                                        int UserId = int.Parse(ParentNavs[i]);
                                        KxsMainModels.Users puser = kxsdb.Users.FirstOrDefault(m => m.Id == UserId && m.AuthFlag == 1 && m.Status > -1);
                                        if (puser != null && Prize > 0)
                                        {
                                            function.WriteLog("上级:" + puser.MakerCode, "运营中心奖励发放日志");
                                            function.WriteLog("条件:LeaderLevel:" + puser.LeaderLevel + ",UserType:" + puser.UserType, "运营中心奖励发放日志");
                                            if(puser.UserType == 1)
                                            {
                                                function.WriteLog("满足条件", "运营中心奖励发放日志");
                                                int pTopUserId = 0;
                                                if (!string.IsNullOrEmpty(puser.ParentNav))
                                                {
                                                    pTopUserId = int.Parse(puser.ParentNav.Trim(',').Replace(",,", ",").Split(',')[0]);
                                                }
                                                string IdBrand = puser.Id + "_0";
                                                UserMachineData userData = db.UserMachineData.FirstOrDefault(m => m.IdBrand == IdBrand);
                                                if (userData == null)
                                                {
                                                    userData = db.UserMachineData.Add(new UserMachineData()
                                                    {
                                                        IdBrand = IdBrand,
                                                    }).Entity;
                                                    db.SaveChanges();
                                                }
                                                userData.OpenProfit += Prize;
                                                db.SaveChanges();
                                                //账户入库
                                                KxsMainModels.UserAccount account = kxsdb.UserAccount.FirstOrDefault(m => m.Id == puser.Id);
                                                if (account == null)
                                                {
                                                    account = kxsdb.UserAccount.Add(new KxsMainModels.UserAccount()
                                                    {
                                                        Id = puser.Id,
                                                        UserId = puser.Id,
                                                    }).Entity;
                                                    kxsdb.SaveChanges();
                                                }
                                                //收支明细入库
                                                decimal BeforeTotalAmount = account.TotalAmount; //变更前总金额
                                                decimal BeforeFreezeAmount = account.FreezeAmount; //变更前冻结金额
                                                decimal BeforeBalanceAmount = account.BalanceAmount; //变更前余额
                                                account.BalanceAmount += Prize;
                                                account.TotalAmount += Prize;
                                                decimal AfterTotalAmount = account.TotalAmount; //变更后总金额
                                                decimal AfterFreezeAmount = account.FreezeAmount; //变更后冻结金额
                                                decimal AfterBalanceAmount = account.BalanceAmount; //变更后余额
                                                KxsMainModels.UserAccountRecord userAccountRecord = kxsdb.UserAccountRecord.Add(new KxsMainModels.UserAccountRecord()
                                                {
                                                    CreateDate = DateTime.Now,
                                                    UpdateDate = DateTime.Now,
                                                    UserId = puser.Id, //创客
                                                    ChangeType = 314, //变动类型
                                                    ChangeAmount = Prize, //变更金额
                                                    BeforeTotalAmount = BeforeTotalAmount, //变更前总金额
                                                    AfterTotalAmount = AfterTotalAmount, //变更后总金额
                                                    BeforeFreezeAmount = BeforeFreezeAmount, //变更前冻结金额
                                                    AfterFreezeAmount = AfterFreezeAmount, //变更后冻结金额
                                                    BeforeBalanceAmount = BeforeBalanceAmount, //变更前余额
                                                    AfterBalanceAmount = AfterBalanceAmount, //变更后余额
                                                    QueryCount = MerchantId,
                                                }).Entity;
                                                kxsdb.SaveChanges();
                                                Prize = 0;
                                            }
                                        }
                                    }
                                }
                            }
                        }
                        db.Dispose();
                        kxsdb.Dispose();
                    }
                    catch (Exception ex)
                    {
                        function.WriteLog(DateTime.Now.ToString() + "\r\n" + ex.ToString(), "运营中心奖发放日志异常");
                    }
                    Thread.Sleep(100);
                }
                else
                {
                    Thread.Sleep(60000);
                }
            }
        }

        
    }
}