package com.moka.gdtauto.client;

import java.time.LocalDateTime;

import org.springframework.stereotype.Component;

import com.moka.gdtauto.entity.SysUser;
import com.moka.gdtauto.entity.TencentAdsAuth;
import com.moka.gdtauto.service.SysUserService;
import com.moka.gdtauto.service.TencentAdsAuthService;
import com.tencent.ads.ApiContextConfig;
import com.tencent.ads.v3.TencentAds;

import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;

/**
 * 腾讯广告API客户端工厂
 * 按照官方SDK文档使用TencentAds单例
 * 
 * @author moka
 * @since 2026-02-03
 */
@Slf4j
@Component
@RequiredArgsConstructor
public class TencentAdsApiClientFactory {

    private final TencentAdsAuthService authService;
    private final SysUserService sysUserService;

    /**
     * 根据手工号和账户ID获取TencentAds实例
     * 自动处理token刷新逻辑，并传入user_token
     * 
     * @param orgAccountId 账户ID
     * @param jobNumber 工号
     * @return TencentAds实例
     * @throws Exception 当获取token失败时抛出
     */
    public TencentAds getTencentAds(String jobNumber, Long orgAccountId) throws Exception {
       
        // 获取账户的访问令牌
        TencentAdsAuth auth = authService.getByAccountId(orgAccountId);
        if (auth == null) {
            throw new Exception("未找到账户授权信息：" + orgAccountId);
        }

        // 检查access_token是否即将过期（5分钟内）
        LocalDateTime now = LocalDateTime.now();
        if (auth.getAccessTokenExpiresAt().isBefore(now.plusMinutes(5))) {
            log.info("账户 {} 的access_token即将过期，开始刷新", orgAccountId);
            auth = authService.refreshAccessToken(auth);
        }

        // 获取用户的实名认证令牌
        String userTokenStr = null;
        if (jobNumber != null) {
            SysUser user = sysUserService.getByJobNumber(jobNumber);
            if (user != null && sysUserService.isUserTokenValid(user)) {
                userTokenStr = user.getUserToken();
                log.debug("使用工号 {} 的实名认证令牌", jobNumber);
            } else {
                log.warn("工号 {} 未找到有效的实名认证令牌，部分受限接口将无法调用", jobNumber);
            }
        }
        // 创建并初始化TencentAds实例
        return createTencentAds(auth.getAccessToken(), userTokenStr);
    }

    /**
     * 根据账户ID获取TencentAds实例（不传入user_token）
     * 兼容旧方法，不支持受限接口调用
     * 
     * @param orgAccountId 账户ID
     * @return TencentAds实例
     * @throws Exception 当获取token失败时抛出
     */
    public TencentAds getTencentAdsWithoutUserToken(String jobNumber, Long orgAccountId) throws Exception {
        // 获取账户的访问令牌
        TencentAdsAuth auth = authService.getByAccountId(orgAccountId);
        if (auth == null) {
            throw new Exception("未找到账户授权信息：" + orgAccountId);
        }

        // 检查token是否即将过期（5分钟内）
        LocalDateTime now = LocalDateTime.now();
        if (auth.getAccessTokenExpiresAt().isBefore(now.plusMinutes(5))) {
            log.info("账户 {} 的token即将过期，开始刷新", orgAccountId);
            auth = authService.refreshAccessToken(auth);
        }

        // 创建并初始化TencentAds实例，不传入user_token
        log.warn("未传入手机号，无法获取user_token，部分受限接口将无法调用");
        return createTencentAds(auth.getAccessToken(), null);
    }

    /**
     * 使用指定的访问令牌创建TencentAds实例
     * 兼容旧方法，不传入user_token
     * 
     * @param accessToken 访问令牌
     * @return TencentAds实例
     */
    public TencentAds createTencentAds(String accessToken) {
        return createTencentAds(accessToken, null);
    }

    /**
     * 使用指定的访问令牌和实名认证令牌创建TencentAds实例
     * 
     * @param accessToken 访问令牌
     * @param userToken 实名认证令牌（可为null）
     * @return TencentAds实例
     */
    public TencentAds createTencentAds(String accessToken, String userToken) {
        // 按照官方文档初始化
        TencentAds tencentAds = TencentAds.getInstance();
        
        ApiContextConfig config = new ApiContextConfig()
            .accessToken(accessToken)
            .isDebug(false);  // 生产环境关闭调试
        
        // 如果有user_token，则传入
        if (userToken != null && !userToken.isEmpty()) {
            config.userToken(userToken);
            log.debug("初始化TencentAds，使用user_token");
        } else {
            log.debug("初始化TencentAds，未使用user_token");
        }
        
        tencentAds.init(config);
        
        log.debug("创建TencentAds实例成功");
        return tencentAds;
    }

    /**
     * 使用配置文件中的默认token创建TencentAds实例
     * 适用于测试或单账户场景
     * 
     * @return TencentAds实例
     */
    public TencentAds getDefaultTencentAds() {
        return createTencentAds("");
    }

    /**
     * 创建调试模式TencentAds实例
     * 
     * @param accessToken 访问令牌
     * @return TencentAds实例
     */
    public TencentAds createDebugTencentAds(String accessToken) {
        return createDebugTencentAds(accessToken, null);
    }

    /**
     * 创建调试模式TencentAds实例
     * 
     * @param accessToken 访问令牌
     * @param userToken 实名认证令牌（可为null）
     * @return TencentAds实例
     */
    public TencentAds createDebugTencentAds(String accessToken, String userToken) {
        TencentAds tencentAds = TencentAds.getInstance();
        
        ApiContextConfig config = new ApiContextConfig()
            .accessToken(accessToken)
            .isDebug(true);  // 开启调试模式
        
        // 如果有user_token，则传入
        if (userToken != null && !userToken.isEmpty()) {
            config.userToken(userToken);
            log.info("创建调试模式TencentAds实例，使用user_token");
        } else {
            log.info("创建调试模式TencentAds实例，未使用user_token");
        }
        
        tencentAds.init(config);
        return tencentAds;
    }
}
