package com.example.oss.controller;

import com.example.oss.util.OssUtils;
import com.example.oss.vo.OssTokenVo;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import lombok.RequiredArgsConstructor;
import org.springframework.web.bind.annotation.*;

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

/**
 * 文件上传控制器
 * <p>
 * 仅提供 OSS 直传 Token 获取接口。
 * 实际文件上传由前端直接发送到阿里云 OSS，不经过后端。
 * </p>
 *
 * <h3>使用流程：</h3>
 * <ol>
 *   <li>前端调用 GET /api/v1/files/oss/token 获取签名 Token</li>
 *   <li>前端使用 FormData 将文件 + Token 直接 POST 到阿里云 OSS</li>
 * </ol>
 */
@RestController
@RequestMapping("/api/v1/files")
@RequiredArgsConstructor
@Tag(name = "文件上传")
public class FileUploadController {

    private final OssUtils ossUtils;

    /**
     * 获取阿里云 OSS 直传 Token
     * <p>
     * 用于前端直传文件到 OSS，无需经过后端中转
     * </p>
     *
     * @param fileName 原始文件名（如：图片.jpg）
     * @param dir      目录前缀（可选，如：avatar, course/cover）
     * @return OSS 直传 Token VO
     */
    @GetMapping("/oss/token")
    @Operation(summary = "获取阿里云 OSS 直传 Token")
    public Map<String, Object> getOssToken(
            @RequestParam("fileName") String fileName,
            @RequestParam(value = "dir", required = false) String dir) {

        OssTokenVo token = ossUtils.generatePostObjectToken(fileName, dir);

        Map<String, Object> result = new HashMap<>();
        result.put("code", 200);
        result.put("message", "success");
        result.put("data", token);
        return result;
    }
}
