package com.xisc.pm.infra.feign.fallback;

import com.xisc.pm.domain.vo.EventFeignVO;
import com.xisc.pm.infra.feign.CtEventFeign;
import org.apache.commons.lang3.exception.ExceptionUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.cloud.openfeign.FallbackFactory;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Component;

import java.util.List;

/**
 * fileName: CtEventFeignFallbackFactory
 * description:
 * history:
 *
 * @author 张建元 jianyuan.zhang@hand-china.com
 * @version 1.0.0
 * @since 2024-07-26 08:42
 */
@Component
public class CtEventFeignFallbackFactory implements FallbackFactory<CtEventFeign> {
    private static final Logger LOGGER = LoggerFactory.getLogger(CtEventFeignFallbackFactory.class);

    /**
     * 当发生异常时，创建一个CtEventFeign实例的回退机制。
     *
     * @param cause 引发失败的Throwable，用于创建回退实例。
     * @return 返回实现了特定回退行为的CtEventFeign实例。
     */
    @Override
    public CtEventFeign create(Throwable cause) {
        // 定义自定义的回退行为
        return new CtEventFeign() {
            /**
             * 使用回退机制执行事件方法。
             * 当事件执行失败时，记录错误并返回HTTP 500状态码。
             *
             * @param tenantId 租户ID，用于事件执行过程。
             * @param eventRequest 事件请求数据，用于事件执行过程。
             * @return 返回ResponseEntity对象，用于封装响应状态和数据。
             */
            @Override
            public ResponseEntity<String> eventExecute(Long tenantId, EventFeignVO eventRequest) {
                return getStringResponseEntity(cause);
            }

            private ResponseEntity<String> getStringResponseEntity(Throwable cause) {
                // 记录异常堆栈跟踪信息以进行故障排除
                LOGGER.error("eventExecute-error: {}", ExceptionUtils.getStackTrace(cause));
                // 返回HTTP 500状态码表示服务器错误
                return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).build();
            }

            /**
             * 事件API接口
             *
             * @param tenantId     租户ID
             * @param eventRequest 事件请求内容
             * @return 处理结果，如果成功则不返回任何结果，如果失败返回对应的报错消息
             */
            @Override
            public ResponseEntity<String> eventExecute(Long tenantId, List<EventFeignVO> eventRequest) {
                return getStringResponseEntity(cause);
            }

            @Override
            public ResponseEntity<String> planDeliveryCompletedApi(Long organizationId, List<String> orderNoList) {
                return getStringResponseEntity(cause);
            }
        };
    }

}
