package com.lesingle.edu.controller;

import com.lesingle.edu.common.annotation.Log;
import com.lesingle.edu.common.enums.LogOperationType;
import com.lesingle.edu.common.response.Result;
import com.lesingle.edu.common.util.ImmUtil;
import com.lesingle.edu.dto.response.ImmTokenVo;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import lombok.RequiredArgsConstructor;
import org.springframework.web.bind.annotation.*;

/**
 * 阿里云 IMM（智能媒体服务）控制器
 * <p>
 * 提供 WebOffice Token 生成、刷新等接口
 * </p>
 *
 * @author reading-platform
 * @since 2026-03-16
 */
@RestController
@RequestMapping("/api/v1/imm")
@RequiredArgsConstructor
@Tag(name = "阿里云 IMM 服务", description = "WebOffice 文档预览和编辑相关接口")
public class ImmController {

    private final ImmUtil immUtil;

    /**
     * 生成只读 WebOffice Token
     * <p>
     * 用于前端预览文档（PPT、Word、Excel 等），仅支持查看，不支持编辑
     * </p>
     *
     * @param url  OSS 文件路径（如：oss://bucket-name/path/to/file.pptx 或完整 HTTPS URL）
     * @param name 文件名
     * @return WebOffice Token 信息
     */
    @GetMapping("/token/readonly")
    @Operation(summary = "生成只读 WebOffice Token", description = "用于文档预览，仅支持查看")
    public Result<ImmTokenVo> generateReadOnlyToken(
            @RequestParam("url") String url,
            @RequestParam("name") String name) {

        // 将 OSS URL 转换为 IMM 所需的 SourceURI 格式
        String sourceURI = immUtil.convertOssUrlToSourceURI(url);

        ImmTokenVo tokenVo = immUtil.generateWebofficeTokenReadOnly(sourceURI, name);
        return Result.success(tokenVo);
    }

    /**
     * 生成编辑 WebOffice Token
     * <p>
     * 用于前端编辑文档（PPT、Word、Excel 等），支持查看和编辑
     * </p>
     *
     * @param url  OSS 文件路径（如：oss://bucket-name/path/to/file.pptx 或完整 HTTPS URL）
     * @param name 文件名
     * @return WebOffice Token 信息
     */
    @GetMapping("/token")
    @Operation(summary = "生成编辑 WebOffice Token", description = "用于文档编辑，支持查看和修改")
    public Result<ImmTokenVo> generateEditToken(
            @RequestParam("url") String url,
            @RequestParam("name") String name) {

        // 将 OSS URL 转换为 IMM 所需的 SourceURI 格式
        String sourceURI = immUtil.convertOssUrlToSourceURI(url);

        ImmTokenVo tokenVo = immUtil.generateWebofficeToken(sourceURI, name);
        return Result.success(tokenVo);
    }

    /**
     * 刷新 WebOffice Token
     * <p>
     * 当 Token 即将过期时，使用 refreshToken 刷新获取新的 Token
     * </p>
     *
     * @param request 刷新请求，包含 accessToken 和 refreshToken
     * @return 刷新后的 WebOffice Token 信息
     */
    @PostMapping("/token/refresh")
    @Operation(summary = "刷新 WebOffice Token", description = "当 Token 即将过期时刷新")
    public Result<ImmTokenVo> refreshToken(
            @RequestBody RefreshTokenRequest request) {

        ImmTokenVo tokenVo = immUtil.refreshWebofficeToken(
                request.getAccessToken(),
                request.getRefreshToken()
        );
        return Result.success(tokenVo);
    }

    /**
     * 刷新 Token 请求 DTO
     */
    public static class RefreshTokenRequest {
        /**
         * 当前访问凭证
         */
        private String accessToken;

        /**
         * 刷新凭证
         */
        private String refreshToken;

        public String getAccessToken() {
            return accessToken;
        }

        public void setAccessToken(String accessToken) {
            this.accessToken = accessToken;
        }

        public String getRefreshToken() {
            return refreshToken;
        }

        public void setRefreshToken(String refreshToken) {
            this.refreshToken = refreshToken;
        }
    }
}
