package com.sonic.lion.service;

import com.sonic.lion.domain.entity.PayCharge;
import com.sonic.lion.domain.req.GoogleUploadReceiptReq;
import com.google.api.services.androidpublisher.model.ProductPurchase;
import com.google.api.services.androidpublisher.model.SubscriptionPurchase;
import com.google.api.services.androidpublisher.model.VoidedPurchase;
import lombok.Builder;
import lombok.Data;
import org.springframework.lang.NonNull;

import java.io.IOException;
import java.security.GeneralSecurityException;
import java.time.LocalDateTime;
import java.util.List;

/**
 * @author: code
 * @date: 2025/06/24
 * @Description:
 * @version: 1.0.0
 */
public interface GoogleService  {

    /**
     * 计算付款手续费
     * @param productAmount
     * @return
     */
    Long calculatePaymentFee(@NonNull Long productAmount);

    /**
     * 计算付款手续费
     * @param payCharge
     * @return
     */
    Long calculatePaymentFee(PayCharge payCharge);

    /**
     * 上传收据
     * @param req
     */
    void uploadReceipt(@NonNull GoogleUploadReceiptReq req) throws GeneralSecurityException, IOException;

    /**
     * 补偿处理客户端已上传还未处理的收据
     */
    void processReceipt();


    /**
     * google的token校验
     */
    ProductPurchase googleCheck(String productId, String token) throws Exception;

    SubscriptionPurchase getSubscriptionPurchase(String productId, String token) throws GeneralSecurityException, IOException;

    void handReceiptSubscribe(String productId, Long receiptId, Long userId);


    List<VoidedPurchase> voidedPurchases(LocalDateTime startTime) throws GeneralSecurityException, IOException;

    boolean handSubscribeWebhook(Long notifyId, String type, String playload) throws Exception;


    @Builder
    @Data
    class GoogleTokenResult {

        /**
         * 开发者指定的字符串，其中包含有关订单的补充信息。
         */
        private String developerPayload;

        /**
         * 订单的购买状态。可能的值为：0。已购买1.已取消2.待定
         */
        private int purchaseState;

        /**
         * 产品购买的时间，自该时期（1970年1月1日）以毫秒为单位
         */
        private Long purchaseTimeMillis;

        /**
         * 表示androidpublisher服务中的inappPurchase对象
         */
        private String kind;

        /**
         * 与inapp产品购买相关的订单ID。
         */
        private String orderId;

        /**
         * inapp产品的购买类型。仅当未使用标准应用内结算流程进行购买时，才设置此字段。
         * 可能的值为：0。测试（即从许可证测试帐户购买）1.促销（即使用促销代码购买）2.奖励（即观看视频广告而不是付费）
         */
        private String purchaseType;

        /**
         * Inapp产品的确认状态。可能的值为：0。尚未确认1.已确认
         */
        private String acknowledgementState;

    }
}
