package com.jsowell.api.thirdparty;

import com.alibaba.fastjson2.JSON;
import com.jsowell.common.annotation.Anonymous;
import com.jsowell.common.enums.thirdparty.ThirdPartyReturnCodeEnum;
import com.jsowell.common.exception.BusinessException;
import com.jsowell.pile.dto.QueryOperatorInfoDTO;
import com.jsowell.pile.dto.QueryStationInfoDTO;
import com.jsowell.pile.thirdparty.CommonParamsDTO;
import com.jsowell.thirdparty.lianlian.common.CommonResult;
import com.jsowell.thirdparty.platform.service.ThirdPartyPlatformService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.servlet.http.HttpServletRequest;
import java.util.Map;

/**
 * 内蒙古自治区充电设施监测服务平台
 */
@Anonymous
@RestController
@RequestMapping("/evcs")
public class NeiMengGuController extends ThirdPartyBaseController {
    private final String platformName = "内蒙古平台";

    @Autowired
    @Qualifier("neiMengGuPlatformServiceImpl")
    private ThirdPartyPlatformService platformLogic;

    /**
     * 获取token接口
     * http://localhost:8080/evcs/v1/query_token
     */
    @PostMapping("/v1/query_token")
    public CommonResult<?> queryToken(@RequestBody CommonParamsDTO dto) {
        logger.info("{}-请求令牌 params:{}", platformName, JSON.toJSONString(dto));
        try {
            Map<String, String> map = platformLogic.queryToken(dto);
            logger.info("{}-请求令牌 result:{}", platformName, JSON.toJSONString(map));
            return CommonResult.success(0, "请求令牌成功！", map.get("Data"), map.get("Sig"));
        } catch (Exception e) {
            logger.error("{}-请求令牌接口 异常", platformName, e);
            return CommonResult.failed("获取token发生异常");
        }
    }

    /**
     * 查询运营商信息
     * 接口名称：supervise_query_operator_info
     * 使用方法：由数据提供方实现此接口，数据需求方调用
     * 接口频率：每天一次或多次
     * 超时时间：120秒
     */
    @PostMapping("/v1/supervise_query_operator_info")
    public CommonResult<?> queryOperatorInfo(HttpServletRequest request, @RequestBody CommonParamsDTO dto) {
        logger.info("{}-查询运营商信息 params:{}", platformName, JSON.toJSONString(dto));
        try {
            // 校验令牌
            boolean verifyToken = verifyToken(request.getHeader("Authorization"));
            if (!verifyToken) {
                // 校验失败
                return CommonResult.failed(ThirdPartyReturnCodeEnum.TOKEN_ERROR);
            }

            // 校验签名
            if (!verifySignature(dto)) {
                // 签名错误
                return CommonResult.failed(ThirdPartyReturnCodeEnum.SIGN_ERROR);
            }

            // 解析入参
            QueryOperatorInfoDTO paramDTO = parseParamsDTO(dto, QueryOperatorInfoDTO.class);

            // 执行逻辑
            Map<String, String> map = platformLogic.queryOperatorInfo(paramDTO);
            logger.info("{}-查询运营商信息 result:{}", platformName, JSON.toJSONString(map));
            return CommonResult.success(0, "操作成功！", map.get("Data"), map.get("Sig"));
        } catch (BusinessException e) {
            return CommonResult.failed(Integer.parseInt(e.getCode()), e.getMessage());
        } catch (Exception e) {
            logger.error("{}-查询运营商信息 异常", platformName, e);
            return CommonResult.failed("查询运营商信息发生异常");
        }
    }

    /**
     * 查询充换电站信息
     * 接口名称: supervise_query_stations_info
     * 使用方法：由数据提供方实现此接口，数据需求方调用
     * 接口频率：每天一次或多次
     * 超时时间：120秒
     */
    @PostMapping("/v1/supervise_query_stations_info")
    public CommonResult<?> queryStationsInfo(HttpServletRequest request, @RequestBody CommonParamsDTO dto) {
        logger.info("{}-查询运营商信息 params:{}", platformName, JSON.toJSONString(dto));
        try {
            // 校验令牌
            boolean verifyToken = verifyToken(request.getHeader("Authorization"));
            if (!verifyToken) {
                // 校验失败
                return CommonResult.failed(ThirdPartyReturnCodeEnum.TOKEN_ERROR);
            }

            // 校验签名
            if (!verifySignature(dto)) {
                // 签名错误
                return CommonResult.failed(ThirdPartyReturnCodeEnum.SIGN_ERROR);
            }
            QueryStationInfoDTO paramDTO = parseParamsDTO(dto, QueryStationInfoDTO.class);
            Map<String, String> map = platformLogic.queryStationsInfo(paramDTO);
            logger.info("{}-查询运营商信息 result:{}", platformName, JSON.toJSONString(map));
            return CommonResult.success(0, "请求令牌成功！", map.get("Data"), map.get("Sig"));
        } catch (Exception e) {
            logger.error("{}-查询运营商信息 异常", platformName, e);
            return CommonResult.failed("查询运营商信息发生异常");
        }
    }

    /**
     * 查询充换电站状态信息
     * supervise_query_station_status
     */
    @PostMapping("/v1/supervise_query_station_status")
    public CommonResult<?> queryStationStatus(HttpServletRequest request, @RequestBody CommonParamsDTO dto) {
        logger.info("{}-查询充换电站状态信息 params:{}", platformName, JSON.toJSONString(dto));
        try {
            // 校验令牌
            if (!verifyToken(request.getHeader("Authorization"))) {
                // 校验失败
                return CommonResult.failed(ThirdPartyReturnCodeEnum.TOKEN_ERROR);
            }

            // 校验签名
            if (!verifySignature(dto)) {
                // 签名错误
                return CommonResult.failed(ThirdPartyReturnCodeEnum.SIGN_ERROR);
            }

            // 解析入参
            QueryStationInfoDTO paramDTO = parseParamsDTO(dto, QueryStationInfoDTO.class);

            // 执行逻辑
            Map<String, String> map = platformLogic.queryStationStatus(paramDTO);
            logger.info("{}-查询充换电站状态信息 result:{}", platformName, JSON.toJSONString(map));
            return CommonResult.success(0, "查询充换电站状态信息成功！", map.get("Data"), map.get("Sig"));
        } catch (Exception e) {
            logger.error("{}-查询充换电站状态信息异常", platformName, e);
            return CommonResult.failed("查询充换电站状态信息发生异常");
        }
    }

}
