package com.heyu.api.controller.vv;

import com.google.gson.Gson;
import com.heyu.api.common.annotation.AppRealyLogin;
import com.heyu.api.common.annotation.Describe;
import com.heyu.api.data.enums.RoleEnums;
import com.heyu.api.data.service.vv.VvPackageService;
import com.kuaidi100.sdk.response.SubscribePushParamResp;
import com.kuaidi100.sdk.response.SubscribePushResult;
import com.kuaidi100.sdk.response.SubscribeResp;
import com.kuaidi100.sdk.utils.SignUtils;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@Slf4j
@RestController
@RequestMapping("/app/kuaidi")
public class AppKuaiDiCallBackController {

    @Autowired
    private VvPackageService vvPackageService;

    /***
     * https://api.1024api.com/api-interface/app/kuaidi/callback
     *
     * 列表
     */
    /**
     * 订阅推送处理(参照) - 重构版本，不依赖servlet-api
     * 订阅成功后，如果该快递单号有轨迹（包括已经签收的单），快递100将会在15分钟-4个小时推送；后面将会4个小时跟踪一次，跟踪到有轨迹变化则推送；
     * 如果订阅成功后，3天查无结果（录错单/快递公司错了/揽收比较晚），快递100将会推送3天查无结果，可以继续重新订阅。
     * <p>
     * 返回值必须是下面这样的格式，否则快递100将认为该推送失败，快递100将会重试3次该推送，时间间隔35分钟；
     * 成功结果返回例子： {"result":true,"returnCode":"200","message":"提交成功"}
     *
     * @param param 快递100推送的参数内容
     * @param sign  快递100推送的签名
     * @return: com.kuaidi100.sdk.response.SubscribeResp
     * @author: api.kuaidi100.com
     * @time: 2020/7/16 19:48
     * <p>
     * <p>
     * <p>
     * csdn : https://blog.csdn.net/XuDream/article/details/130963971
     */
    @Describe("快递100回调接口")
    @RequestMapping("/callback")
    @AppRealyLogin
    public SubscribeResp callback(String param, String sign) {
        log.info("AppKuaiDiCallBackController callback param:{},sign", param, sign);
        //建议记录一下这个回调的内容，方便出问题后双方排查问题
        //log.debug("快递100订阅推送回调结果|{}|{}",param,sign);
        //订阅时传的salt,没有可以忽略
        String salt = "";
        String ourSign = SignUtils.sign(param + salt);
        SubscribeResp subscribeResp = new SubscribeResp();
        subscribeResp.setResult(Boolean.TRUE);
        subscribeResp.setReturnCode("200");
        subscribeResp.setMessage("成功");
        //加密如果相等，属于快递100推送；否则可以忽略掉当前请求
        if (ourSign.equals(sign)) {
            //TODO 业务处理
            SubscribePushParamResp subscribePushParamResp = new Gson().fromJson(param, SubscribePushParamResp.class);
            SubscribePushResult subscribePushResult = subscribePushParamResp.getLastResult();
            if (subscribePushResult != null) {
                vvPackageService.selectVvKuaidiAndUpdateData(subscribePushResult.getNu(), RoleEnums.kuaidi100_callback.getRole(), false);
            }
            return subscribeResp;
        }
        return null;

    }

}
