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.common.response.RestApiResponse;
import com.jsowell.pile.dto.PushRealTimeInfoDTO;
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.*;

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

/**
 * 宁夏平台Controller
 */
@Anonymous
@RestController
@RequestMapping("/ningxia")
public class NingXiaController extends ThirdPartyBaseController {

    private final String platformName = "宁夏平台";

    @Autowired
    @Qualifier("ninaXiaPlatformServiceImpl")
    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("查询充换电站状态信息发生异常");
        }
    }


    /**
     * 推送充电设备接口状态信息
     * @param dto
     * @return
     */
    @PostMapping("/v1/supervise_notification_station_status")
    public RestApiResponse<?> superviseNotificationStationStatus(@RequestBody PushRealTimeInfoDTO dto) {
        RestApiResponse<?> response = null;
        String result = null;
        try {
            result = platformLogic.notificationStationStatus(dto);
            response = new RestApiResponse<>(result);
        } catch (Exception e) {
            logger.error("宁夏平台推送充电设备接口状态信息 error", e);
            return new RestApiResponse<>(e);
        }
        logger.info("宁夏平台推送充电设备接口状态信息 result:{}", result);
        return response;
    }

    /**
     * 推送充电状态信息
     * @param dto
     * @return
     */
    @GetMapping("/v1/supervise_notification_equip_charge_status/{orderCode}")
    public RestApiResponse<?> superviseNotificationEquipChargeStatus(@PathVariable("orderCode") String orderCode) {
        RestApiResponse<?> response = null;
        String result = null;
        try {
            result = platformLogic.notificationEquipChargeStatus(orderCode);
            response = new RestApiResponse<>(result);
        } catch (Exception e) {
            logger.error("宁夏平台推送充电状态信息 error", e);
            return new RestApiResponse<>(e);
        }
        logger.info("宁夏平台推送充电状态信息 result:{}", result);
        return response;
    }

    /**
     * 推送充电站历史充电订单信息
     * @param orderCode
     * @return
     */
    @GetMapping("/v1/supervise_notification_charge_order_info_history/{orderCode}")
    public RestApiResponse<?> notificationChargeOrderInfoHistory(@PathVariable("orderCode") String orderCode) {
        RestApiResponse<?> response = null;
        String result = null;
        try {
            result = platformLogic.notificationChargeOrderInfoHistory(orderCode);
            response = new RestApiResponse<>(result);
        } catch (Exception e) {
            logger.error("宁夏平台推送充电站历史充电订单信息 error", e);
            return new RestApiResponse<>(e);
        }
        logger.info("宁夏平台推送充电站历史充电订单信息 result:{}", result);
        return response;
    }

    /**
     * 推送充换电站用能统计信息
     * @param stationId
     * @return
     */
    @GetMapping("/v1/notificationOperationStatsInfo/{stationId}")
    public RestApiResponse<?> notificationOperationStatsInfo(@PathVariable("stationId") String stationId) {
        RestApiResponse<?> response = null;
        String result = null;
        try {
            result = platformLogic.notificationOperationStatsInfo(stationId);
            response = new RestApiResponse<>(result);
        } catch (Exception e) {
            logger.error("宁夏平台推送充换电站用能统计信息 error", e);
            return new RestApiResponse<>(e);
        }
        logger.info("宁夏平台推送充换电站用能统计信息 result:{}", result);
        return response;
    }
}
