using AutoMapper;
using OASystem.Domain;
using OASystem.Domain.Dtos;
using OASystem.Domain.Dtos.Financial;
using OASystem.Domain.Entities.Financial;
using OASystem.Domain.ViewModels.Financial;
using OASystem.Infrastructure.Repositories.System;
using System;
using System.Collections.Generic;
using System.ComponentModel.Design;
using System.Linq;
using System.Runtime.Intrinsics.Arm;
using System.Text;
using System.Threading.Tasks;

namespace OASystem.Infrastructure.Repositories.Financial
{
    /// <summary>
    /// 财务 - 日付申请
    /// </summary>
    public class DailyFeePaymentRepository : BaseRepository<Fin_DailyFeePayment, Fin_DailyFeePaymentView>
    {
        private readonly IMapper _mapper;
        private readonly System.SetDataTypeRepository _setDataTypeRep;
        private readonly System.UsersRepository _UsersRep;
        private readonly System.CompanyRepository _CompanyRep;

        public DailyFeePaymentRepository(SqlSugarClient sqlSugar, IMapper mapper, System.SetDataTypeRepository setDataTypeRep,
            UsersRepository usersRep, CompanyRepository companyRep)
            : base(sqlSugar)
        {
            this._mapper = mapper;
            this._setDataTypeRep = setDataTypeRep;
            this._UsersRep = usersRep;
            this._CompanyRep = companyRep;
        }

        /// <summary>
        /// 日付申请查询 使用的数据源
        /// </summary>
        /// <param name="dto"></param>
        /// <returns></returns>
        public async Task<Result> GetPagePriceTypeData(PortDtoBase dto)
        {
            Result result = new Result() { Code = -2 };

            dynamic? DailyFeePaymentList = null;

            var setTypeData = _setDataTypeRep.QueryDto<Sys_SetDataType, Fin_DailyFeePaymentPagePriceTypeView>().ToList();
            var setData = _setDataTypeRep.QueryDto<Sys_SetData, Fin_DailyFeePaymentPagePriceSubTypeView>().ToList();

            //48人员费用  49办公费用 50 销售费用 51 其他费用 55 大运会
            var priceTypeData = setTypeData.Where(s => s.Id == 48 || s.Id == 49 || s.Id == 50 || s.Id == 51 || s.Id == 55).ToList();
            var priceSubTypeData = setData.Where(s => s.STid == 48 || s.STid == 49 || s.STid == 50 || s.STid == 51 || s.STid == 55).ToList();
            //员工姓名列表
            var userNameData = await _UsersRep.GetUserNameList(dto.PortType);
            //62 公转 63 私转
            var feeMarkTypeData = setTypeData.Where(s => s.Id == 62 || s.Id == 63).ToList();
            var feeMarkSubTypeData = setData.Where(s => s.STid == 62 || s.STid == 63).ToList();
            var companyNameData = await _CompanyRep.GetCompanyNameData();

            if (dto.PortType == 1) //web
            {
                DailyFeePaymentList = new Fin_DailyFeePaymentPagePriceTypeDataView
                {
                    FeeTypeData = priceTypeData,
                    FeeSubTypeData = priceSubTypeData,
                    UserNameData = userNameData.Data,
                    FeeMarkTypeData = feeMarkTypeData,
                    FeeMarkSubTypeData = feeMarkSubTypeData,
                    CompanyNameData = companyNameData.Data
                };
            }
            else if (dto.PortType == 2) //安卓
            {

                DailyFeePaymentList = new
                {
                    UserNameData = userNameData.Data,
                    FeeTypeData = priceTypeData,
                    FeeTypeSubData = priceSubTypeData
                };
            }

            result.Code = 0;
            result.Msg = "查询成功!";
            result.Data = DailyFeePaymentList;
            return result;

        }

        /// <summary>
        /// 日付申请查询 使用的数据源
        /// </summary>
        /// <param name="dto"></param>
        /// <returns></returns>
        public async Task<Result> GetPriceTypeAddData(PortDtoBase dto)
        {
            Result result = new Result() { Code = -2 };

            dynamic? DailyFeePaymentList = null;

            var setTypeData = _setDataTypeRep.QueryDto<Sys_SetDataType, Fin_DailyFeePaymentPagePriceTypeView>().ToList();
            var setData = _setDataTypeRep.QueryDto<Sys_SetData, Fin_DailyFeePaymentPagePriceSubTypeView>().ToList();

            //48人员费用  49办公费用 50 销售费用 51 其他费用 55 大运会
            var priceTypeData = setTypeData.Where(s => s.Id == 48 || s.Id == 49 || s.Id == 50 || s.Id == 51 || s.Id == 55).ToList();
            var priceSubTypeData = setData.Where(s => s.STid == 48 || s.STid == 49 || s.STid == 50 || s.STid == 51 || s.STid == 55).ToList();
            //员工姓名列表
            var userNameData = await _UsersRep.GetUserNameList(dto.PortType);
            //62 公转 63 私转
            var feeMarkTypeData = setTypeData.Where(s => s.Id == 62 || s.Id == 63).ToList();
            var feeMarkSubTypeData = setData.Where(s => s.STid == 62 || s.STid == 63).ToList();
            var companyNameData = await _CompanyRep.GetCompanyNameData();

            if (dto.PortType == 1) //web
            {
                DailyFeePaymentList = new Fin_DailyFeePaymentPagePriceTypeDataView
                {
                    FeeTypeData = priceTypeData,
                    FeeSubTypeData = priceSubTypeData,
                    UserNameData = userNameData.Data,
                    FeeMarkTypeData = feeMarkTypeData,
                    FeeMarkSubTypeData = feeMarkSubTypeData,
                    CompanyNameData = companyNameData.Data
                };
            }
            else if (dto.PortType == 2) //安卓
            {

                DailyFeePaymentList = new
                {
                    CompanyNameData = companyNameData.Data,
                    FeeTypeData = feeMarkTypeData,
                    FeeTypeSubData = feeMarkSubTypeData
                };
            }

            result.Code = 0;
            result.Msg = "查询成功!";
            result.Data = DailyFeePaymentList;
            return result;

        }

        /// <summary>
        /// 日付申请 page 查询
        /// </summary>
        /// <param name="dto"></param>
        /// <returns></returns>
        public async Task<Result> GetPageSearchAll(PageDailyFeePaymentDto dto)
        {
            Result result = new Result() { Code = -2 };

            ListViewBase<Fin_DailyFeePaymentPageListView> dailyFeePaymentPageList = new ListViewBase<Fin_DailyFeePaymentPageListView>()
            {
                ReceiveDt = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")
            };

            #region sql条件处理
            string sqlWhere = "";

            if (dto.CompanyId != -1)  //公司
                sqlWhere += string.Format(" And dfp.CompanyId = {0}", dto.CompanyId);

            if (dto.FinancialAuditStatus != -1) //财务审核
                sqlWhere += string.Format(" And dfp.FAudit = {0}", dto.FinancialAuditStatus);

            if (dto.ManagerAuditStatus != -1)   //总经理审核
                sqlWhere += string.Format(" And dfp.MAudit = {0}", dto.ManagerAuditStatus);

            if (dto.FeeTypeId != -1)   //费用类型
            {
                if (dto.FeeSubTypeId != -1) //子类处理
                {
                    sqlWhere += string.Format(" And dfp.PriceTypeId = {0}", dto.FeeSubTypeId);
                }
                else
                {
                    var setData = _setDataTypeRep.QueryDto<Sys_SetData, SetDataView>(s => s.STid == dto.FeeTypeId).ToList();
                    if (setData.Count > 0)
                    {
                        string setDataIds = "";
                        foreach (var item in setData)
                        {
                            setDataIds += item.Id + ",";
                        }

                        if (setDataIds.Length > 0)
                        {
                            setDataIds = setDataIds.Substring(0, setDataIds.Length - 1);
                            sqlWhere += string.Format(" And dfp.PriceTypeId In ({0})", setDataIds);
                        }
                    }
                }
            }

            if (!string.IsNullOrEmpty(dto.FeeDesc))
                sqlWhere += string.Format(" And dfp.Instructions Like '%{0}%'", dto.FeeDesc);

            if (dto.CreateUserId != -1)
                sqlWhere += string.Format(" And dfp.CreateUserId = {0}", dto.CreateUserId);


            int startIndex = (dto.PageIndex - 1) * dto.PageSize + 1;
            int endIndex = startIndex + dto.PageSize - 1;

            string sqlPage = string.Format(@"Select * From (	
                                                Select row_number() over (order by dfp.Id Desc) as RowNumber,
                                                    dfp.Id,dfp.CompanyId,c.CompanyName,dfp.Instructions,dfp.SumPrice,
                                                    dfp.CreateUserId,u.CnName CreateUser,dfp.CreateTime,dfp.FAudit,dfp.MAudit,
                                                    dfp.PriceTypeId
                                                From Fin_DailyFeePayment dfp
                                                Inner Join Sys_Company c On dfp.CompanyId = c.Id
                                                Left Join Sys_Users u On dfp.CreateUserId = u.Id
                                                Where dfp.IsDel=0 {0} 
                                                ) temp Where RowNumber Between {1} and {2}", sqlWhere, startIndex, endIndex);


            string sqlCount = string.Format(@"Select COUNT(1) as Count From (	
                                                Select dfp.Id,dfp.CompanyId,c.CompanyName,dfp.Instructions,dfp.SumPrice,
                                                       dfp.CreateUserId,u.CnName CreateUser,dfp.CreateTime,dfp.FAudit,dfp.MAudit,
                                                       dfp.PriceTypeId
                                                From Fin_DailyFeePayment dfp
                                                Inner Join Sys_Company c On dfp.CompanyId = c.Id
                                                Left Join Sys_Users u On dfp.CreateUserId = u.Id
                                                Where dfp.IsDel=0 {0} 
                                                ) temp ", sqlWhere);
            #endregion

           
            if (dto.PortType == 1 || dto.PortType == 2) //web
            {
                //Fin_DailyFeePaymentPageCount
                var dailyFeePaymentCount = await _sqlSugar.SqlQueryable<Fin_DailyFeePaymentPageCount>(sqlCount).FirstAsync();
                var DailyFeePaymentData = await _sqlSugar.SqlQueryable<Fin_DailyFeePaymentPageListView>(sqlPage).ToListAsync();

                int totalCount = dailyFeePaymentCount.Count;
                
                dailyFeePaymentPageList = new ListViewBase<Fin_DailyFeePaymentPageListView>
                {
                    CurrPageIndex = dto.PageIndex,
                    CurrPageSize = dto.PageSize,
                    DataCount = totalCount,
                    DataList = DailyFeePaymentData
                };

            }

            result.Code = 0;
            result.Msg = "查询成功!";
            result.Data = dailyFeePaymentPageList;
            return result;

        }

        /// <summary>
        /// 日付申请 single 查询 By Id
        /// </summary>
        /// <param name="dto"></param>
        /// <returns></returns>
        public async Task<Result> GetSearchById(SearchDailyFeePaymentDto dto)
        {
            Result result = new Result() { Code = -2 };

            if (dto.PortType == 1) //web
            {
                Fin_DailyFeePaymentInfolView feeData = new Fin_DailyFeePaymentInfolView();

                string feeSql = string.Format(@"Select * From Fin_DailyFeePayment 
                                                Where IsDel=0 And Id = {0} ", dto.Id);
                feeData = await _sqlSugar.SqlQueryable<Fin_DailyFeePaymentInfolView>(feeSql).FirstAsync();
                string feeContentSql = string.Format(@"Select * From Fin_DailyFeePaymentContent 
                                                        Where IsDel=0 And DFPId = {0} ", dto.Id);
                feeData.FeeContents = await _sqlSugar.SqlQueryable<Fin_DailyFeePaymentContentInfolView>(feeContentSql).ToListAsync();

                result.Code = 0;
                result.Msg = "查询成功!";
                result.Data = feeData;
            }
            else if (dto.PortType == 2 || dto.PortType == 3)  //android And ios
            {

                Fin_DailyFeePaymentInfoAndroidlView feeData = new Fin_DailyFeePaymentInfoAndroidlView();

                string feeSql = string.Format(@"Select * From Fin_DailyFeePayment 
                                                Where IsDel=0 And Id = {0} ", dto.Id);
                feeData = await _sqlSugar.SqlQueryable<Fin_DailyFeePaymentInfoAndroidlView>(feeSql).FirstAsync();
                string feeContentSql = string.Format(@"Select * From Fin_DailyFeePaymentContent 
                                                        Where IsDel=0 And DFPId = {0} ", dto.Id);
                feeData.FeeContents = await _sqlSugar.SqlQueryable<Fin_DailyFeePaymentContentInfolView>(feeContentSql).ToListAsync();

                result.Code = 0;
                result.Msg = "查询成功!";
                result.Data = feeData;
            }

            return result;

        }

        /// <summary>
        /// 日付申请 添加
        /// </summary>
        /// <param name="dto"></param>
        /// <returns></returns>
        public async Task<Result> Add(AddDailyFeePaymentDto dto)
        {
            Result result = new Result() { Code = -2 };
            _sqlSugar.BeginTran();
            try
            {
                Fin_DailyFeePayment _fee = _mapper.Map<Fin_DailyFeePayment>(dto);
                _fee.CreateUserId = dto.UserId;
                int? feeId = await _sqlSugar.Insertable(_fee).ExecuteReturnIdentityAsync();

                if (dto.FeeContents.Count > 0)
                {
                    List<Fin_DailyFeePaymentContent> _feeContents = _mapper.Map<List<Fin_DailyFeePaymentContent>>(dto.FeeContents);

                    foreach (var item in _feeContents)
                    {
                        item.DFPId = feeId == null ? -1 : Convert.ToInt32(feeId);
                        item.CreateUserId = dto.UserId;
                    }
                    await _sqlSugar.Insertable(_feeContents).ExecuteCommandAsync();
                }
               
                _sqlSugar.CommitTran();
                result.Code = 0;
            }
            catch (Exception ex)
            {
                _sqlSugar.RollbackTran();
                result.Msg = ex.Message;
            }

            return result;

        }

        /// <summary>
        /// 日付申请 编辑
        /// </summary>
        /// <param name="dto"></param>
        /// <returns></returns>
        public async Task<Result> Edit(EditDailyFeePaymentDto dto)
        {
            Result result = new Result() { Code = -2 };

            #region 已审核过的日付申请不可编辑

            Fin_DailyFeePayment _DailyFeePayment = await _sqlSugar.Queryable<Fin_DailyFeePayment>().Where(it => it.Id == dto.Id && it.IsDel == 0).FirstAsync();
            if (_DailyFeePayment != null)
            {
                if (_DailyFeePayment.FAudit != 0 && _DailyFeePayment.MAudit != 0)
                {
                    result.Msg = "财务和总经理均已审核,不可修改!";
                    return result;
                }
                else if (_DailyFeePayment.FAudit != 0)
                {
                    result.Msg = "财务已审核,不可修改!";
                    return result;
                }
                else if (_DailyFeePayment.MAudit != 0)
                {
                    result.Msg = "总经理已审核,不可修改!";
                    return result;
                }

            }

            #endregion

            _sqlSugar.BeginTran();
            try
            {
                Fin_DailyFeePayment _fee = _mapper.Map<Fin_DailyFeePayment>(dto);
                _fee.CreateUserId = dto.UserId;
                int? editFeeStatus = await _sqlSugar.Updateable<Fin_DailyFeePayment>()
                                      .Where(a => a.Id == dto.Id)
                                      .SetColumns(a => new Fin_DailyFeePayment
                                      {
                                          Instructions = dto.Instructions,
                                          SumPrice = dto.SumPrice,
                                          TransferTypeId = dto.TransferTypeId,
                                          PriceTypeId = dto.PriceTypeId,
                                          CompanyId = dto.CompanyId,
                                      }).ExecuteCommandAsync();

                List<Fin_DailyFeePaymentContent> _feeContents = _mapper.Map<List<Fin_DailyFeePaymentContent>>(dto.FeeContents);


                await _sqlSugar.Updateable<Fin_DailyFeePaymentContent>()
                                  .Where(a => a.DFPId == _fee.Id)
                                  .SetColumns(a => new Fin_DailyFeePaymentContent
                                  {
                                      IsDel = 1,
                                      DeleteUserId = _fee.CreateUserId,
                                      DeleteTime = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"),
                                  }).ExecuteCommandAsync();


                if (_feeContents.Count > 0)
                {
                    foreach (var item in _feeContents)
                    {

                        item.DFPId = _fee.Id;
                        item.CreateUserId = dto.UserId;

                    }

                    if (_feeContents.Count > 0)
                    {
                        await _sqlSugar.Insertable(_feeContents).ExecuteCommandAsync();

                    }
                }

                _sqlSugar.CommitTran();
                result.Code = 0;
            }
            catch (Exception ex)
            {
                _sqlSugar.RollbackTran();
                result.Msg = ex.Message;
            }

            return result;
        }

        /// <summary>
        /// 日付申请 删除
        /// </summary>
        /// <param name="dto"></param>
        /// <returns></returns>
        public async Task<Result> Del(DelDailyFeePaymentDto dto)
        {
            Result result = new Result() { Code = -2 };

            int? delFeeStatus = await _sqlSugar.Updateable<Fin_DailyFeePayment>()
                                  .Where(a => a.Id == dto.Id)
                                  .SetColumns(a => new Fin_DailyFeePayment
                                  {
                                      IsDel =1,
                                      DeleteUserId = dto.Id,
                                      DeleteTime = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"),
                                  }).ExecuteCommandAsync();

            result.Code = 0;
            return result;
        }

        /// <summary>
        /// 日付申请 审核
        /// </summary>
        /// <param name="dto"></param>
        /// <returns></returns>
        public async Task<Result> DelDailyPaymentAudit(DP_AuditStatusDto dto)
        {
            Result result = new Result() { Code = -2 };

            if (dto.AuditType == 1) //财务审核
            {
                int? auditStatus = await _sqlSugar.Updateable<Fin_DailyFeePayment>()
                                  .Where(a => a.Id == dto.Id)
                                  .SetColumns(a => new Fin_DailyFeePayment
                                  {
                                      FAudit = dto.AuditStatus,
                                      FAuditDate = DateTime.Now,
                                  }).ExecuteCommandAsync();
                if (auditStatus != null && auditStatus > 0)
                    result.Code = 0;
                else
                    result.Msg = "财务审核操作失败";
            }
            else if (dto.AuditType == 2) //总经理
            {
                int? auditStatus = await _sqlSugar.Updateable<Fin_DailyFeePayment>()
                                  .Where(a => a.Id == dto.Id)
                                  .SetColumns(a => new Fin_DailyFeePayment
                                  {
                                      MAudit = dto.AuditStatus,
                                      MAuditDate = DateTime.Now,
                                  }).ExecuteCommandAsync();

                if (auditStatus != null && auditStatus > 0)
                    result.Code = 0;
                else
                    result.Msg = "总经理审核操作失败";
            }
            return result;
        }

        
    }
}