package com.sf.payment.domain;

import lombok.Data;

/**
 * 功能描述:
 * 订单信息模型，支持消耗型商品、非消耗型商品和自动续期订阅商品。
 * @author a_kun
 * @date 2024/4/16 15:29
 */
@Data
public class PurchaseOrderPayload {

    /**
     * 具体一笔订单中对应的购买订单号ID。
     */
    private String purchaseOrderId;

    /**
     * 购买token，
     * 在购买消耗型/非消耗型商品场景中与具体购买订单一一对应，
     * 在自动续期订阅商品场景中与订阅ID一一对应。
     */
    private String purchaseToken;

    /**
     * 应用ID。
     */
    private String applicationId;

    /**
     * 商品ID。每种商品必须有唯一的ID，由应用在PMS中维护，或者应用发起购买时传入。
     * 说明
     * 为避免资金损失，您在对支付结果验签成功后，必须对其进行校验。
     */
    private String productId;

    /**
     * 商品类型。具体取值如下：
     * •	0：消耗型商品
     * •	1：非消耗型商品
     * •	2：自动续期订阅商品
     */
    private Integer productType;

    /**
     * 购买时间，UTC时间戳，以毫秒为单位。
     * 如果没有完成购买，则没有值。
     */
    private Long purchaseTime;

    /**
     * 发货状态。具体取值如下：
     * •	1：已发货
     * •	2：未发货
     */
    private Integer finishStatus;

    /**
     * 价格，单位：分。
     * 实际价格*100以后的值。商品实际价格精确到小数点后2位，例如此参数值为501，则表示商品实际价格为5.01。
     */
    private Long price;

    /**
     * 用定价货币的币种，请参见ISO 4217标准。
     * 说明
     * 为避免资金损失，您在对支付结果验签成功后，必须对其进行校验。
     */
    private String currency;

    /**
     * 商户侧保留信息，由您在调用支付接口时传入。
     */
    private String developerPayload;

    /**
     * 购买订单撤销原因。
     * •	0：其他
     * •	1：用户遇到问题退款
     */
    private Integer purchaseOrderRevocationReasonCode;

    /**
     * 购买订单撤销时间，
     * UTC时间戳，以毫秒为单位。
     */
    private Long revocationTime;

    /**
     * 优惠类型。
     * •	1：推介促销
     */
    private Integer offerTypeCode;

    /**
     * 优惠ID。
     */
    private String offerId;

    /**
     * 国家/地区码，用于区分国家/地区信息，请参见ISO 3166
     */
    private String countryCode;

    /**
     * 签名时间，UTC时间戳，以毫秒为单位。
     */
    private Long signedTime;

    // 以下参数只在自动续期订阅商品场景返回


    /**
     * 订阅连续购买段的唯一ID，
     * 当用户切换商品不会重置此ID。
     */
    private String subGroupGenerationId;

    /**
     * 订阅连续购买段的唯一ID，
     * 当用户切换订阅商品时
     * 此订阅ID会发生改变。
     */
    private String subscriptionId;

    /**
     * 订阅组ID。
     */
    private String subGroupId;

    /**
     * 此次购买的有效周期，
     * 采用ISO 8601格式。
     * 例如：P1W表示一周，
     * P1M表示一个月。
     */
    private String duration;

    /**
     * 订阅周期段类型。
     * •	0：正常周期段
     * •	1：延期周期段
     */
    private Integer durationTypeCode;

    /*
    ISO 8601的时间持续期限表示
        在ISO 8601中，时间持续期限的表示采用了一种简洁而明确的格式，例如 “P10D”，其中 “P” 表示周期（Period），后面的数字表示周期的长度，而末尾的字母表示周期的单位。这种表示法主要用于描述时间段的长度，而不关注具体的时刻。
        “P” 表示周期（Period）： 此字母指示接下来的时间表示将是一个时间段的描述，而非具体的日期或时刻。
        后面的数字： 这个数字表示时间段的长度，可以是整数或小数。它指示了在时间单位内的周期数量。
        末尾的字母表示周期的单位： 在 “P10D” 中，末尾的 “D” 表示周期的单位是天（Days）。ISO 8601定义了多种可能的时间单位，包括：
        Y（年）： 表示年份，例如 “P2Y” 表示2年的时间段。
        M（月）： 表示月份，例如 “P3M” 表示3个月的时间段。
        W（周）： 表示周数，例如 “P1W” 表示1周的时间段。
        D（日）： 表示天数，例如 “P10D” 表示10天的时间段。
        T（时间分隔符）： 如果时间段中包含了时间信息，日期和时间之间用 “T” 分隔，例如 “P1DT12H” 表示1天12小时的时间段。
        H（小时）、M（分钟）、S（秒）： 用于表示时、分、秒的时间段长度，例如 “PT2H30M” 表示2小时30分钟的时间段。
        示例：
        “P1Y”： 表示1年的时间段。
        “P3M”： 表示3个月的时间段。
        “P2W”： 表示2周的时间段。
        “P4DT6H30M”： 表示4天6小时30分钟的时间段。
     */
}
