package com.xindazhou.business.config;

import com.xindazhou.business.service.logger.ApiAccessLogService;
import com.xindazhou.business.service.logger.ApiErrorLogService;
import com.xindazhou.business.service.logger.LoginLogService;
import com.xindazhou.framework.common.biz.infra.logger.ApiAccessLogCommonApi;
import com.xindazhou.framework.common.biz.infra.logger.ApiErrorLogCommonApi;
import com.xindazhou.framework.common.biz.infra.logger.LoginLogCommonApi;
import com.xindazhou.framework.common.biz.infra.logger.dto.ApiAccessLogCreateReqDTO;
import com.xindazhou.framework.common.biz.infra.logger.dto.ApiErrorLogCreateReqDTO;
import com.xindazhou.framework.common.biz.infra.logger.dto.LoginLogCreateReqDTO;
import com.xindazhou.framework.common.pojo.CommonResult;
import lombok.extern.slf4j.Slf4j;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
import org.springframework.scheduling.annotation.Async;

/**
 * API 日志本地配置
 * 
 * 提供本地的 ApiAccessLogCommonApi 和 ApiErrorLogCommonApi 实现
 * 直接调用本地的 ApiAccessLogService 和 ApiErrorLogService
 * 避免使用 Feign 调用远程服务（因为 infra 功能已经集成到 business-server 中）
 *
 * @author 新大洲
 */
@Configuration
@Slf4j
public class ApiLogLocalConfiguration {

    /**
     * 创建本地的 ApiAccessLogCommonApi 实现
     * 直接调用本地的 ApiAccessLogService，不使用 Feign
     */
    @Bean
    @Primary
    public ApiAccessLogCommonApi apiAccessLogCommonApi(ApiAccessLogService apiAccessLogService) {
        return new ApiAccessLogCommonApi() {
            @Override
            public CommonResult<Boolean> createApiAccessLog(ApiAccessLogCreateReqDTO createDTO) {
                apiAccessLogService.createApiAccessLog(createDTO);
                return CommonResult.success(true);
            }

            @Override
            @Async
            public void createApiAccessLogAsync(ApiAccessLogCreateReqDTO createDTO) {
                apiAccessLogService.createApiAccessLog(createDTO);
            }
        };
    }

    /**
     * 创建本地的 ApiErrorLogCommonApi 实现
     * 直接调用本地的 ApiErrorLogService，不使用 Feign
     */
    @Bean
    @Primary
    public ApiErrorLogCommonApi apiErrorLogCommonApi(ApiErrorLogService apiErrorLogService) {
        return new ApiErrorLogCommonApi() {
            @Override
            public CommonResult<Boolean> createApiErrorLog(ApiErrorLogCreateReqDTO createDTO) {
                apiErrorLogService.createApiErrorLog(createDTO);
                return CommonResult.success(true);
            }

            @Override
            @Async
            public void createApiErrorLogAsync(ApiErrorLogCreateReqDTO createDTO) {
                apiErrorLogService.createApiErrorLog(createDTO);
            }
        };
    }

    /**
     * 创建本地的 LoginLogCommonApi 实现
     * 直接调用本地的 LoginLogService，不使用 Feign
     * 注意：登录日志已迁移到用户服务，此实现保留用于兼容
     * 建议：业务服务应该通过 Feign 调用用户服务的 LoginLogCommonApi
     */
    @Bean
    @Primary
    public LoginLogCommonApi loginLogCommonApi(LoginLogService loginLogService) {
        return new LoginLogCommonApi() {
            @Override
            public CommonResult<Boolean> createLoginLog(LoginLogCreateReqDTO reqDTO) {
                try {
                    loginLogService.createLoginLog(reqDTO);
                    return CommonResult.success(true);
                } catch (Exception e) {
                    log.error("[createLoginLog][同步记录登录日志失败] reqDTO={}", reqDTO, e);
                    return CommonResult.error(500, "记录登录日志失败");
                }
            }

            @Override
            @Async
            public void createLoginLogAsync(LoginLogCreateReqDTO reqDTO) {
                try {
                    loginLogService.createLoginLog(reqDTO);
                } catch (Exception e) {
                    // 异步方法中的异常不应该影响调用方，只记录错误日志
                    log.error("[createLoginLogAsync][异步记录登录日志失败] reqDTO={}", reqDTO, e);
                }
            }
        };
    }

}

