package com.sf.payment.domain;

import lombok.Data;

/**
 * 功能描述:
 *
 * @author a_kun
 * @date 2024/4/16 15:29
 */
@Data
public class InAppPurchaseData {

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

    /**
     * 消耗型商品或者非消耗型商品：固定为false。
     *
     * 订阅型商品：
     *
     * true：订阅处于活动状态并且将在下一个结算日期自动续订。
     * false：用户已经取消订阅。 用户可以在下一个结算日期之前访问订阅内容，并且在该日期后将无法访问，除非重新启用自动续订。 如果提供了宽限期，只要宽限期未过，此值就会对所有订阅保持设置为true。 下一次结算日期每天都会自动延长，直至宽限期结束，或者用户更改付款方式。
     */
    private Boolean autoRenewing;

    /**
     * 订单ID，唯一标识一笔需要收费的收据，由华为应用内支付服务器在创建订单以及订阅型商品续费时生成。
     *
     * 每一笔新的收据都会使用不同的orderId。
     */
    private String orderId;

    /**
     * 商品类别，取值包括：
     *
     * 0：消耗型商品
     * 1：非消耗型商品
     * 2：订阅型商品
     */
    private Integer kind;

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

    /**
     * 商品名称。
     */
    private String productName;

    /**
     * 商品购买时间，UTC时间戳，以毫秒为单位。
     */
    private Long purchaseTime;

    /**
     * 订单交易状态。
     *
     * -1：初始化
     * 0：已购买
     * 1：已取消
     * 2：已撤销或已退款
     * 3：待处理
     */
    private Integer purchaseState;

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

    /**
     *消耗状态，仅一次性商品存在，取值包括：
     *
     * 0：未消耗
     * 1：已消耗
     */
    private Integer consumptionState;

    /**
     *确认状态，取值包括：
     *
     * 0 ：未确认
     * 1：已确认
     * 没有值表示不需要确认
     */
    private Integer confirmed;

    /**
     * 用于唯一标识商品和用户对应关系的购买令牌，在支付完成时由华为应用内支付服务器生成。
     * 说明
     * 该字段是唯一标识商品和用户对应关系的，在订阅型商品正常续订时不会改变。
     * 当前92位，后续存在扩展可能，如要进行存储，建议您预留128位的长度。
     * 如要进行存储，为保证安全，建议加密存储。
     */
    private String purchaseToken;

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

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

    /**
     * 支付方式，取值请参见payType说明。
     */
    private String payType;

    /**
     * 交易单号，用户支付成功后生成。
     */
    private String payOrderId;

    // 以下参数只在订阅场景返回


    /**
     * 上次续期收款的订单ID，由支付服务器在续期扣费时生成。首次购买订阅型商品时的lastOrderId与orderId数值相同。
     */
    private String lastOrderId;

    /**
     * 订阅型商品所属的订阅组ID。
     */
    private String productGroup;

    /**
     * 原购买的时间，即本订阅型商品首次成功收费的时间，UTC时间戳，以毫秒为单位。。
     */
    private Long oriPurchaseTime;

    /**
     * 订阅ID。
     * 说明
     * subscriptionId是用户与商品之间的一一对应关系，在订阅型商品正常续订时不会改变。
     */
    private String subscriptionId;

    /**
     * 原订阅ID。有值表示当前订阅是从其他商品切换来的，该值可以关联切换前的商品订阅信息
     */
    private String oriSubscriptionId;

    /**
     * 购买数量。
     */
    private Integer quantity;

    /**
     * 已经付费订阅的天数，免费试用和促销期周期除外。。
     */
    private Long daysLasted;

    /**
     * 成功标准续期（没有设置促销的续期）的期数，为0或者不存在表示还没有成功续期。
     */
    private Long numOfPeriods;

    /**
     * 成功促销续期期数。
     */
    private Long numOfDiscount;

    /**
     * 订阅型商品过期时间，UTC时间戳，以毫秒为单位。
     *
     * 对于一个成功收费的自动续订收据，该时间表示续期日期或者超期日期。如果商品最近的收据的该时间是一个过去的时间，则订阅已经过期。
     */
    private Long expirationDate;

    /**
     * 对于已经过期的订阅，表示过期原因，取值包括：
     *
     * 1：用户取消
     * 2：商品不可用
     * 3：用户签约信息异常
     * 4：Billing错误
     * 5：用户未同意涨价
     * 6：未知错误
     * 同时有多个异常时，优先级为：1 > 2 > 3…
     */
    private Integer expirationIntent;

    /**
     * 订阅撤销时间，UTC时间戳，以毫秒为单位，发生退款且服务立即不可用。在顾客投诉，通过客服撤销订阅，或者顾客升级、跨级到同组其他商品并且立即生效场景下，需要撤销原有订阅的上次收据时有值。
     * 说明
     * 已经撤销的收据等同于没有完成购买。
     */
    private Long cancelTime;

    /**
     * 取消原因。
     *
     * 3: 应用调用IAP接口取消
     * 2：顾客升级、跨级等。
     * 1：顾客因为在App内遇到了问题而取消了订阅。
     * 0：其他原因取消，比如顾客错误地订阅了商品。
     * 说明
     * 如果为空且cancelTime有值，表示是升级等操作导致的取消。
     */
    private Integer cancelReason;

    /**
     * 续期状态。
     *
     * 1：当前周期到期时自动续期
     * 0：用户停止了续期
     * 仅针对自动续期订阅，对有效和过期的订阅均有效，并不代表顾客的订阅状态。通常，取值为0时，应用可以给顾客提供其他的订阅选项，
     * 例如推荐一个同组更低级别的商品。该值为0通常代表着顾客主动取消了该订阅。
     */
    private Integer renewStatus;

    /**
     * 用户取消订阅的时间，UTC时间戳，以毫秒为单位。在该时间进行了订阅续期停止的设定，商品在有效期内仍然有效，但后续的续期会终止，无退款。
     */
    private Integer cancellationTime;



}
