using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace LifePayment.Domain.Shared;

public class SealSaveInput
{
    /// <summary>
    /// 印章id,为空时表示添加,不为空时表示修改
    /// </summary>
    [JsonProperty("seal_id")]
    public string? SealId { get; set; }

    /// <summary>
    /// 印章名称
    /// </summary>
    [JsonProperty("seal_name")]
    [Required(ErrorMessage = "印章名称是必填项")]
    public string SealName { get; set; }

    /// <summary>
    /// 印章描述
    /// </summary>
    [JsonProperty("seal_description")]
    [Required(ErrorMessage = "印章描述是必填项")]
    public string SealDescription { get; set; }

    /// <summary>
    /// 印章类型,ENTERPRISE-企业公章,ENTERPRISE_WITH_CODE-带有统一社会代码的企业公章,CONTRACT-合同专用章
    /// </summary>
    [JsonProperty("seal_type")]
    [Required(ErrorMessage = "印章类型是必填项")]
    public string SealType { get; set; }

    /// <summary>
    /// 企业名称
    /// </summary>
    [JsonProperty("enterprise_name")]
    [Required(ErrorMessage = "企业名称是必填项")]
    public string EnterpriseName { get; set; }

    /// <summary>
    /// 统一社会信用代码
    /// </summary>
    [JsonProperty("enterprise_cert_no")]
    [Required(ErrorMessage = "统一社会信用代码是必填项")]
    public string EnterpriseCertNo { get; set; }
}

public class SealBatchQueryInput
{
    /// <summary>
    /// 印章id
    /// </summary>
    [JsonProperty("seal_id")]
    public string? SealId { get; set; }

    /// <summary>
    /// 印章名称
    /// </summary>
    [JsonProperty("seal_name")]
    public string? SealName { get; set; }

    /// <summary>
    /// 页数,默认1,必须大于0
    /// </summary>
    [JsonProperty("page_no")]
    [Range(1, int.MaxValue, ErrorMessage = "页数必须大于0")]
    public int PageNo { get; set; } = 1;

    /// <summary>
    /// 页面大小,默认200,必须大于0
    /// </summary>
    [JsonProperty("page_size")]
    [Range(1, int.MaxValue, ErrorMessage = "页面大小必须大于0")]
    public int PageSize { get; set; } = 200;
}

public class SealAuthInput
{
    /// <summary>
    /// 印章ID
    /// </summary>
    [JsonProperty("seal_id")]
    [Required(ErrorMessage = "印章ID是必填项")]
    public string SealId { get; set; }

    /// <summary>
    /// 授权开始时间
    /// </summary>
    [JsonProperty("auth_start_date")]
    [Required(ErrorMessage = "授权开始时间是必填项")]
    public DateTime AuthStartDate { get; set; }

    /// <summary>
    /// 授权结束时间
    /// </summary>
    [JsonProperty("auth_end_date")]
    [Required(ErrorMessage = "授权结束时间是必填项")]
    public DateTime AuthEndDate { get; set; }
}

public class FileUploadInput
{
    /// <summary>
    /// 业务编码:ecsign_contract_upload
    /// </summary>
    [JsonProperty("biz_code")]
    [Required(ErrorMessage = "业务编码是必填项")]
    public string BizCode { get; set; } = AliPayEcsignConstant.AliPayEcsignSignBizCode.EcsignContractUpload;

    /// <summary>
    /// 文件的md5值,如果不传则不校验md5
    /// </summary>
    [JsonProperty("md5")]
    public string? Md5 { get; set; }

    /// <summary>
    /// 文件内容的二进制流
    /// </summary>
    [JsonIgnore]
    [Required(ErrorMessage = "文件内容是必填项")]
    public byte[] FileContent { get; set; }

    /// <summary>
    /// 文件名称
    /// </summary>
    [JsonIgnore]
    public string FileName { get; set; }
}

public class TemplateSaveInput
{
    /// <summary>
    /// 模板ID,为空时表示添加,不为空时表示修改
    /// </summary>
    [JsonProperty("template_id")]
    public string? TemplateId { get; set; }

    /// <summary>
    /// 模板名称,后续会展示给用户
    /// </summary>
    [JsonProperty("template_name")]
    [Required(ErrorMessage = "模板名称是必填项")]
    public string TemplateName { get; set; }

    /// <summary>
    /// 模板描述
    /// </summary>
    [JsonProperty("template_memo")]
    [Required(ErrorMessage = "模板描述是必填项")]
    public string TemplateMemo { get; set; }

    /// <summary>
    /// 文件ID
    /// </summary>
    [JsonProperty("template_file_id")]
    [Required(ErrorMessage = "文件ID是必填项")]
    public string TemplateFileId { get; set; }

    /// <summary>
    /// 企业印章控件列表
    /// </summary>
    [JsonProperty("corporate_seal_rects")]
    public List<RectItem> CorporateSealRects { get; set; } = new List<RectItem>();

    /// <summary>
    /// 个人印章控件列表
    /// </summary>
    [JsonProperty("personal_seal_rects")]
    public List<PersonalSealRectItem> PersonalSealRects { get; set; } = new List<PersonalSealRectItem>();

    /// <summary>
    /// 时间戳控件列表
    /// </summary>
    [JsonProperty("time_stamp_rects")]
    public List<TimeStampRectItem> TimeStampRects { get; set; } = new List<TimeStampRectItem>();

    /// <summary>
    /// 单行文本框控件列表
    /// </summary>
    [JsonProperty("singleline_text_rects")]
    [Required(ErrorMessage = "单行文本框控件列表是必填项")]
    public List<TextRectItem> SinglelineTextRects { get; set; } = new List<TextRectItem>();

    /// <summary>
    /// 多行文本框控件列表
    /// </summary>
    [JsonProperty("multilineTextRects")]
    public List<TextRectItem> MultilineTextRects { get; set; } = new List<TextRectItem>();
}

public class RectItem
{
    /// <summary>
    /// 输入项控件唯一表示ID,使用模板时可以根据rect_id进行填充
    /// </summary>
    [JsonProperty("rect_id")]
    [Required(ErrorMessage = "控件ID是必填项")]
    public string RectId { get; set; }

    /// <summary>
    /// 控件名称
    /// </summary>
    [JsonProperty("rect_name")]
    [Required(ErrorMessage = "控件名称是必填项")]
    public string RectName { get; set; }

    /// <summary>
    /// PDF页码
    /// </summary>
    [JsonProperty("page")]
    [Required(ErrorMessage = "PDF页码是必填项")]
    public int Page { get; set; }

    /// <summary>
    /// x轴坐标,左下角为原点
    /// </summary>
    [JsonProperty("offset_x")]
    [Required(ErrorMessage = "x轴坐标是必填项")]
    public int OffsetX { get; set; }

    /// <summary>
    /// y轴坐标,左下角为原点
    /// </summary>
    [JsonProperty("offset_y")]
    [Required(ErrorMessage = "y轴坐标是必填项")]
    public int OffsetY { get; set; }
}

public class PersonalSealRectItem : RectItem
{
    /// <summary>
    /// 个人签章方式:PERSONAL_SEAL-电子签章,HAND_WRITE-手写签名
    /// </summary>
    [JsonProperty("signature_type")]
    public string? SignatureType { get; set; }
}

public class TimeStampRectItem : RectItem
{
    /// <summary>
    /// 时间戳格式:yyyy-MM-dd,yyyy/MM/dd,yyyy年MM月dd日
    /// </summary>
    [JsonProperty("time_format")]
    [Required(ErrorMessage = "时间戳格式是必填项")]
    public string TimeFormat { get; set; }
}

public class TextRectItem : RectItem
{
    /// <summary>
    /// 是否必填,默认true
    /// </summary>
    [JsonProperty("required")]
    public bool Required { get; set; } = true;

    /// <summary>
    /// 控件样式
    /// </summary>
    [JsonProperty("rectStyle")]
    [Required(ErrorMessage = "控件样式是必填项")]
    public RectStyle RectStyle { get; set; }
}

public class RectStyle
{
    /// <summary>
    /// 控件宽度,文字超出部分会被裁剪
    /// </summary>
    [JsonProperty("width")]
    [Required(ErrorMessage = "控件宽度是必填项")]
    public double Width { get; set; }

    /// <summary>
    /// 控件高度
    /// </summary>
    [JsonProperty("height")]
    public double Height { get; set; } = 22.0;

    /// <summary>
    /// 填充字体,默认 1-宋体
    /// </summary>
    [JsonProperty("font")]
    public int Font { get; set; } = 1;

    /// <summary>
    /// 填充字体大小,默认12
    /// </summary>
    [JsonProperty("font_size")]
    public int FontSize { get; set; } = 12;

    /// <summary>
    /// 填充字体颜色,默认#000000 黑色
    /// </summary>
    [JsonProperty("text_color")]
    public string TextColor { get; set; } = "#000000";
}

public class TemplateBatchQueryInput
{
    /// <summary>
    /// 模板ID(可选)
    /// </summary>
    [JsonProperty("template_id")]
    public string TemplateId { get; set; }

    /// <summary>
    /// 模板名称(可选)
    /// </summary>
    [JsonProperty("template_name")]
    public string TemplateName { get; set; }

    /// <summary>
    /// 页数,默认1,必须大于0(可选)
    /// </summary>
    [JsonProperty("page_no")]
    public int PageNo { get; set; } = 1;

    /// <summary>
    /// 页面大小,默认200(可选)
    /// </summary>
    [JsonProperty("page_size")]
    public int PageSize { get; set; } = 200;
}

public class TemplateQueryInput
{
    [JsonProperty("template_id")]
    public string TemplateId { get; set; }
}

public class SolutionSaveInput
{
    /// <summary>
    /// 签约方案编码,为空时表示添加,不为空时表示修改
    /// </summary>
    [JsonProperty("solution_code")]
    public string? SolutionCode { get; set; }

    /// <summary>
    /// 签约方案名称,签署时会对客展示
    /// </summary>
    [JsonProperty("solution_name")]
    [Required(ErrorMessage = "签约方案名称是必填项")]
    public string SolutionName { get; set; }

    /// <summary>
    /// 签约方案描述
    /// </summary>
    [JsonProperty("solution_description")]
    [Required(ErrorMessage = "签约方案描述是必填项")]
    public string SolutionDescription { get; set; }

    /// <summary>
    /// 签约合同列表
    /// </summary>
    [JsonProperty("template_vo_list")]
    [Required(ErrorMessage = "签约合同列表是必填项")]
    public List<TemplateVo> TemplateVoList { get; set; } = new List<TemplateVo>();

    /// <summary>
    /// 签约核身配置
    /// </summary>
    [JsonProperty("attribute_vo_list")]
    [Required(ErrorMessage = "签约核身配置是必填项")]
    public List<AttributeVo> AttributeVoList { get; set; } = new List<AttributeVo>();
}

public class TemplateVo
{
    /// <summary>
    /// 合同模板ID
    /// </summary>
    [JsonProperty("template_id")]
    [Required(ErrorMessage = "合同模板ID是必填项")]
    public string TemplateId { get; set; }
}

public class AttributeVo
{
    /// <summary>
    /// 签约方式:EXTERNAL_H5-端外H5,MINI_APP-支付宝小程序/插件
    /// </summary>
    [JsonProperty("access_config_code")]
    [Required(ErrorMessage = "签约方式是必填项")]
    public string AccessConfigCode { get; set; }

    /// <summary>
    /// 核身方式:
    /// EXTERNAL_H5_SMS-端外H5,
    /// FACE_PASSWORD_ALIPAY-支付宝小程序/插件
    /// </summary>
    [JsonProperty("verify_code")]
    [Required(ErrorMessage = "核身方式是必填项")]
    public string VerifyCode { get; set; }
}

public class SolutionBatchQueryInput
{
    /// <summary>
    /// 签约方案编码
    /// </summary>
    [JsonProperty("solution_code")]
    public string? SolutionCode { get; set; }

    /// <summary>
    /// 签约方案名称
    /// </summary>
    [JsonProperty("solution_name")]
    public string? SolutionName { get; set; }

    /// <summary>
    /// 页数,默认1,必须大于0
    /// </summary>
    [JsonProperty("page_no")]
    [Range(1, int.MaxValue, ErrorMessage = "页数必须大于0")]
    public int PageNo { get; set; } = 1;

    /// <summary>
    /// 页面大小,默认200
    /// </summary>
    [JsonProperty("page_size")]
    [Range(1, int.MaxValue, ErrorMessage = "页面大小必须大于0")]
    public int PageSize { get; set; } = 200;
}

public class SolutionQueryInput
{
    /// <summary>
    /// 签约方案编码
    /// </summary>
    [JsonProperty("solution_code")]
    public string SolutionCode { get; set; }
}

public class DataprepareCreateInput
{
    /// <summary>
    /// 业务流水号,业务需保证内部唯一
    /// </summary>
    [JsonProperty("out_order_no")]
    [Required(ErrorMessage = "业务流水号是必填项")]
    public string OutOrderNo { get; set; }

    /// <summary>
    /// 签约方案编码,签约方案管理中新增获得
    /// </summary>
    [JsonProperty("solution_code")]
    [Required(ErrorMessage = "签约方案编码是必填项")]
    public string SolutionCode { get; set; }

    /// <summary>
    /// 跳转类型,NORMAL-链接跳转
    /// </summary>
    [JsonProperty("jump_type")]
    [Required(ErrorMessage = "跳转类型是必填项")]
    public string JumpType { get; set; } = "NORMAL";

    /// <summary>
    /// 签约用户信息
    /// </summary>
    [JsonIgnore]
    [Required(ErrorMessage = "签约用户信息是必填项")]
    public SignUser SignUser { get; set; }

    /// <summary>
    /// 合同模板参数
    /// </summary>
    [JsonIgnore]
    public Dictionary<string, object> TemplateData { get; set; }

    /// <summary>
    /// 签约扩展字段,无需传入,只需要传入SignUser和TemplateData 将根据这两个字段自动生成,填写用户信息以及控件rect_id的value值,查看合同时会进行校验
    /// </summary>
    [JsonProperty("ext_info")]
    public string ExtInfo { get; set; }
}

public class SignUser
{
    /// <summary>
    /// 签约的用户姓名
    /// </summary>
    [JsonProperty("signerName")]
    [Required(ErrorMessage = "签约的用户姓名是必填项")]
    public string SignerName { get; set; }

    /// <summary>
    /// 签约的用户身份证号
    /// </summary>
    [JsonProperty("certNo")]
    [Required(ErrorMessage = "签约的用户身份证号是必填项")]
    public string CertNo { get; set; }

    /// <summary>
    /// 签约的用户手机号
    /// </summary>
    [JsonProperty("bindedMobile")]
    public string? BindedMobile { get; set; }
}

public class SignorderQueryInput
{
    /// <summary>
    /// 签约方案编码
    /// </summary>
    [JsonProperty("solution_code")]
    [Required(ErrorMessage = "签约方案编码是必填项")]
    public string SolutionCode { get; set; }

    /// <summary>
    /// 发起签约的业务流水号
    /// </summary>
    [JsonProperty("out_order_no")]
    [Required(ErrorMessage = "发起签约的业务流水号是必填项")]
    public string OutOrderNo { get; set; }
}