using Newtonsoft.Json;
using System.ComponentModel.DataAnnotations;

namespace LifePayment.Domain
{
    public class UserAgreementPageSignInput
    {
        /// <summary>
        /// 个人签约产品码,商户和支付宝签约时确定,商户可咨询技术支持。值:GENERAL_WITHHOLDING_P
        /// </summary>
        [JsonProperty("personal_product_code", NullValueHandling = NullValueHandling.Ignore)]
        [Required]
        public string PersonalProductCode
        {
            get;
            set;
        }

        /// <summary>
        /// 请按当前接入的方式进行填充,且输入值必须为文档中的参数取值范围。
        /// 扫码或者短信页面签约需要拼装http的请求地址访问中间页面,钱包h5页面签约可直接拼接scheme的请求地址
        /// </summary>
        [JsonProperty("access_params", NullValueHandling = NullValueHandling.Ignore)]
        [Required]
        public AccessParams AccessParams
        {
            get;
            set;
        }

        /// <summary>
        /// 【描述】周期管控规则参数period_rule_params,在签约周期扣款产品(如CYCLE_PAY_AUTH_P)时必传,在签约其他产品时无需传入。
        /// 周期扣款产品,会按照这里传入的参数提示用户,并对发起扣款的时间、金额、次数等做相应限制。
        /// </summary>
        [JsonProperty("period_rule_params", NullValueHandling = NullValueHandling.Ignore)]
        public PeriodRuleParams PeriodRuleParams
        {
            get;
            set;
        }

        /// <summary>
        /// 销售产品码,商户签约的支付宝合同所对应的产品码。值:GENERAL_WITHHOLDING
        /// </summary>
        [JsonProperty("product_code", NullValueHandling = NullValueHandling.Ignore)]
        [Required]
        public string ParentBranchNo
        {
            get;
            set;
        }

        /// <summary>
        /// 用户在商户网站的登录账号,用于在签约页面展示,如果为空,则不展示
        /// </summary>
        [JsonProperty("external_logon_id", NullValueHandling = NullValueHandling.Ignore)]
        [Required]
        public string ExternalLogonId
        {
            get;
            set;
        }

        /// <summary>
        /// 协议签约场景,商户可根据 代扣产品常见场景值 选择符合自身的行业场景。 说明:当传入商户签约号 external_agreement_no 时,本参数必填,不能为默认值 DEFAULT|DEFAULT。
        /// </summary>
        [JsonProperty("sign_scene", NullValueHandling = NullValueHandling.Ignore)]
        [Required]
        public string SignScene
        {
            get;
            set;
        }

        /// <summary>
        /// 商家签约的产品码,固定值。安全发-服务商模式(单笔转账到支付宝账户)
        /// </summary>
        [JsonProperty("product_code", NullValueHandling = NullValueHandling.Ignore)]
        [Required]
        public string ProductCode
        {
            get;
            set;
        }

        /// <summary>
        /// 商户签约号,代扣协议中标示用户的唯一签约号(确保在商户系统中唯一)。
        /// 格式规则:支持大写小写字母和数字,最长32位。
        /// 商户系统按需传入,如果同一用户在同一产品码、同一签约场景下,签订了多份代扣协议,那么需要指定并传入该值。
        /// </summary>
        [JsonProperty("external_agreement_no", NullValueHandling = NullValueHandling.Ignore)]
        [Required]
        public string ExternalAgreementNo
        {
            get;
            set;
        }

        /// <summary>
        /// 签约第三方主体类型。对于三方协议,表示当前用户和哪一类的第三方主体进行签约。
        /// 取值范围:
        /// 1. PARTNER(平台商户)
        /// 2. MERCHANT(集团商户),集团下子商户可共享用户签约内容
        /// 默认为PARTNER。
        /// </summary>
        [JsonProperty("third_party_type", NullValueHandling = NullValueHandling.Ignore)]
        [Required]
        public string ThirdPartyType
        {
            get;
            set;
        }

        /// <summary>
        /// 当前用户签约请求的协议有效周期。
        /// 整形数字加上时间单位的协议有效期,从发起签约请求的时间开始算起。
        /// 目前支持的时间单位:
        /// 1. d:天
        /// 2. m:月
        /// 如果未传入,默认为长期有效。
        /// </summary>
        [JsonProperty("sign_validity_period", NullValueHandling = NullValueHandling.Ignore)]
        public string SignValidityPeriod
        {
            get;
            set;
        }

        /// <summary>
        /// 签约营销参数,此值为json格式;具体的key需与营销约定
        /// </summary>
        [JsonProperty("promo_params", NullValueHandling = NullValueHandling.Ignore)]
        public string PromoParams
        {
            get;
            set;
        }

        /// <summary>
        /// 此参数用于传递子商户信息,无特殊需求时不用关注。
        /// 目前商户代扣、海外代扣、淘旅行信用住产品支持传入该参数(在销售方案中“是否允许自定义子商户信息”需要选是)。
        /// </summary>
        [JsonProperty("sub_merchant", NullValueHandling = NullValueHandling.Ignore)]
        public SubMerchantParams SubMerchantParams
        {
            get;
            set;
        }

        /// <summary>
        /// 协议生效类型, 用于指定协议是立即生效还是等待商户通知再生效. 可空, 不填默认为立即生效.
        /// </summary>
        [JsonProperty("agreement_effect_type", NullValueHandling = NullValueHandling.Ignore)]
        public string AgreementEffectType
        {
            get;
            set;
        }

        /// <summary>
        /// 用户实名信息参数,包含:姓名、身份证号、签约指定uid。商户传入用户实名信息参数,支付宝会对比用户在支付宝端的实名信息。
        /// </summary>
        [JsonProperty("identity_params", NullValueHandling = NullValueHandling.Ignore)]
        public IdentityParams IdentityParams
        {
            get;
            set;
        }

        /// <summary>
        /// 商户希望限制的签约用户的年龄范围,min表示可签该协议的用户年龄下限,max表示年龄上限。如{"min": "18","max": "30"}表示18=<年龄<=30的用户可以签约该协议。
        /// </summary>
        [JsonProperty("user_age_range", NullValueHandling = NullValueHandling.Ignore)]
        public string UserAgeRange
        {
            get;
            set;
        }

        /// <summary>
        /// 签约有效时间限制,单位是秒,有效范围是0-86400,商户传入此字段会用商户传入的值否则使用支付宝侧默认值,在有效时间外进行签约,会进行安全拦截;(备注:此字段适用于需要开通安全防控的商户,且依赖商户传入生成签约时的时间戳字段timestamp)
        /// </summary>
        [JsonProperty("effect_time", NullValueHandling = NullValueHandling.Ignore)]
        public string EffectTime
        {
            get;
            set;
        }
    }

    public class AccessParams
    {
        /// <summary>
        /// 目前支持以下值:
        /// 1. ALIPAYAPP (钱包h5页面签约)
        /// 2. QRCODE(扫码签约)
        /// 3. QRCODEORSMS(扫码签约或者短信签约)
        /// </summary>
        [JsonProperty("channel", NullValueHandling = NullValueHandling.Ignore)]
        [Required]
        public string Channel
        {
            get;
            set;
        }
    }

    public class PeriodRuleParams
    {
        /// <summary>
        /// 【描述】周期类型period_type是周期扣款产品必填,枚举值为DAY和MONTH。 DAY即扣款周期按天计,MONTH代表扣款周期按自然月。
        /// 与另一参数period组合使用确定扣款周期,例如period_type为DAY,period=30,则扣款周期为30天;period_type为MONTH,period=3,则扣款周期为3个自然月。 自然月是指,不论这个月有多少天,周期都计算到月份中的同一日期。
        /// 例如1月3日到2月3日为一个自然月,1月3日到4月3日为三个自然月。注意周期类型使用MONTH的时候,计划扣款时间execute_time不允许传28日之后的日期(可以传28日),以此避免有些月份可能不存在对应日期的情况。
        /// 【枚举值】
        /// 自然日: DAY
        /// 自然月: MONTH
        /// </summary>
        [JsonProperty("period_type", NullValueHandling = NullValueHandling.Ignore)]
        public string PeriodType
        {
            get;
            set;
        }

        /// <summary>
        /// 【描述】周期数period是周期扣款产品必填。与另一参数period_type组合使用确定扣款周期,例如period_type为DAY,period=90,则扣款周期为90天。
        /// </summary>
        [JsonProperty("period", NullValueHandling = NullValueHandling.Ignore)]
        public string Period
        {
            get;
            set;
        }

        /// <summary>
        /// 首次执行时间execute_time是周期扣款产品必填,即商户发起首次扣款的时间。精确到日,格式为yyyy-MM-dd 结合其他必填的扣款周期参数,会确定商户以后的扣款计划。发起扣款的时间需符合这里的扣款计划。
        /// </summary>
        [JsonProperty("execute_time", NullValueHandling = NullValueHandling.Ignore)]
        public string ExecuteTime
        {
            get;
            set;
        }

        /// <summary>
        /// 【描述】单次扣款最大金额single_amount是周期扣款产品必填,即每次发起扣款时限制的最大金额,单位为元。商户每次发起扣款都不允许大于此金额。
        /// </summary>
        [JsonProperty("single_amount", NullValueHandling = NullValueHandling.Ignore)]
        public decimal SingleAmount
        {
            get;
            set;
        }

        /// <summary>
        /// 【描述】总金额限制,单位为元。如果传入此参数,商户多次扣款的累计金额不允许超过此金额。
        /// </summary>
        [JsonProperty("total_amount", NullValueHandling = NullValueHandling.Ignore)]
        public decimal TotalAmount
        {
            get;
            set;
        }

        /// <summary>
        /// 【描述】总扣款次数。如果传入此参数,则商户成功扣款的次数不能超过此次数限制(扣款失败不计入)。
        /// </summary>
        [JsonProperty("total_payments", NullValueHandling = NullValueHandling.Ignore)]
        public int TotalPayments
        {
            get;
            set;
        }
    }

    public class SubMerchantParams
    {
        /// <summary>
        /// 子商户的商户id
        /// </summary>
        [JsonProperty("sub_merchant_id", NullValueHandling = NullValueHandling.Ignore)]
        public string SubMerchantId
        {
            get;
            set;
        }

        /// <summary>
        /// 子商户的商户名称
        /// </summary>
        [JsonProperty("sub_merchant_name", NullValueHandling = NullValueHandling.Ignore)]
        public string SubMerchantName
        {
            get;
            set;
        }

        /// <summary>
        /// 子商户的服务名称
        /// </summary>
        [JsonProperty("sub_merchant_service_name", NullValueHandling = NullValueHandling.Ignore)]
        public string SubMerchantServiceName
        {
            get;
            set;
        }

        /// <summary>
        /// 子商户的服务描述
        /// </summary>
        [JsonProperty("sub_merchant_service_description", NullValueHandling = NullValueHandling.Ignore)]
        public string SubMerchantServiceDescription
        {
            get;
            set;
        }
    }

    public class IdentityParams
    {
        [JsonProperty("cert_no", NullValueHandling = NullValueHandling.Ignore)]
        public string CertNo { get; set; }

        [JsonProperty("user_name", NullValueHandling = NullValueHandling.Ignore)]
        public string UserName { get; set; }
    }
}