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.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;
        public DecreasePaymentsRepository(SqlSugarClient sqlSugar, IMapper mapper) : base(sqlSugar)
        {
            this._mapper = mapper;
        }
        /// <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 = "";
                List<Grp_GroupsTaskAssignment> gtaUIdList = _sqlSugar.Queryable<Grp_GroupsTaskAssignment>().Where(a => a.DIId == dto.DiId && a.IsDel == 0 && a.CTId == 98).ToList();
                foreach (Grp_GroupsTaskAssignment gta in gtaUIdList)
                    UserId += gta.UId + ",";

                if (!string.IsNullOrWhiteSpace(UserId))
                {
                    UserId = UserId.Substring(0, UserId.Length - 1);
                }
                else
                {
                    UserId = "0";
                }
                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,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 = "未知错误" };
            }
            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 = "";
                foreach (var item in grp_GroupsTaskAssignment)
                {
                    DiId += item.DIId + ",";
                }
                DiId = DiId.Substring(0, DiId.Length - 1);
                string sql = string.Format(@"select * from Grp_DelegationInfo where Id in({0}) and IsDel={1}", 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);
                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 result = new Result() { Code = -1, Msg = "该客户已存在，请勿重复添加！" };
                    }
                    else//不存在，可添加
                    {

                        id = await AddAsyncReturnId(grp_Decrease);
                        if (id != 0)
                        {
                            result = new Result() { Code = 0, Msg = "添加成功！" };
                        }
                        else
                        {
                            result = new Result() { Code = 0, Msg = "添加失败！" };
                        }
                        if (result.Code == 0)
                        {
                            //进行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 = "";
                            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 = 0;
                            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;

                            //设置该团组的汇率
                            Grp_TeamRate _TeamRate = _sqlSugar.Queryable<Grp_TeamRate>().First(a => a.DiId == grp_Decrease.DiId && a.IsDel == 0 && a.CTable == 98);
                            if (_TeamRate != null)
                            {
                                if (grp_Decrease.Currency == 49)
                                {
                                    C.DayRate = _TeamRate.RateU;
                                    C.RMBPrice = C.PayMoney * Convert.ToDecimal(_TeamRate.RateU);
                                    //ccp.PayMoney = ccp.PayMoney * float.Parse(tr.RateU); 
                                }
                                else if (grp_Decrease.Currency == 51)
                                {
                                    C.DayRate = _TeamRate.RateE;
                                    C.RMBPrice = C.PayMoney * Convert.ToDecimal(_TeamRate.RateE);
                                    //ccp.PayMoney = ccp.PayMoney * float.Parse(tr.RateE); 
                                }
                                else
                                {
                                    C.DayRate = 1M;
                                    C.RMBPrice = C.PayMoney;
                                }
                            }
                            else
                            {
                                C.DayRate = 1M;
                                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
                        {
                            result = 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)
                        {
                            Grp_TeamRate _TeamRate = _sqlSugar.Queryable<Grp_TeamRate>().First(a => a.DiId == grp_Decrease.DiId && a.IsDel == 0 && a.CTable == 98);
                            if (_TeamRate != null)
                            {

                                if (grp_Decrease.Currency == 49)
                                {
                                    grp_CreditCardPayment.DayRate = _TeamRate.RateU;
                                    grp_CreditCardPayment.RMBPrice = grp_Decrease.Price * Convert.ToDecimal(_TeamRate.RateU);
                                    //ccp.PayMoney = ccp.PayMoney * float.Parse(tr.RateU); 
                                }
                                else if (grp_Decrease.Currency == 51)
                                {
                                    grp_CreditCardPayment.DayRate = _TeamRate.RateE;
                                    grp_CreditCardPayment.RMBPrice = grp_Decrease.Price * Convert.ToDecimal(_TeamRate.RateE);
                                    //ccp.PayMoney = ccp.PayMoney * float.Parse(tr.RateE); 
                                }
                                else
                                {
                                    grp_CreditCardPayment.DayRate = 1M;
                                    grp_CreditCardPayment.RMBPrice = grp_Decrease.Price;
                                }
                            }
                            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)
                            {
                                result = new Result() { Code = 0, Msg = "修改成功！" };
                            }
                            else
                            {
                                result = new Result() { Code = -1, Msg = "修改失败！" };
                                RollbackTran();
                            }
                        }
                        else
                        {
                            RollbackTran();
                            result = new Result() { Code = -1, Msg = "修改失败！" };
                        }
                    }
                    else
                    {
                        result = new Result() { Code = -1, Msg = "修改失败！" };
                    }
                }
                CommitTran();
            }
            catch (Exception ex)
            {
                RollbackTran();
                result = new Result() { Code = -2, Msg = "未知错误" };
            }
            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;
        }
    }
}
