package com.njcn.device.pms.api.fallback;

import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.njcn.common.pojo.enums.response.CommonResponseEnum;
import com.njcn.common.pojo.exception.BusinessException;
import com.njcn.common.pojo.response.HttpResult;
import com.njcn.device.pms.api.MonitorClient;
import com.njcn.device.pms.pojo.dto.PmsMonitorDTO;
import com.njcn.device.pms.pojo.dto.PmsMonitorInfoDTO;
import com.njcn.device.pms.pojo.param.*;
import com.njcn.device.pms.pojo.param.gw.TypicalSourceParam;
import com.njcn.device.pms.pojo.po.Monitor;
import com.njcn.device.pms.pojo.vo.MonitorVO;
import com.njcn.device.pms.pojo.vo.gw.TypicalSourceOnLine;
import com.njcn.device.pms.utils.PmsDeviceEnumUtil;
import com.njcn.device.biz.pojo.po.Overlimit;
import feign.hystrix.FallbackFactory;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;

import java.util.List;

/**
 * @author yzh
 * @date 2022/10/18
 */
@Slf4j
@Component
public class MonitorClientFallbackFactory implements FallbackFactory<MonitorClient> {

    @Override
    public MonitorClient create(Throwable throwable) {
        //判断抛出异常是否为解码器抛出的业务异常
        Enum<?> exceptionEnum = CommonResponseEnum.SERVICE_FALLBACK;
        if (throwable.getCause() instanceof BusinessException) {
            BusinessException businessException = (BusinessException) throwable.getCause();
            exceptionEnum = PmsDeviceEnumUtil.getExceptionEnum(businessException.getResult());
        }
        Enum<?> finalExceptionEnum = exceptionEnum;
        return new MonitorClient()
        {
            @Override
            public HttpResult<List<PmsMonitorInfoDTO>> getMonitorInfo(PmsMonitorInfoParam pmsMonitorInfoParam) {
                log.error("{}异常，降级处理，异常为：{}", "获取指定的监测点信息", throwable.toString());
                throw new BusinessException(finalExceptionEnum);
            }

            @Override
            public HttpResult<List<PmsMonitorDTO>> getMonitorInfoListByCond(PmsMonitorParam pmsMonitorParam) {
                log.error("{}异常，降级处理，异常为：{}", "根据条件获取监测点信息列表", throwable.toString());
                throw new BusinessException(finalExceptionEnum);
            }

            @Override
            public HttpResult<Overlimit> getOverLimitData(String id) {
                log.error("{}异常，降级处理，异常为：{}", "根据监测点Id获取限值  ", throwable.toString());
                throw new BusinessException(finalExceptionEnum);
            }

            @Override
            public HttpResult<List<Monitor>> getMonitorList(List<String> monitorIds) {
                log.error("{}异常，降级处理，异常为：{}", "获取主网监测点数据  ", throwable.toString());
                throw new BusinessException(finalExceptionEnum);
            }

            @Override
            public HttpResult<List<Monitor>> getMonitorListByMid(List<String> midIds) {
                log.error("{}异常，降级处理，异常为：{}", "使用同源监测点编码获取监测点信息  ", throwable.toString());
                throw new BusinessException(finalExceptionEnum);
            }

            @Override
            public HttpResult<Page<Monitor>> getMonitorPage(TerminalQueryParam baseParam) {
                log.error("{}异常，降级处理，异常为：{}", "分页获取主网监测点数据  ", throwable.toString());
                throw new BusinessException(finalExceptionEnum);
            }

            @Override
            public HttpResult<MonitorVO> getMonitorTerminal(MonitorTerminalParam param) {
                log.error("{}异常，降级处理，异常为：{}", "获取台账和终端信息(波形专用)  ", throwable.toString());
                throw new BusinessException(finalExceptionEnum);
            }

            @Override
            public HttpResult<Page<TypicalSourceOnLine>> monitorTypicalList(TypicalSourceParam param) {
                log.error("{}异常，降级处理，异常为：{}", "典型源荷下穿监测点信息接口  ", throwable.toString());
                throw new BusinessException(finalExceptionEnum);
            }

            @Override
            public HttpResult<List<Monitor>> getMonitorListByParam(MonitorParam monitorParam) {
                log.error("{}异常，降级处理，异常为：{}", "根据条件查询监测点  ", throwable.toString());
                throw new BusinessException(finalExceptionEnum);
            }
        };
    }
}
