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 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
    {
        /// <summary>
        /// 物品Id
        /// </summary>
        public int GoodsId { 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 string Remark { 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("请传入有效的物品价格合计!");
        }
    }



    #endregion

    #region 物品领用
    /// <summary>
    /// 物品领用List DTO
    /// </summary>
    public class GoodsReceiveListDTO : DtoBase
    {

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

        /// <summary>
        /// 当前登录UserId
        /// </summary>
        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("请填写领用原由!");
        }
    }

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

        /// <summary>
        /// 审核状态
        /// </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




}