using FluentValidation;
using OASystem.Domain.Enums;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace OASystem.Domain.Dtos.PersonnelModule
{
    /// <summary>
    /// 物品DTO
    /// </summary>
    public class GoodsDto
    {
    }

    #region 物品 DTO

    /// <summary>
    /// 物品List DTO
    /// </summary>
    public class GoodsListDto : DtoBase
    {
        /// <summary>
        /// 类型Id
        /// 全部类型:""
        /// 其他类型:"1,2,3,4,5"
        /// </summary>
        public string TypeIds { get; set; }
        public string GoodsName { get; set; }
    }

    /// <summary>
    /// 物品 OP  DTO
    /// </summary>
    public class GoodsOpDto
    {
        /// <summary>
        /// ID编号
        /// ID > 0 Edit
        /// ID < 1 Add
        /// </summary>
        public int Id { get; set; }

        /// <summary>
        /// 物品名称
        /// </summary>
        public string Name { get; set; }

        /// <summary>
        /// 类型
        /// </summary>
        public int Type { get; set; }

        /// <summary>
        /// 物品单位
        /// </summary>
        public string Unit { get; set; }

        /// <summary>
        /// 备注
        /// </summary>
        public string Remark { get; set; }
    }

    /// <summary>
    /// 物品 OP  DTO
    /// Validator
    /// </summary>
    public class GoodsOPDTOValidator : AbstractValidator<GoodsOpDto>
    {
        /// <summary>
        /// 初始化
        /// </summary>
        public GoodsOPDTOValidator()
        {
            //RuleFor(x => x.CurrUserId).Must(x => x > 0).WithMessage("请传入当前登陆用户ID!");
            RuleFor(x => x.Name).NotEmpty().WithMessage("物品名称为空!");
            RuleFor(x => x.Type).Must(x => x > 0).WithMessage("物品所属类型未选择!");
        }
    }


    #endregion


    #region 物品入库 DTO

    /// <summary>
    /// 物品入库List DTO
    /// </summary>
    public class GoodsStorageListDto : DtoBase
    {
        public int CurrUserId { get; set; }

        /// <summary>
        /// 物品Id
        /// </summary>
        public int GoodsId { get; set; }

        /// <summary>
        /// 入库/出库审核状态Ids
        /// 多个eg:"1,2,3,4"
        /// </summary>
        public string AuditLabel { get; set; }

        /// <summary>
        /// 物品Name(入库审核List搜索条件)
        /// </summary>
        public string GoodsName { get; set; }

        /// <summary>
        /// 入库批次号
        /// </summary>
        public string? BatchNo { get; set; }
    }

    /// <summary>
    /// 物品入库 操作(Create Or Edit)
    /// </summary>
    public class GoodsStorageOpDto
    {
        /// <summary>
        /// ID编号
        /// ID > 0 Edit
        /// ID < 1 Add
        /// </summary>
        public int Id { get; set; }

        /// <summary>
        /// 商品Id
        /// </summary>
        public int GoodsId { get; set; }

        /// <summary>
        /// 此次入库数量
        /// </summary>
        public decimal Quantity { get; set; }

        /// <summary>
        /// 此次物品单价
        /// </summary>
        public decimal UnitPrice { get; set; }

        /// <summary>
        /// 此次物品总价
        /// </summary>
        public decimal TotalPrice { get; set; }

        /// <summary>
        /// 此次供应商名称
        /// </summary>
        public string? SupplierName { get; set; }

        /// <summary>
        /// 此次供应商电话
        /// </summary>
        public string? SupplierTel { get; set; }

        /// <summary>
        /// 此次供应商地址
        /// </summary>
        public string? SupplierAddress { get; set; }

        /// <summary>
        /// 此次供应商来源
        /// </summary>
        public string? SupplierSource { get; set; }

        /// <summary>
        /// 入库人
        /// </summary>
        public int StorageUserId { get; set; }
        
        /// <summary>
        /// 入库时间
        /// eg:2024-10-01 15:00:00
        /// </summary>
        public string? StorageTime { get; set; }

        /// <summary>
        /// 备注
        /// </summary>
        public string? Remark { get; set; }

    }

    public class GoodsStorageConfirmDto
    {
        public int Id { get; set; }

        /// <summary>
        /// 审核部门
        /// 1:人事部
        /// 2:财务部
        /// </summary>
        public GoodsAuditDepEnum AuditDep { get; set; }

        /// <summary>
        /// 入库确认状态
        /// 0:待确认
        /// 1:部分确认
        /// 2:已确认
        /// 3:已拒绝
        /// 注:可用状态(已确认、已拒绝)
        /// </summary>
        public GoodsConfirmEnum ConfirmStatus { get; set; }

    }

    /// <summary>
    /// 物品入库 操作(Create Or Edit) 
    /// Validator
    /// </summary>
    public class GoodsStorageOpDtoValidator : AbstractValidator<GoodsStorageOpDto>
    {
        /// <summary>
        /// 初始化
        /// </summary>
        public GoodsStorageOpDtoValidator()
        {
            //RuleFor(x => x.CurrUserId).Must(x => x > 0).WithMessage("请传入当前登陆用户ID!");
            RuleFor(x => x.GoodsId).Must(x => x > 0).WithMessage("请传入有效的物品Id!");
            RuleFor(x => x.Quantity).Must(x => x > 0).WithMessage("请传入有效的物品数量!");
            RuleFor(x => x.UnitPrice).Must(x => x > 0).WithMessage("请传入有效的物品单价!");
            RuleFor(x => x.TotalPrice).Must(x => x > 0).WithMessage("请传入有效的物品价格合计!");
            RuleFor(x => x.StorageUserId).Must(x => x > 0).WithMessage("请传入有效用户Id!");
            RuleFor(x => x.StorageTime).NotEmpty().WithMessage("请传入有效的入库时间!");
        }
    }



    #endregion

    #region 物品领用
    /// <summary>
    /// 物品领用List DTO
    /// </summary>
    public class GoodsReceiveAuditListDTO : DtoBase
    {
        /// <summary>
        /// 审核状态
        /// </summary>
        public int AuditStatus { get; set; }
        /// <summary>
        /// 物品Name
        /// </summary>
        public string GoodsName { get; set; }


        public int CurrUserId { get; set; }
    }

    /// <summary>
    /// 物品领用List DTO
    /// </summary>
    public class GoodsReceiveListDTO : DtoBase
    {
        /// <summary>
        /// 物品Id
        /// </summary>
        public int GoodsId { get; set; }

        /// <summary>
        /// 物品Name
        /// </summary>
        public string GoodsName { get; set; }

        /// <summary>
        /// 开始时间
        /// </summary>
        public string BeginDt { get; set; }

        /// <summary>
        /// 结束时间
        /// </summary>
        public string EndDt { get; set; }

        /// <summary>
        /// 团组Ids
        /// </summary>
        public string? GroupLabel { get; set; }

        /// <summary>
        /// 类型Ids
        /// </summary>
        public string? TypeLabel { get; set; }

        /// <summary>
        /// UserIds
        /// </summary>
        public string? UserLabel { get; set; }

        /// <summary>
        /// AuditIds
        /// </summary>
        public string AuditLabel { get; set; }

        /// <summary>
        /// 是否导出Excel
        /// </summary>
        public bool IsExcelDownload { get; set; } = false;

        public int CurrUserId { get; set; }
    }

    /// <summary>
    /// 物品领用 OP DTO
    /// </summary>
    public class GoodsReceiveOpDto
    {
        /// <summary>
        /// ID
        /// Id > 0 修改
        /// Id < 1 添加
        /// </summary>
        public int Id { get; set; }

        /// <summary>
        /// 团组Id
        /// Grp_DelegationInfo Id
        /// </summary>
        public int GroupId { get; set; }

        /// <summary>
        /// 商品Id
        /// Pm_GoodsInfo Id
        /// </summary>
        public int GoodsId { get; set; }

        /// <summary>
        /// 领用数量
        /// </summary>
        public decimal Quantity { get; set; }

        /// <summary>
        /// 领用原因
        /// </summary>
        public string? Reason { get; set; }

        /// <summary>
        /// 备注
        /// </summary>
        public string? Remark { get; set; }
    }

    /// <summary>
    /// 物品领用 OP
    /// Validator
    /// </summary>
    public class GoodsReceiveOpDtoValidator : AbstractValidator<GoodsReceiveOpDto>
    {
        /// <summary>
        /// 初始化
        /// </summary>
        public GoodsReceiveOpDtoValidator()
        {
            RuleFor(x => x.GoodsId).Must(x => x > 0).WithMessage("请传入有效的物品Id!");
            RuleFor(x => x.Quantity).Must(x => x > 0).WithMessage("请传入有效的物品数量!");
            RuleFor(x => x.Reason).NotEmpty().WithMessage("请填写领用原由!");
        }
    }


    public class GoodsReceiveBatchOpDto : GoodsReceiveBatchView
    {
        public int CurrUserId { get; set; }
    }





    public class GoodsReceiveBatchView
    {
        /// <summary>
        /// ID
        /// Id > 0 修改
        /// Id < 1 添加
        /// </summary>
        public int Id { get; set; }

        /// <summary>
        /// 团组Id
        /// Grp_DelegationInfo Id
        /// </summary>
        public int GroupId { get; set; }

        /// <summary>
        /// 领用详情
        /// </summary>
        public GoodsReceiveDetailsView[] ReceiveDetails { get; set; }

        /// <summary>
        /// 领用原因
        /// </summary>
        public string? Reason { get; set; }

        /// <summary>
        /// 备注
        /// </summary>
        public string? Remark { get; set; }

    }

    public class GoodsReceiveAuditDto
    {
        public int Id { get; set; }
        public int CurrUserId { get; set; }
    }

    public class GoodsReceiveDetailsView
    {
        public int Id { get; set; }
        ///// <summary>
        ///// 物品领用Id
        ///// </summary>
        //public int GoodsReceiveId { get; set; }
        /// <summary>
        /// 物品Id
        /// Pm_GoodsInfo Id
        /// </summary>
        public int GoodsId { get; set; }
        /// <summary>
        /// 物品名称
        /// </summary>
        public string GoodsName { get; set; }
        ///// <summary>
        ///// 物资入库批次信息
        ///// {storageId:1,quantity:10}
        ///// </summary>
        //public string? GoodsStorageInfo { get; set; }
        /// <summary>
        /// 领用数量
        /// </summary>
        public decimal Quantity { get; set; }

        public string Remark { get; set; }

    }

    public class GoodsReceiveBatchListDto: DtoBase
    {
        /// <summary>
        /// 当前登陆人
        /// </summary>
        public int CurrUserId { get; set; }

        /// <summary>
        /// 物品名称
        /// </summary>
        public string GoodsName { get; set; }

    }

    public class GoodsReceiveBatchListView
    {
        public int Id { get; set; }
        public string GoodsName { get; set; }
        /// <summary>
        /// 累计数量
        /// </summary>
        public decimal AccumQty { get; set; }


        public string GoodsDetails { get; set; }

        /// <summary>
        /// 原因
        /// </summary>
        public string Reason { get; set; }

        /// <summary>
        /// 备注
        /// </summary>
        public string Remark { get; set; }

        /// <summary>
        /// 审核状态
        /// </summary>
        public GoodsAuditEnum Status { get; set; }

        /// <summary>
        /// 审核状态文本描述
        /// </summary>
        public string StatusText
        {
            get
            {
                return Status switch
                {
                    GoodsAuditEnum.Pending => GoodsAuditEnum.Pending.GetEnumDescription(),
                    GoodsAuditEnum.Approved => GoodsAuditEnum.Approved.GetEnumDescription(),
                    GoodsAuditEnum.UnApproved => GoodsAuditEnum.UnApproved.GetEnumDescription(),
                    GoodsAuditEnum.OutPending => GoodsAuditEnum.OutPending.GetEnumDescription(),
                    GoodsAuditEnum.OutConfirming => GoodsAuditEnum.OutConfirming.GetEnumDescription(),
                    GoodsAuditEnum.OutConfirmed => GoodsAuditEnum.OutConfirmed.GetEnumDescription(),
                    GoodsAuditEnum.OutRejected => GoodsAuditEnum.OutRejected.GetEnumDescription(),
                    _ => "未知状态"
                };
            }
        }

        /// <summary>
        /// 申请人
        /// </summary>
        public string Applicant { get; set; }

        /// <summary>
        /// 申请时间
        /// </summary>
        public DateTime ApplyTime { get; set; }
    }

    /// <summary>
    /// 物品领用 Audit DTO
    /// </summary>
    public class GoodsReceiveAuditDTO
    {
        /// <summary>
        /// 数据ID string
        /// 1,2,3,4
        /// </summary>
        public string Label { get; set; }

        /// <summary>
        /// 审核状态 可用状态 0:取消领用确认、取消领用拒绝 1:领用确认 2:领用拒绝 3:取消出库确认、取消出库拒绝 5:出库确认 6:出库拒绝
        /// </summary>
        public GoodsAuditEnum AuditEnum { get; set; }
    }

    /// <summary>
    /// 物品领用 Audit
    /// Validator
    /// </summary>
    public class GoodsReceiveAuditDTOValidator : AbstractValidator<GoodsReceiveAuditDTO>
    {
        /// <summary>
        /// 初始化
        /// </summary>
        public GoodsReceiveAuditDTOValidator()
        {
            RuleFor(x => x.Label).NotEmpty().WithMessage("数据ID字符串为空!");
        }
    }
    #endregion

}