using AutoMapper;
using MathNet.Numerics.Statistics.Mcmc;
using NPOI.SS.Formula.Functions;
using OASystem.Domain;
using OASystem.Domain.Dtos.Groups;
using OASystem.Domain.Entities.Financial;
using OASystem.Domain.Entities.Groups;
using OASystem.Domain.Entities.Resource;
using OASystem.Domain.ViewModels.Groups;
using OASystem.Domain.ViewModels.QiYeWeChat;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Security.Cryptography;
using System.Text;
using System.Threading.Tasks;

namespace OASystem.Infrastructure.Repositories.Groups
{
    public class InvitationOfficialActivitiesRepository : BaseRepository<Grp_InvitationOfficialActivities, InvitationOfficialActivitiesListDto>
    {
        private readonly IMapper _mapper;
        public InvitationOfficialActivitiesRepository(SqlSugarClient sqlSugar, IMapper mapper) :
            base(sqlSugar)
        {
            this._mapper = mapper;
        }
        /// <summary>
        /// 根据商邀费用Id查询C表和商邀资料及费用表
        /// </summary>
        /// <param name="dto"></param>
        /// <returns></returns>
        public async Task<Result> InvitationOfficialActivitiesById(InvitationOfficialActivitiesByIdDto dto)
        {
            Result result = new Result() { Code = -2, Msg = "程序错误" };
            try
            {
                Grp_InvitationOfficialActivities grp_Invitation = _sqlSugar.Queryable<Grp_InvitationOfficialActivities>().First(a => a.Id == dto.Id && a.IsDel == 0);
                Grp_CreditCardPayment grp_CreditCard = _sqlSugar.Queryable<Grp_CreditCardPayment>().First(a => a.CId == dto.Id && a.IsDel == 0 && a.CTable==81);
                Res_InvitationOfficialActivityData res_InvitationOfficialActivityData = new Res_InvitationOfficialActivityData();
                if (grp_Invitation!=null)
                {
                    res_InvitationOfficialActivityData = _sqlSugar.Queryable<Res_InvitationOfficialActivityData>().First(a =>a.Country==grp_Invitation.InviterArea && a.UnitName==grp_Invitation.Inviter && a.IsDel == 0);
                    if (dto.PortType == 1)
                    {
                        var data = new
                        {
                            _Invitation = grp_Invitation,
                            _InvitationData = res_InvitationOfficialActivityData,
                            _CreditCard = grp_CreditCard,
                        };
                        result = new Result() { Code = 0, Msg = "查询成功!", Data = data };
                    }
                    else
                    {
                        InvitationOfficialActivitiesByIdView invitation = _mapper.Map<InvitationOfficialActivitiesByIdView>(grp_Invitation);
                        res_InvitationOfficialActivityData ??= new Res_InvitationOfficialActivityData();
                        invitation.ConsumptionPatterns = grp_CreditCard.ConsumptionPatterns;
                        invitation.ConsumptionDate = grp_CreditCard.ConsumptionDate;
                        invitation.PayDId = grp_CreditCard.PayDId;
                        invitation.ConsumptionPatterns = grp_CreditCard.ConsumptionPatterns;
                        invitation.ConsumptionDate = grp_CreditCard.ConsumptionDate;
                        invitation.BankNo = grp_CreditCard.BankNo;
                        invitation.CardholderName = grp_CreditCard.CardholderName;
                        invitation.CompanyBankNo = grp_CreditCard.CompanyBankNo;
                        invitation.OtherBankName = grp_CreditCard.OtherBankName;
                        invitation.OtherSideNo = grp_CreditCard.OtherSideNo;
                        invitation.OtherSideName = grp_CreditCard.OtherSideName;
                        invitation.PayMoney = grp_CreditCard.PayMoney;
                        invitation.PaymentCurrency = grp_CreditCard.PaymentCurrency;
                        invitation.OrbitalPrivateTransfer = grp_CreditCard.OrbitalPrivateTransfer;
                        invitation.Payee = grp_CreditCard.Payee;
                        invitation.Address = res_InvitationOfficialActivityData.Address;
                        invitation.Contact = res_InvitationOfficialActivityData.Contact;
                        invitation.Job = res_InvitationOfficialActivityData.Job;
                        invitation.Tel = res_InvitationOfficialActivityData.Tel;
                        invitation.Email = res_InvitationOfficialActivityData.Email;
                        invitation.Fax = res_InvitationOfficialActivityData.Fax;
                        invitation.OtherInformation = res_InvitationOfficialActivityData.Remark;
                        invitation.CTDId = grp_CreditCard.CTDId;
                        result = new Result() { Code = 0, Msg = "查询成功!", Data = invitation };
                    }
                }
                else
                {
                    if (dto.PortType == 1)
                    {
                        var data = new
                        {
                            _Invitation = grp_Invitation,
                            _InvitationData = res_InvitationOfficialActivityData,
                            _CreditCard = grp_CreditCard,
                        };
                        result = new Result() { Code = 0, Msg = "暂无数据!", Data = data };
                    }
                    else
                    {
                        InvitationOfficialActivitiesByIdView invitation = _mapper.Map<InvitationOfficialActivitiesByIdView>(grp_Invitation);
                        result = new Result() { Code = 0, Msg = "暂无数据!", Data = invitation };
                    }
                }
                
                
                
            }
            catch (Exception)
            {
                result = new Result() { Code = -2, Msg = "程序错误" };
                throw;
            }
            return result;
        }
        /// <summary>
        /// 根据团组id查询商邀费用数据
        /// </summary>
        /// <param name="dto"></param>
        /// <returns></returns>
        public async Task<Result> InvitationOfficialActivitiesList(InvitationOfficialActivitiesListDto dto)
        {
            Result result = new Result() { Code = -2, Msg = "未知错误" };
            try
            {
                ListViewBase<InvitationOfficialActivitiesView> rst = new ListViewBase<InvitationOfficialActivitiesView>() { ReceiveDt=DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") };
                string sqlWhere = string.Empty;
                if (!string.IsNullOrWhiteSpace(dto.Inviter))
                {
                    sqlWhere += string.Format(@" And Inviter like '%{0}%'", dto.Inviter);
                }
                if (!string.IsNullOrWhiteSpace(dto.StartInviteTime) && !string.IsNullOrWhiteSpace(dto.EndInviteTime))
                {
                    sqlWhere += string.Format(@" And i.InviteTime between '{0}' and '{1}'", dto.StartInviteTime, dto.EndInviteTime);
                }
                sqlWhere += string.Format(@" And i.DiId={0} And i.IsDel={1}", dto.DiId, 0);
                string UserId = "";
                List<Grp_GroupsTaskAssignment> gtaUIdList = _sqlSugar.Queryable<Grp_GroupsTaskAssignment>().Where(a => a.DIId == dto.DiId && a.IsDel == 0 && a.CTId == 81).ToList();
                foreach (Grp_GroupsTaskAssignment gta in gtaUIdList)
                    UserId += gta.UId + ",";

                if (!string.IsNullOrWhiteSpace(UserId))
                {
                    UserId = UserId.Substring(0, UserId.Length - 1);
                }
                else
                {
                    UserId = "0";
                }
                sqlWhere += string.Format(@" And i.CreateUserId in ({0})", UserId);
                if (!string.IsNullOrEmpty(sqlWhere.Trim()))
                {
                    Regex r = new Regex("And");
                    sqlWhere = r.Replace(sqlWhere, "Where", 1);
                }
                //10011
                string sql = string.Format(@"Select Id,DiId,InviterArea,Inviter,InviteTime,
                                             InviteCost,(Select Name From Sys_SetData Where id=i.InviteCurrency And IsDel=0) As InviteCurrency,
                                             SendCost,(Select Name From Sys_SetData Where id=i.SendCurrency And IsDel=0) As SendCurrency,
                                             EventsCost,(Select Name From Sys_SetData Where id=i.EventsCurrency And IsDel=0) As EventsCurrency,
                                             TranslateCost,(Select Name From Sys_SetData Where id=i.TranslateCurrency And IsDel=0) As TranslateCurrency,
                                             IsGoOfficaiaBussiness,
                                             (Select PayMoney From Grp_CreditCardPayment Where CTable=81 And CId=i.Id  And IsDel=0) As PayMoney,
                                             (Select (Select Name From Sys_SetData Where Id =ccp.PaymentCurrency And IsDel=0 ) As PaymentCurrency 
                                               From Grp_CreditCardPayment ccp Where CTable=81 And CId=i.Id  And IsDel=0) As PaymentCurrency,
                                             (Select IsAuditGM From Grp_CreditCardPayment Where CTable=81 And CId=i.Id  And IsDel=0) As IsAudit,
                                             Attachment From Grp_InvitationOfficialActivities i {0} Order By i.id  Desc", sqlWhere);
                List<InvitationOfficialActivitiesView> _DecreasePayments = await _sqlSugar.SqlQueryable<InvitationOfficialActivitiesView>(sql).ToListAsync();
                if (_DecreasePayments.Count != 0)
                {
                    if (dto.PageIndex != 0 && dto.PageSize != 0)
                    {

                        int count = _DecreasePayments.Count;
                        float totalPage = (float)count / dto.PageSize;//总页数
                        if (totalPage == 0) totalPage = 1;
                        else totalPage = (int)Math.Ceiling((double)totalPage);

                        List<InvitationOfficialActivitiesView> invitationOfficialActivities = new List<InvitationOfficialActivitiesView>();
                        for (int i = 0; i < dto.PageSize; i++)
                        {
                            var RowIndex = i + (dto.PageIndex - 1) * dto.PageSize;
                            if (RowIndex < _DecreasePayments.Count)
                            {
                                invitationOfficialActivities.Add(_DecreasePayments[RowIndex]);
                            }
                            else
                            {
                                break;
                            }
                        }
                        
                        rst.DataList = invitationOfficialActivities;
                        rst.DataCount = count;
                        rst.CurrPageIndex = dto.PageIndex;
                        rst.CurrPageSize = dto.PageSize;
                        rst.ReturnDt = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
                        return result = new Result() { Code = 0, Msg = "查询成功!", Data = rst };
                    }
                    else
                    {
                        return result = new Result() { Code = 0, Msg = "查询成功!", Data = _DecreasePayments };
                    }
                }
                else
                {
                    if (dto.PageIndex != 0 && dto.PageSize != 0)
                    {
                        rst.DataList = _DecreasePayments;
                        rst.DataCount = _DecreasePayments.Count;
                        rst.CurrPageIndex = dto.PageIndex;
                        rst.CurrPageSize = dto.PageSize;
                        rst.ReturnDt = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
                        return result = new Result() { Code = 0, Msg = "暂无数据!", Data = rst };
                    }
                    else
                    {
                        return result = new Result() { Code = 0, Msg = "暂无数据!", Data = _DecreasePayments };
                    }
                   
                }
            }
            catch (Exception ex)
            {
                return result = new Result() { Code = -2, Msg = ex.Message };
            }
        }

        /// <summary>
        /// Info Page Basic Data
        /// </summary>
        /// <returns></returns>
        public async Task<Result> _InitBasicData()
        {
            Result result = new Result() { Code = -2, Msg = "程序错误!" };

            var setDatas = _sqlSugar.Queryable<Sys_SetData>().Where(it => it.IsDel == 0).ToList();

            //支付方式
            var _payTypeDatas = setDatas.Where(it => it.STid == 14).Select(it => new  { Id = it.Id, Name = it.Name, Remark = it.Remark }).ToList();

            ///转账标识
            var _costIdentificationDatas = new List<dynamic>()
            { 
                new { Id = 0,Name = "公转" },
                new { Id = 1,Name = "私转" }
            };

            //卡类型
            var _cardTypeDatas = setDatas.Where(it => it.STid == 15).Select(it => new SetDataCurrencyInfoView { Id = it.Id, Name = it.Name, Remark = it.Remark }).ToList();

            var data = new { 
                PayTypeData = _payTypeDatas,
                CostIdentificationData = _costIdentificationDatas,
                CardTypeData = _cardTypeDatas
            };

            result.Code = 0;
            result.Data = data;
            return result;
        }
        
        /// <summary>
        /// 商邀费用操作(Status:1.新增,2.修改)
        /// </summary>
        /// <param name="dto"></param>
        /// <returns></returns>
        public async Task<Result> OpInvitationOfficialActivities(OpInvitationOfficialActivitiesDto dto, Func<int, int, int, Task<Result>> fn)
        {
            Result result = new Result() { Code = -2, Msg = "程序错误!" };
            BeginTran();
            try
            {
                int id = 0;
                Grp_InvitationOfficialActivities grp_Invitation = _mapper.Map<Grp_InvitationOfficialActivities>(dto);
                if (dto.Status == 1)//添加
                {
                    string selectSql = string.Format(@"select * from Grp_InvitationOfficialActivities where InviterArea='{0}' and Inviter='{1}' and DiId={2} and IsDel={3}"
                                                    , dto.InviterArea, dto.Inviter, dto.DiId, 0);
                    var _InvitationOfficialActivities = await _sqlSugar.SqlQueryable<Grp_InvitationOfficialActivities>(selectSql).FirstAsync();//查询是否存在
                    if (_InvitationOfficialActivities != null)
                    {
                        return result = new Result() { Code = -1, Msg = "该数据已存在,请勿重复添加!" };
                    }
                    else
                    {
                        id = await AddAsyncReturnId(grp_Invitation);
                        if (id != 0)//修改或添加商邀资料
                        {
                            Res_InvitationOfficialActivityData res_InvitationData = _mapper.Map<Res_InvitationOfficialActivityData>(dto);
                            res_InvitationData.Country = dto.InviterArea;
                            res_InvitationData.UnitName = dto.Inviter;
                            res_InvitationData.Delegation = dto.DiId.ToString();
                            Res_InvitationOfficialActivityData ifNullUp = await _sqlSugar.Queryable<Res_InvitationOfficialActivityData>().FirstAsync
                                (a => a.Country == res_InvitationData.Country && a.City == res_InvitationData.City && a.UnitName == res_InvitationData.UnitName && a.IsDel == 0);
                            if (ifNullUp == null)///添加或修改商邀资料
                            {
                                res_InvitationData.Remark = dto.OtherInformation;
                                int DataID = await _sqlSugar.Insertable(res_InvitationData).ExecuteReturnIdentityAsync();
                                if (DataID != 0)
                                {
                                    result = new Result() { Code = 0, Msg = "添加成功!" };
                                }
                                else
                                {
                                    RollbackTran();
                                    result = new Result() { Code = -1, Msg = "添加失败!" };
                                }

                            }
                            else
                            {
                                int CTable = await _sqlSugar.Updateable<Res_InvitationOfficialActivityData>().Where(a => a.Id == ifNullUp.Id).SetColumns(a => new Res_InvitationOfficialActivityData
                                {
                                    Contact = dto.Contact,
                                    Tel = dto.Tel,
                                    Email = dto.Email,
                                    Fax = dto.Fax,
                                    Address = dto.Address,
                                    Remark = dto.OtherInformation,
                                }).ExecuteCommandAsync();
                            }

                            Grp_CreditCardPayment C = new Grp_CreditCardPayment();
                            C.PayDId = dto.PayDId;
                            if (C.PayDId == 72)
                            {
                                C.IsPay = 1;
                            }

                            C.ConsumptionPatterns = dto.ConsumptionPatterns;
                            C.ConsumptionDate = dto.ConsumptionDate;
                            C.CTDId = dto.CTDId;
                            C.BankNo = dto.BankNo;
                            C.CardholderName = dto.CardholderName;
                            C.PayMoney = dto.PayMoney;
                            C.PaymentCurrency = dto.PaymentCurrency;
                            C.CompanyBankNo = dto.CompanyBankNo;
                            C.OtherBankName = dto.OtherBankName;
                            C.OtherSideNo = dto.OtherSideNo;
                            C.OtherSideName = dto.OtherSideName;
                            C.Remark = "";
                            C.CreateUserId = dto.CreateUserId;
                            C.MFOperator = 0;
                            C.MFOperatorDate = "";
                            C.IsAuditDM = 0;
                            C.AuditDMOperate = 0;
                            C.AuditDMDate = "";
                            C.IsAuditMF = 0;
                            C.AuditMFOperate = 0;
                            C.AuditMFDate = "";
                            C.IsAuditGM = 0;
                            C.AuditGMOperate = 0;
                            C.AuditGMDate = "";
                            C.IsPay = 0;
                            C.DIId = dto.DiId;
                            C.CId = id;
                            C.CTable = 81;
                            C.PayPercentage = 100;
                            C.PayThenMoney = 0;
                            C.PayPercentageOld = 0;
                            C.PayThenMoneyOld = 0;
                            C.UpdateDate = "";
                            C.Payee = dto.Payee;
                            C.OrbitalPrivateTransfer = dto.OrbitalPrivateTransfer;
                            C.ExceedBudget = 0;

                            //获取新汇率  int diId,int CId, int currencyId
                            var rate = await fn(dto.DiId, 81, dto.InviteCurrency);

                            if (rate.Code == 0)
                            {
                                var rateInfo = (rate.Data as CurrencyInfo);
                                if (rateInfo is not null)
                                {

                                    C.DayRate = rateInfo.Rate;
                                    C.RMBPrice = rateInfo.Rate * C.PayMoney;
                                }
                                else
                                {
                                    C.DayRate = 1;
                                    C.RMBPrice = C.PayMoney;
                                }
                            }

                            int cId = await _sqlSugar.Insertable(C).ExecuteReturnIdentityAsync();
                            if (cId != 0)
                            {
                                result = new Result() { Code = 0, Msg = "添加成功!" };
                            }
                            else
                            {
                                RollbackTran();
                                result = new Result() { Code = -1, Msg = "添加失败!" };
                            }
                        }
                    }
                }
                else//修改
                {
                    var thisTime = new DateTime();
                    DateTime.TryParse(dto.InviteTime, out thisTime);
                    bool res = await UpdateAsync(a => a.Id == grp_Invitation.Id, a => new Grp_InvitationOfficialActivities
                    {
                        DiId = dto.DiId,
                        InviterArea = dto.InviterArea,
                        Inviter = dto.Inviter,
                        InviteTime = thisTime,
                        Attachment = dto.Attachment,
                        InviteCost = dto.InviteCost,
                        InviteCurrency = dto.InviteCurrency,
                        SendCost = dto.SendCost,
                        SendCurrency = dto.SendCurrency,
                        EventsCost = dto.EventsCost,
                        EventsCurrency = dto.EventsCurrency,
                        TranslateCost = dto.TranslateCost,
                        TranslateCurrency = dto.TranslateCurrency,
                        IsGoOfficaiaBussiness = dto.IsGoOfficaiaBussiness,
                        Remark = dto.Remark,
                    });
                    if (res)
                    {
                        Res_InvitationOfficialActivityData res_InvitationData = _mapper.Map<Res_InvitationOfficialActivityData>(dto);
                        res_InvitationData.Country = dto.InviterArea;
                        res_InvitationData.UnitName = dto.Inviter;
                        Res_InvitationOfficialActivityData ifNullUp = await _sqlSugar.Queryable<Res_InvitationOfficialActivityData>().FirstAsync
                            (a => a.Country == res_InvitationData.Country && a.City == res_InvitationData.City && a.UnitName == res_InvitationData.UnitName && a.IsDel == 0);
                        if (ifNullUp == null)///添加或修改商邀资料
                        {
                            res_InvitationData.Remark = dto.OtherInformation;
                            res_InvitationData.Delegation = dto.DiId.ToString();

                            int DataID = await _sqlSugar.Insertable(res_InvitationData).ExecuteReturnIdentityAsync();
                            if (DataID != 0)
                            {
                                result = new Result() { Code = 0, Msg = "添加成功!" };
                            }
                            else
                            {
                                RollbackTran();
                                result = new Result() { Code = -1, Msg = "添加失败!" };
                            }
                        }
                        else
                        {
                            int CTable = await _sqlSugar.Updateable<Res_InvitationOfficialActivityData>()
                                .Where(a => a.Id == ifNullUp.Id)
                                .SetColumns(a => new Res_InvitationOfficialActivityData
                                {
                                    Contact = dto.Contact,
                                    Tel = dto.Tel,
                                    Email = dto.Email,
                                    Fax = dto.Fax,
                                    Address = dto.Address,
                                    Remark = dto.OtherInformation,
                                }).ExecuteCommandAsync();
                        }

                        Grp_CreditCardPayment grp_CreditCardPayment = _sqlSugar.Queryable<Grp_CreditCardPayment>().First(a => a.CId == grp_Invitation.Id && a.CTable == 81 && a.IsDel == 0);
                        if (grp_CreditCardPayment != null)
                        {
                            if (dto.PayDId == 72)
                            {
                                grp_CreditCardPayment.IsPay = 1;
                            }

                            grp_CreditCardPayment.PayMoney = dto.PayMoney;
                            grp_CreditCardPayment.PaymentCurrency = dto.PaymentCurrency;
                            grp_CreditCardPayment.Payee = dto.Payee;
                            grp_CreditCardPayment.OrbitalPrivateTransfer = dto.OrbitalPrivateTransfer;


                            //获取新汇率  int diId,int CId, int currencyId
                            var rate = await fn(dto.DiId, 81, dto.InviteCurrency);

                            grp_CreditCardPayment.DayRate = 1;
                            grp_CreditCardPayment.RMBPrice = grp_CreditCardPayment.PayMoney;
                            if (rate.Code == 0)
                            {
                                var rateInfo = (rate.Data as CurrencyInfo);
                                if (rateInfo is not null)
                                {

                                    grp_CreditCardPayment.DayRate = rateInfo.Rate;
                                    grp_CreditCardPayment.RMBPrice = rateInfo.Rate * grp_CreditCardPayment.PayMoney;
                                }
                            }

                            int CTable = await _sqlSugar.Updateable<Grp_CreditCardPayment>()
                                                        .Where(a => a.Id == grp_CreditCardPayment.Id)
                                                        .SetColumns(a => new Grp_CreditCardPayment
                                                        {
                                                            ConsumptionPatterns = dto.ConsumptionPatterns,
                                                            ConsumptionDate = dto.ConsumptionDate,
                                                            PayDId = dto.PayDId,
                                                            IsPay = grp_CreditCardPayment.IsPay,
                                                            CTDId = dto.CTDId,
                                                            BankNo = dto.BankNo,
                                                            CardholderName = dto.CardholderName,
                                                            CompanyBankNo = dto.CompanyBankNo,
                                                            OtherBankName = dto.OtherBankName,
                                                            OtherSideNo = dto.OtherSideNo,
                                                            OtherSideName = dto.OtherSideName,
                                                            PayMoney = grp_CreditCardPayment.PayMoney,
                                                            PaymentCurrency = grp_CreditCardPayment.PaymentCurrency,
                                                            Payee = grp_CreditCardPayment.Payee,
                                                            OrbitalPrivateTransfer = grp_CreditCardPayment.OrbitalPrivateTransfer,
                                                            DayRate = grp_CreditCardPayment.DayRate,
                                                            RMBPrice = grp_CreditCardPayment.RMBPrice,
                                                        }).ExecuteCommandAsync();
                            if (CTable != 0)
                            {
                                result = new Result() { Code = 0, Msg = "修改成功!" };
                            }
                            else
                            {
                                result = new Result() { Code = -1, Msg = "修改失败!" };
                                RollbackTran();
                            }
                        }
                        else
                        {
                            RollbackTran();
                            result = new Result() { Code = -1, Msg = "修改失败!" };
                        }
                    }
                    else
                    {
                        RollbackTran();
                        result = new Result() { Code = -1, Msg = "修改失败!" };
                    }
                }
                CommitTran();
            }
            catch (Exception ex)
            {
                result = new Result() { Code = -2, Msg = "程序错误!" };
                throw;
            }
            return result;
        }
    }
}