using AutoMapper;
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.Financial;
using OASystem.Domain.ViewModels.Groups;
using OASystem.Domain.ViewModels.QiYeWeChat;
using OASystem.Domain.ViewModels.Resource;
using OASystem.Infrastructure.Repositories.System;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.Intrinsics.Arm;
using System.Text;
using System.Threading.Tasks;

namespace OASystem.Infrastructure.Repositories.Groups
{
    public class DecreasePaymentsRepository : BaseRepository<Grp_DecreasePayments, Grp_DecreasePayments>
    {
        private readonly IMapper _mapper;
        private readonly TeamRateRepository _teamRateRep;
        public DecreasePaymentsRepository(SqlSugarClient sqlSugar, IMapper mapper, TeamRateRepository teamRateRep) 
            : base(sqlSugar)
        {
            this._mapper = mapper;
            _teamRateRep = teamRateRep;
        }
        /// <summary>
        /// 根据团组Id查询数据
        /// </summary>
        /// <param name="dto"></param>
        /// <returns></returns>
        public async Task<Result> DecreasePaymentsList(DecreasePaymentsListDto dto)
        {
            Result result = new Result() { Code = -2, Msg = "未知错误" };
            try
            {
                //string UserId = "0";
                //List<Grp_GroupsTaskAssignment> gtaUIdList = _sqlSugar.Queryable<Grp_GroupsTaskAssignment>().Where(a => a.DIId == dto.DiId && a.IsDel == 0 && a.CTId == 98).ToList();
                //UserId = string.Join(",", gtaUIdList.Select(it => it.UId).ToList());

                string sql = string.Format(@"select Id,DiId,PriceName,Price,(select name from Sys_SetData where id=s.Currency) as Currency,FilePath,
                                            (select CnName from Sys_Users where Id=s.CreateUserId) as 'CreateUserName',CreateTime,(select IsAuditGM from 
                                            Grp_CreditCardPayment where CTable=98 and CId=s.Id and IsDel=0) as 'isAudit' from Grp_DecreasePayments s 
                                            where DIID={0} and IsDel=0  and s.CreateUserId in ({1}) ", dto.DiId, dto.UserId);
                List<DecreasePaymentsView> _DecreasePayments = await _sqlSugar.SqlQueryable<DecreasePaymentsView>(sql).ToListAsync();
                if (_DecreasePayments.Count > 0)
                {
                    result = new Result() { Code = 0, Msg = "查询成功!", Data = _DecreasePayments };
                }
                else
                {
                    result = new Result() { Code = 0, Msg = "暂无数据!", Data = _DecreasePayments };
                }
            }
            catch (Exception ex)
            {
                result = new Result() { Code = -2, Msg = ex.Message };
            }
            return result;
        }

        public async Task<Result> DecreasePaymentsSelect(DecreasePaymentsDto dto)
        {
            Result result = new Result() { Code = -2, Msg = "未知错误" };
            try
            {
                #region 团组下拉框

                List<Grp_GroupsTaskAssignment> grp_GroupsTaskAssignment = Query<Grp_GroupsTaskAssignment>(a => a.IsDel == 0 && a.UId == dto.UserId && a.CTId == dto.CTId).ToList();

                string DiId = "0";
                foreach (var item in grp_GroupsTaskAssignment)
                {
                    DiId += item.DIId + ",";
                }
                if (DiId!="0")
                {
                    DiId = DiId.Substring(0, DiId.Length - 1);
                }
                string sql = string.Format(@"select * from Grp_DelegationInfo where Id in({0}) and IsDel={1} Order By CreateTime Desc", DiId, 0);
                List<Grp_DelegationInfo> grp_Delegations = _sqlSugar.SqlQueryable<Grp_DelegationInfo>(sql).ToList();
                
                if (grp_Delegations.Count == 0)
                {
                    return result = new Result() { Code = -1, Msg = "查询失败!" };
                }
                #endregion

                #region 其他下拉框查询

                //支付方式
                List<Sys_SetData> Payment = _sqlSugar.Queryable<Sys_SetData>().Where(a => a.STid == 14 && a.IsDel == 0).ToList();
                List<SetDataInfoView> _Payment = _mapper.Map<List<SetDataInfoView>>(Payment);
                #endregion
                var data = new
                {
                    Payment = _Payment,
                    GroupName = grp_Delegations,
                };
                return result = new Result() { Code = 0, Msg = "查询成功!", Data = data };
            }
            catch (Exception ex)
            {
                return result = new Result() { Code = -2, Msg = "程序错误" };
                throw;
            }
        }

        public async Task<Result> OpDecreasePayments(DecreasePaymentsOpDto dto)
        {
            Result result = new Result() { Code = -2, Msg = "未知错误" };
            BeginTran();
            try
            {
                int id = 0;
                Grp_DecreasePayments grp_Decrease = _mapper.Map<Grp_DecreasePayments>(dto);
                List<TeamRateDescAddCurrencyIdView> teamRates = await _teamRateRep.PostGroupTeamRateItemByDiIdAndCTableId(1, dto.DiId, 98);
                if (dto.Status == 1)//添加
                {
                    string selectSql = string.Format(@"select * from Grp_DecreasePayments where PriceName='{0}' and IsDel={1} and DiId={2}"
                                                    , dto.PriceName, 0, dto.DiId);
                    var DecreasePayments = await _sqlSugar.SqlQueryable<Grp_DecreasePayments>(selectSql).FirstAsync();//查询是否存在
                    if (DecreasePayments != null)
                    {
                        return new Result() { Code = -1, Msg = "该数据已存在,请勿重复添加!" };
                    }
                    else//不存在,可添加
                    {

                        id = await AddAsyncReturnId(grp_Decrease);
                        if (id < 1)
                        {
                            RollbackTran();
                            return new Result() { Code = -1, Msg = "添加失败!" };
                        }
                        
                        //进行C表添加
                        Grp_CreditCardPayment C = new Grp_CreditCardPayment();
                        C.PayDId = dto.PayDId;
                        C.ConsumptionPatterns = "";
                        C.ConsumptionDate = "";
                        C.CTDId = 0;
                        C.BankNo = "";
                        C.CardholderName = "";
                        C.PayMoney = grp_Decrease.Price;
                        C.PaymentCurrency = grp_Decrease.Currency;
                        //当天汇率
                        //if (!string.IsNullOrEmpty(hfRate.Value))
                        //    C.DayRate = hfRate.Value;
                        //else
                        //C.DayRate = "";
                        C.CompanyBankNo = "";
                        C.OtherBankName = "";
                        C.OtherSideNo = "";
                        C.OtherSideName = "";
                        C.Remark = "";
                        C.CreateUserId = grp_Decrease.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 = 21;
                        C.AuditGMDate = "";
                        C.IsPay = 0;
                        C.DIId = grp_Decrease.DiId;
                        C.CId = id;
                        C.CTable = 98;
                        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;
                        //C.RMBPrice = 0.00f;

                        //设置该团组的汇率
                        TeamRateDescAddCurrencyIdView teamRate = teamRates.Where(it => it.CurrencyCode == grp_Decrease.Currency.ToString()).FirstOrDefault();
                        //Grp_TeamRate _TeamRate = _sqlSugar.Queryable<Grp_TeamRate>().First(a => a.DiId == grp_Decrease.DiId && a.IsDel == 0 && a.CTable == 98);
                        if (teamRate != null)
                        {
                            if (teamRate.CurrencyCode.Equals("CNY"))
                            {
                                C.DayRate = 1.0000M;
                                C.RMBPrice = C.PayMoney;
                            }
                            else
                            {
                                C.DayRate = teamRate.Rate;
                                C.RMBPrice = C.PayMoney * C.DayRate;
                            }
                        }
                        else
                        {
                            C.DayRate = 1.0000M;
                            C.RMBPrice = C.PayMoney;
                        }
                        int cId = await _sqlSugar.Insertable(C).ExecuteReturnIdentityAsync();
                        if (cId != 0)
                        {
                            CommitTran();
                            return new Result() { Code = 0, Msg = "添加成功!" };
                        }
                        else
                        {
                            RollbackTran();
                            return new Result() { Code = -1, Msg = "添加失败!" };
                        }
                        
                    }

                }
                else if (dto.Status == 2)
                {
                    bool res = await UpdateAsync(a => a.Id == grp_Decrease.Id, a => new Grp_DecreasePayments
                    {
                        DiId = grp_Decrease.DiId,
                        PriceName = grp_Decrease.PriceName,
                        Price = grp_Decrease.Price,
                        Currency = grp_Decrease.Currency,
                        FilePath = grp_Decrease.FilePath,
                        Remark = grp_Decrease.Remark,
                    });
                    if (res)
                    {
                        Grp_CreditCardPayment grp_CreditCardPayment = _sqlSugar.Queryable<Grp_CreditCardPayment>().First(a => a.CId == grp_Decrease.Id && a.CTable==98 && a.CId==grp_Decrease.Id && a.IsDel == 0);
                        if (grp_CreditCardPayment != null)
                        {
                            //设置该团组的汇率
                            TeamRateDescAddCurrencyIdView teamRate = teamRates.Where(it => it.CurrencyCode == grp_Decrease.Currency.ToString()).FirstOrDefault();
                            
                            if (teamRate != null)
                            {
                                if (teamRate.CurrencyCode.Equals("CNY"))
                                {
                                   grp_CreditCardPayment.DayRate = 1.0000M;
                                    grp_CreditCardPayment.RMBPrice = grp_CreditCardPayment.PayMoney;
                                }
                                else
                                {
                                    grp_CreditCardPayment.DayRate = teamRate.Rate;
                                    grp_CreditCardPayment.RMBPrice = grp_CreditCardPayment.PayMoney * grp_CreditCardPayment.DayRate;
                                }

                            }
                            else
                            {
                                grp_CreditCardPayment.DayRate = 1M;
                                grp_CreditCardPayment.RMBPrice = grp_Decrease.Price;
                            }
                            int CTable = await _sqlSugar.Updateable<Grp_CreditCardPayment>()
                                                        .Where(a => a.Id == grp_CreditCardPayment.Id)
                                                        .SetColumns(a => new Grp_CreditCardPayment
                                                        {
                                                            PayDId = dto.PayDId,
                                                            PayMoney = grp_Decrease.Price,
                                                            PaymentCurrency = grp_Decrease.Currency,
                                                            Payee = dto.Payee,
                                                            OrbitalPrivateTransfer = dto.OrbitalPrivateTransfer,
                                                            DayRate = grp_CreditCardPayment.DayRate,
                                                            RMBPrice = grp_CreditCardPayment.RMBPrice,

                                                        }).ExecuteCommandAsync();
                            if (CTable > 0)
                            {
                                CommitTran();
                                return new Result() { Code = 0, Msg = "修改成功!" };
                            }
                            else
                            {
                                RollbackTran();
                                return new Result() { Code = -1, Msg = "修改失败!" };
                            }
                        }
                        else
                        {
                            RollbackTran();
                            return new Result() { Code = -1, Msg = "修改失败!" };
                        }
                    }
                    else
                    {
                        RollbackTran();
                        return new Result() { Code = -1, Msg = "修改失败!" };
                    }
                }
               
            }
            catch (Exception ex)
            {
                RollbackTran();
                return new Result() { Code = -2, Msg = ex.Message };
            }
            return result;
        }

        public async Task<Result> PostGroupNameAndEasy(DecreasePaymentsDto dto)
        {
            Result result = new Result() { Code = -2, Msg = "未知错误" };
            try
            {
                #region 团组下拉框


                List<Grp_GroupsTaskAssignment> grp_GroupsTaskAssignment = Query<Grp_GroupsTaskAssignment>(a => a.IsDel == 0 && a.UId == dto.UserId && a.CTId == dto.CTId).ToList();

                string DiId = "";
                foreach (var item in grp_GroupsTaskAssignment)
                {
                    DiId += item.DIId + ",";
                }
                if (!string.IsNullOrWhiteSpace(DiId))
                {
                    DiId = DiId.Substring(0, DiId.Length - 1);
                }
                else
                {
                    DiId = "0";
                }
                
                string sql = string.Format(@"select Id,TourCode,TeamName,ClientName,VisitStartDate,VisitEndDate,VisitCountry,VisitDays,VisitPNumber from Grp_DelegationInfo where Id in({0}) and IsDel={1}", DiId, 0);
                List<DelegationEasyView> grp_Delegations = _sqlSugar.SqlQueryable<DelegationEasyView>(sql).ToList();
                if (grp_Delegations.Count != 0)
                {
                    int count = grp_Delegations.Count;
                    float totalPage = (float)count / dto.PageSize;//总页数
                    if (totalPage == 0) totalPage = 1;
                    else totalPage = (int)Math.Ceiling((double)totalPage);

                    List<DelegationEasyView> delegationEasyViews = new List<DelegationEasyView>();
                    for (int i = 0; i < dto.PageSize; i++)
                    {
                        var RowIndex = i + (dto.PageIndex - 1) * dto.PageSize;
                        if (RowIndex < grp_Delegations.Count)
                        {
                            delegationEasyViews.Add(grp_Delegations[RowIndex]);
                        }
                        else
                        {
                            break;
                        }
                    }
                    ListViewBase<DelegationEasyView> rst = new ListViewBase<DelegationEasyView>();
                    rst.DataList = delegationEasyViews;
                    rst.DataCount = count;
                    rst.CurrPageIndex = dto.PageIndex;
                    rst.CurrPageSize = dto.PageSize;
                    return result = new Result() { Code = 0, Msg = "查询成功!", Data = rst };
                }
                else
                {
                    ListViewBase<DelegationEasyView> rst = new ListViewBase<DelegationEasyView>();
                    rst.DataList=new List<DelegationEasyView>();
                    return result = new Result() { Code = 0, Msg = "暂无数据!", Data = rst };
                }
                #endregion

               
            }
            catch (Exception ex)
            {
                return result = new Result() { Code = -2, Msg = "程序错误" };
                throw;
            }
        }

        /// <summary>
        /// 根据团组增减款项表Id查询数据
        /// </summary>
        /// <param name="dto"></param>
        /// <returns></returns>
        /// <exception cref="NotImplementedException"></exception>
        public async Task<Result> QueryDecreasePaymentsById(DecreasePaymentsByIdDto dto)
        {
            Result result = new Result() { Code = -2, Msg = "程序错误" };
            try
            {
                Grp_DecreasePayments grp_Decrease = _sqlSugar.Queryable<Grp_DecreasePayments>().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==98);
                var data = new
                {
                    _Decrease = grp_Decrease,
                    _CreditCard = grp_CreditCard,
                };
                result = new Result() { Code = 0, Msg = "查询成功!", Data = data };
            }
            catch (Exception ex)
            {
                result = new Result() { Code = -2, Msg = "程序错误" };
                throw;
            }
            return result;
        }
    }
}