// FileDetailController.java
package com.ssyf.module.resource.controller.auth;

import cn.hutool.core.util.IdUtil;
import com.ssyf.common.web.result.Result;
import com.ssyf.module.resource.domain.vo.FileUploadVo;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.dromara.x.file.storage.core.FileInfo;
import org.dromara.x.file.storage.core.FileStorageService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;

import java.util.Base64;

/**
 * 文件上传控制器
 * 提供多种文件上传方式，支持普通文件、图片、视频及Base64格式上传
 *
 * @author huwei
 * @date 2024/10/28 14:35
 */
@Api(tags = "资源-文件上传接口")
@RestController()
@RequestMapping("/auth/FileDetail")
public class FileDetailController {

    @Autowired
    private FileStorageService fileStorageService;

    /**
     * 使用本地上传时，对外的暴露的域名地址。
     */
    @Value("${theServer.filesUrl:http://cloud.ssyunfu.com/files/}")
    private String filesUrl;

    /**
     * 通用文件上传
     * 适用于各种类型的文件上传
     *
     * @param file 要上传的文件
     * @return 文件信息
     */
    @ApiOperation(value = "通用文件上传", notes = "适用于各种类型的文件上传")
    @PostMapping("/upload")
    public Result<FileUploadVo> upload(@RequestParam("file") MultipartFile file) {
        FileInfo fileInfo = fileStorageService.of(file).upload();
        return Result.success(buildFileUploadVo(fileInfo));
    }

    /**
     * 图片上传（带缩略图）
     * 自动为图片生成200*200的缩略图
     *
     * @param file 要上传的图片文件
     * @return 文件信息
     */
    @ApiOperation(value = "图片上传", notes = "自动为图片生成200*200的缩略图")
    @PostMapping("/upload-image")
    public Result<FileUploadVo> uploadImage(@RequestParam("file") MultipartFile file) {
        FileInfo fileInfo = fileStorageService.of(file)
                .thumbnail(th -> th.size(200, 200))
                .upload();
        return Result.success(buildFileUploadVo(fileInfo));
    }

    /**
     * 视频上传
     * 专门用于视频文件上传
     *
     * @param file 要上传的视频文件
     * @return 文件信息
     */
    @ApiOperation(value = "视频上传", notes = "专门用于视频文件上传")
    @PostMapping("/upload-video")
    public Result<FileUploadVo> uploadVideo(@RequestParam("file") MultipartFile file) {
        FileInfo fileInfo = fileStorageService.of(file).upload();
        return Result.success(buildFileUploadVo(fileInfo));
    }

    /**
     * Base64图片上传
     * 将Base64编码的图片数据转换为文件并上传
     *
     * @param base64Data Base64编码的图片数据
     * @return 文件信息
     */
    @ApiOperation(value = "Base64图片上传", notes = "将Base64编码的图片数据转换为文件并上传")
    @PostMapping("/upload-base64-image")
    public Result<FileUploadVo> uploadBase64Image(@RequestParam String base64Data) {
        // 去除Base64前缀（如："data:image/png;base64,"）
        String base64 = base64Data.contains(",")
                ? base64Data.split(",")[1]
                : base64Data;

        // 将Base64字符串转为字节数组
        byte[] bytes = Base64.getDecoder().decode(base64);

        // 创建文件信息
        String fileName = IdUtil.simpleUUID() + ".png";
        FileInfo fileInfo = fileStorageService.of(bytes)
                .setOriginalFilename(fileName)
                .upload();

        return Result.success(buildFileUploadVo(fileInfo));
    }

    /**
     * 构建文件上传返回对象
     * 统一处理文件访问URL
     *
     * @param fileInfo 文件信息
     * @return FileUploadVo 文件上传返回对象
     */
    private FileUploadVo buildFileUploadVo(FileInfo fileInfo) {
        String url = fileInfo.getUrl();
        if (!url.startsWith("http://") && !url.startsWith("https://")) {
            url = filesUrl + url;
        }
        return new FileUploadVo().setUrl(url);
    }
}
