using System;
using System.Collections.Generic;
using System.Linq;
using MySystem.PxcModels;
using Library;
using LitJson;

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

        public void Start(JobMqMsg jobInfo)
        {
            string content = "";
            try
            {
                string Msg = CheckData();
                // jobInfo.Status = Msg == "success" ? 1: 0;
                // jobInfo.Msg = Msg == "success" ? "执行完成": Msg;
                // RabbitMQClient.Instance.SendMsg(Newtonsoft.Json.JsonConvert.SerializeObject(jobInfo), "ActiveBack");
            }
            catch (Exception ex)
            {
                if (!string.IsNullOrEmpty(content))
                {
                    Dictionary<string, string> data = new Dictionary<string, string>();
                    data.Add("ErrTime", DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"));
                    data.Add("ErrMsg", ex.ToString());
                    Utils.WriteLog(Newtonsoft.Json.JsonConvert.SerializeObject(data), "activeback_err");
                }
                else
                {
                    Utils.WriteLog(DateTime.Now.ToString() + ":" + ex.ToString(), "activeback_service");
                }
            }
        }

        //检查机具扣费情况
        private string CheckData()
        {
            DateTime StatDate = DateTime.Now.AddMonths(-1);
            DateTime StartDate = DateTime.Parse(StatDate.ToString("yyyy-MM") + "-01 00:00:00");
            DateTime EndDate = StartDate.AddMonths(1);
            string TradeMonth = StatDate.ToString("yyyyMM");
            WebCMSEntities db = new WebCMSEntities();
            using (var tran = db.Database.BeginTransaction())
            {
                try
                {
                    List<ActiveReward> list = db.ActiveReward.Where(m => m.CreateDate >= StartDate && m.CreateDate < EndDate && m.Status == -1).ToList();
                    foreach (ActiveReward sub in list)
                    {
                        ActiveReward edit = db.ActiveReward.FirstOrDefault(m => m.Id == sub.Id);
                        if (edit != null)
                        {
                            edit.Status = 0;
                            db.SaveChanges();
                        }
                        UserAccount account = db.UserAccount.FirstOrDefault(m => m.UserId == sub.UserId);
                        if (account == null)
                        {
                            account = db.UserAccount.Add(new UserAccount()
                            {
                                Id = sub.UserId,
                                CreateDate = DateTime.Now,
                                UserId = sub.UserId,
                                UserProperty = 0,
                                UserType = 2,
                            }).Entity;
                            db.SaveChanges();
                        }
                        decimal BeforeTotalAmount = account.TotalAmount; //变更前总金额
                        decimal BeforeFreezeAmount = account.FreezeAmount; //变更前冻结金额
                        decimal BeforeBalanceAmount = account.BalanceAmount; //变更前余额
                        account.BalanceAmount += sub.RewardAmount;
                        account.TotalAmount += sub.RewardAmount;
                        decimal AfterTotalAmount = account.TotalAmount; //变更后总金额
                        decimal AfterFreezeAmount = account.FreezeAmount; //变更后冻结金额
                        decimal AfterBalanceAmount = account.BalanceAmount; //变更后余额
                        db.SaveChanges();
                        UserAccountRecord accountRecord = db.UserAccountRecord.Add(new UserAccountRecord()
                        {
                            CreateDate = DateTime.Now,
                            UpdateDate = DateTime.Now,
                            UserId = sub.UserId, //创客
                            ChangeType = 0, //变动类型
                            ProductType = sub.BrandId, //产品类型
                            ChangeAmount = sub.RewardAmount, //变更金额
                            BeforeTotalAmount = BeforeTotalAmount, //变更前总金额
                            AfterTotalAmount = AfterTotalAmount, //变更后总金额
                            BeforeFreezeAmount = BeforeFreezeAmount, //变更前冻结金额
                            AfterFreezeAmount = AfterFreezeAmount, //变更后冻结金额
                            BeforeBalanceAmount = BeforeBalanceAmount, //变更前余额
                            AfterBalanceAmount = AfterBalanceAmount, //变更后余额
                        }).Entity;
                        db.SaveChanges();

                    }
                    
                    tran.Commit();
                }
                catch (Exception ex)
                {
                    tran.Rollback();
                    ErrorMsg msg = new ErrorMsg()
                    {
                        Time = DateTime.Now,
                        ErrorContent = ex.ToString(),
                    };
                    Utils.WriteLog(Newtonsoft.Json.JsonConvert.SerializeObject(msg), "ActiveServiceError");
                }
            }
            db.Dispose();
            return "success";
        }
    }
}