package com.sonic.lion.utils;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;

@Slf4j
@Component
public class IOSConsumptionUtil {

    @Value("${apple.boundId}")
    private String BUNDLE_ID;

    @Autowired
    private NetRetryUtils netRetryUtils;


     /**
      *
     *     "userStatus": 1,
     *     "consumptionStatus": 3,
     *     "lifetimeDollarsPurchased": 6,
     *     "appAccountToken": "",
     *     "sampleContentProvided": false,
     *     "playTime": 7,
     *     "lifetimeDollarsRefunded": 2,
     *     "customerConsented": true,
     *     "accountTenure": 3,
     *     "deliveryStatus": 0,
     *     "platform": 1
     * @param originalTransactionId
     * @param age
     * @param consumptionStatus
     * @param totalBuy
     * @param totalRefund
     * @param playTimeDays
     */
    public String sendConsumption(String originalTransactionId , Integer age, int consumptionStatus, int totalBuy,int totalRefund ,int playTimeDays) {
        JSONObject request = new JSONObject();
        int ageStatus = 0;
        if (age > 0 && age < 3) {
            ageStatus = 1;
        } else if (age >= 3 && age < 10) {
            ageStatus = 2;
        } else if (age >= 10 && age < 30) {
            ageStatus = 3;
        } else if (age >= 30 && age < 90) {
            ageStatus = 4;
        } else if (age >= 90 && age < 180) {
            ageStatus = 5;
        } else if (age >= 180 && age < 365) {
            ageStatus = 6;
        } else if (age >= 365) {
            ageStatus = 7;
        }
        /**
         * 0
         * Account age is undeclared.
         *
         * 1
         * Account age is between 0–3 days.
         *
         * 2
         * Account age is between 3–10 days.
         *
         * 3
         * Account age is between 10–30 days.
         *
         * 4
         * Account age is between 30–90 days.
         *
         * 5
         * Account age is between 90–180 days.
         *
         * 6
         * Account age is between 180–365 days.
         *
         * 7
         * Account age is over 365 days.
         */
        request.put("accountTenure", ageStatus);
        request.put("appAccountToken", "");

        /**
         * 0
         * 消费状态未申报。
         *
         * 1
         * 不消耗应用内购买。
         *
         * 2
         * 应用内购买被部分消费。
         *
         * 3
         * 应用内购买已完全消耗。
         */
        request.put("consumptionStatus", consumptionStatus);
        /**
         * 将此字段设置为true如果用户同意向 App Store 发送与其退款请求相关的消费数据，包括. 如果没有，请不要回复通知。ConsumptionRequestCONSUMPTION_REQUEST
         */
        request.put("customerConsented", true);
        /**
         * 0
         * 该应用程序交付了消耗品的应用程序内购买，并且运行正常。
         *
         * 1
         * 由于质量问题，该应用程序未提供应用程序内购买的消耗品。
         *
         * 2
         * 该应用程序交付了错误的项目。
         *
         * 3
         * 由于服务器中断，该应用程序没有提供应用程序内购买的消耗品。
         *
         * 4
         * 由于游戏内货币的变化，该应用程序没有提供消耗品的应用程序内购买。
         *
         * 5
         * 由于其他原因，该应用程序没有提供应用程序内购买的消耗品。
         */
        request.put("deliveryStatus", 0);

        /**
         * 一个值，表示自购买该应用以来，客户在您的应用中在所有平台上进行的应用内购买金额。
         * 可用性
         *
         * 应用商店服务器 API 1.0+
         * 框架
         *
         * 应用商店服务器 API
         * 在此页
         *
         * 宣言
         * 可能值
         * 也可以看看
         * 宣言
         * number lifetimeDollarsPurchased
         * 可能的值
         * 0
         * 终身购买金额未申报。
         *
         * 1
         * 终身购买金额为 0 美元。
         *
         * 2
         * 终身购买金额在 0.01-49.99 美元之间。
         *
         * 3
         * 终身购买金额在 50-99.99 美元之间。
         *
         * 4
         * 终身购买金额在 100-499.99 美元之间。
         *
         * 5
         * 终身购买金额在 500-999.99 美元之间。
         *
         * 6
         * 终身购买金额在 1000-1999.99 美元之间。
         *
         * 7
         * 终身购买金额超过 2000 美元。
         */
        int lifetimeDollarsPurchased = 0;
        if(totalBuy==0){
            lifetimeDollarsPurchased = 1;
        }else if(totalBuy>0  && totalBuy< 5000 ){
            lifetimeDollarsPurchased = 2;
        }else if(totalBuy>=5000  && totalBuy< 10000 ){
            lifetimeDollarsPurchased = 3;
        }else if(totalBuy>=10000  && totalBuy< 50000 ){
            lifetimeDollarsPurchased = 4;
        }else if(totalBuy>=50000  && totalBuy< 100000 ){
            lifetimeDollarsPurchased =  5;
        }else if(totalBuy>=100000  && totalBuy< 200000 ){
            lifetimeDollarsPurchased = 6;
        }else if(totalBuy>=200000){
            lifetimeDollarsPurchased = 7;
        }
        request.put("lifetimeDollarsPurchased", lifetimeDollarsPurchased);


        int lifetimeDollarsRefunded = 0 ;
        if(totalRefund==0){
            lifetimeDollarsPurchased = 1;
        }else if(totalBuy>0  && totalBuy< 5000 ){
            lifetimeDollarsRefunded = 2;
        }else if(totalBuy>=5000  && totalBuy< 10000 ){
            lifetimeDollarsRefunded = 3;
        }else if(totalBuy>=10000  && totalBuy< 50000 ){
            lifetimeDollarsRefunded = 4;
        }else if(totalBuy>=50000  && totalBuy< 100000 ){
            lifetimeDollarsRefunded =  5;
        }else if(totalBuy>=100000  && totalBuy< 200000 ){
            lifetimeDollarsRefunded = 6;
        }else if(totalBuy>=200000){
            lifetimeDollarsRefunded = 7;
        }
        /**
         *0
         * 终身退款金额未申报。
         *
         * 1
         * 终身退款金额为 0 美元。
         *
         * 2
         * 终身退款金额在 0.01-49.99 美元之间。
         *
         * 3
         * 终身退款金额在 50-99.99 美元之间。
         *
         * 4
         * 终身退款金额在 100-499.99 美元之间。
         *
         * 5
         * 终身退款金额在 500-999.99 美元之间。
         *
         * 6
         * 终身退款金额在 1000-1999.99 美元之间。
         *
         * 7
         * 终身退款金额超过 2000 美元。
         */
        request.put("lifetimeDollarsRefunded", lifetimeDollarsRefunded);

        /**
         * 可能的值
         * 0
         * 未申报。
         *
         * 1
         * 一个苹果平台。
         *
         * 2
         * 非苹果平台。
         */
        request.put("platform", 1);
        /**
         * 指示客户使用应用程序的时间量的值。
         * 可用性
         *
         * 应用商店服务器 API 1.0+
         * 框架
         *
         * 应用商店服务器 API
         * 在此页
         *
         * 宣言
         * 可能值
         * 也可以看看
         * 宣言
         * number playTime
         * 可能的值
         * 0
         * 订婚时间不详。
         *
         * 1
         * 参与时间在 0-5 分钟之间。
         *
         * 2
         * 参与时间在 5-60 分钟之间。
         *
         * 3
         * 参与时间在1-6小时之间。
         *
         * 4
         * 参与时间在 6-24 小时之间。
         *
         * 5
         * 订婚时间在1-4天之间。
         *
         * 6
         * 订婚时间在 4-16 天之间。
         *
         * 7
         * 订婚时间超过16天。
         */
        request.put("playTime", 3);
        if (playTimeDays > 1 && playTimeDays<= 4) {
            request.put("playTime", 5);
        } else if (playTimeDays> 4 && playTimeDays <= 16) {
            request.put("playTime", 6);
        } else if (playTimeDays> 16) {
            request.put("playTime", 7);
        }
        /**
         * 提供的示例内容
         * 一个布尔值，指示您在购买之前是否提供了内容的免费样本或试用版，或有关其功能的信息。
         */
        request.put("sampleContentProvided", false);
        /**
         * 0
         * 帐户状态未声明。
         *
         * 1
         * 客户的帐户处于活动状态。
         *
         * 2
         * 客户的账户被暂停。
         *
         * 3
         * 客户的帐户被终止。
         *
         * 4
         * 客户帐户的访问权限有限。
         */
        request.put("userStatus", 1);
        log.info("request body:{}" ,request);
        try{
            String token = JwtUtils.getAppleJwt(BUNDLE_ID);
            String response = netRetryUtils.putForObject("https://api.storekit.itunes.apple.com/inApps/v1/transactions/consumption/" + originalTransactionId, request,token);
            log.info("成功提交IOS 消费信息 response:{}" ,response);
        }catch (Exception e){
            log.info("成功提交IOS 消费信息 失败");
            e.printStackTrace();
        }
        return JSON.toJSONString(request);
    }

}
