package com.xy.xyaicpzs.controller;

import com.xy.xyaicpzs.common.response.ApiResponse;
import com.xy.xyaicpzs.common.ResultUtils;
import com.xy.xyaicpzs.service.CozeAuthService;
import com.xy.xyaicpzs.util.JwtUtil;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.tags.Tag;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.util.HashMap;
import java.util.Map;

/**
 * JWT令牌控制器
 */
@RestController
@RequestMapping("/jwt")
@Tag(name = "JWT接口", description = "提供JWT令牌生成功能")
public class JwtController {

    @Autowired
    private JwtUtil jwtUtil;
    
    @Autowired
    private CozeAuthService cozeAuthService;

    /**
     * 生成JWT令牌
     *
     * @param expireSeconds 过期时间（秒）
     * @param sessionName   会话名称（可选）
     * @param deviceId      设备ID（可选）
     * @return JWT令牌
     */
    @GetMapping("/token")
    @Operation(summary = "生成JWT令牌", description = "生成Coze API访问所需的JWT令牌")
    public ApiResponse<Map<String, String>> generateToken(
            @Parameter(description = "过期时间（秒）") @RequestParam(defaultValue = "600") int expireSeconds,
            @Parameter(description = "会话名称（可选）") @RequestParam(required = false) String sessionName,
            @Parameter(description = "设备ID（可选）") @RequestParam(required = false) String deviceId) {
        
        try {
            String token = jwtUtil.generateToken(expireSeconds, sessionName, deviceId);
            Map<String, String> result = new HashMap<>();
            result.put("token", token);
            return ResultUtils.success(result);
        } catch (Exception e) {
            return ResultUtils.error(50000, "JWT生成失败: " + e.getMessage());
        }
    }
    
    /**
     * 通过JWT获取访问令牌
     * 
     * @param jwt JWT令牌
     * @param durationSeconds 访问令牌有效期（秒），默认为86400秒（1天）
     * @return 包含访问令牌和过期时间的信息
     */
    @PostMapping("/access-token")
    @Operation(summary = "获取访问令牌", description = "通过JWT获取Coze API的OAuth访问令牌")
    public ApiResponse<Map<String, Object>> getAccessToken(
            @Parameter(description = "JWT令牌") @RequestParam String jwt,
            @Parameter(description = "令牌有效期（秒）") @RequestParam(defaultValue = "86400") Integer durationSeconds) {
        
        try {
            Map<String, Object> tokenInfo = cozeAuthService.getAccessToken(jwt, durationSeconds);
            return ResultUtils.success(tokenInfo);
        } catch (Exception e) {
            return ResultUtils.error(50000, "获取访问令牌失败: " + e.getMessage());
        }
    }
    
    /**
     * 一站式获取访问令牌（生成JWT并立即获取访问令牌）
     * 
     * @param jwtExpireSeconds JWT过期时间（秒）
     * @param sessionName 会话名称（可选）
     * @param deviceId 设备ID（可选）
     * @param tokenDurationSeconds 访问令牌有效期（秒）
     * @return 包含JWT、访问令牌和过期时间的信息
     */
    @PostMapping("/one-step-token")
    @Operation(summary = "一站式获取访问令牌", description = "生成JWT并立即获取Coze API的OAuth访问令牌")
    public ApiResponse<Map<String, Object>> getOneStepToken(
            @Parameter(description = "JWT过期时间（秒）") @RequestParam(defaultValue = "600") int jwtExpireSeconds,
            @Parameter(description = "会话名称（可选）") @RequestParam(required = false) String sessionName,
            @Parameter(description = "设备ID（可选）") @RequestParam(required = false) String deviceId,
            @Parameter(description = "访问令牌有效期（秒）") @RequestParam(defaultValue = "86400") Integer tokenDurationSeconds) {
        
        try {
            // 生成JWT令牌
            String jwt = jwtUtil.generateToken(jwtExpireSeconds, sessionName, deviceId);
            
            // 获取访问令牌
            Map<String, Object> tokenInfo = cozeAuthService.getAccessToken(jwt, tokenDurationSeconds);
            
            // 合并结果
            tokenInfo.put("jwt", jwt);
            
            return ResultUtils.success(tokenInfo);
        } catch (Exception e) {
            return ResultUtils.error(50000, "获取访问令牌失败: " + e.getMessage());
        }
    }
} 