package com.zhentao.controller;

import cn.hutool.core.lang.UUID;
import com.zhentao.common.Result;
import com.zhentao.service.UserService;
import io.minio.BucketExistsArgs;
import io.minio.MakeBucketArgs;
import io.minio.MinioClient;
import io.minio.PutObjectArgs;
import io.minio.errors.MinioException;
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.io.InputStream;

/**
 * 头像上传控制器（本地文件存储）
 */
@RestController
@RequestMapping("/api/avatar")
public class AvatarUploadController {
    
    @Autowired
    private UserService userService;

    @Value("${minio.bucketName_acater}")
    private String minioBucketName;

    @Value("https://api.zhongruanke.cn/minio/")
    private String urlPrefix;

    @Autowired
    private MinioClient minioClient;
    
    /**
     * 上传用户头像（本地文件存储）
     * @param file 图片文件
     * @param userId 用户ID
     * @return 上传结果，包含头像URL
     */
    @PostMapping("/upload")
    public Result<String> uploadAvatar(
            @RequestParam("file") MultipartFile file,
            @RequestParam("userId") Long userId) {


        System.out.println("=== 接收头像上传请求（MinIO 存储）===");
        System.out.println("用户ID: " + userId);
        System.out.println("文件名: " + file.getOriginalFilename());
        System.out.println("文件大小: " + file.getSize() + " bytes");
        System.out.println("MinIO 桶名: " + minioBucketName);
        System.out.println("URL前缀: " + urlPrefix);

        try {
            // 1. 基础验证
            if (file.isEmpty()) {
                return Result.error("文件不能为空");
            }

            // 2. 验证文件类型
            String contentType = file.getContentType();
            if (contentType == null || !contentType.startsWith("image/")) {
                return Result.error("只能上传图片文件");
            }

            // 3. 验证文件大小（不超过5MB）
            long maxSize = 5 * 1024 * 1024; // 5MB
            if (file.getSize() > maxSize) {
                return Result.error("图片大小不能超过5MB");
            }

            // 4. 生成唯一文件名（避免重复）
            String originalFilename = file.getOriginalFilename();
            String suffix = originalFilename.substring(originalFilename.lastIndexOf("."));
            // 使用 UUID + 时间戳 增强唯一性，避免并发问题
            String fileName = "avatar_" + userId + "_" + System.currentTimeMillis() + "_" + UUID.randomUUID() + suffix;
            System.out.println("生成 MinIO 存储文件名: " + fileName);

            // 5. 检查并创建 MinIO 桶（若不存在）
            if (!minioClient.bucketExists(BucketExistsArgs.builder().bucket(minioBucketName).build())) {
                minioClient.makeBucket(MakeBucketArgs.builder().bucket(minioBucketName).build());
                System.out.println("创建 MinIO 桶: " + minioBucketName);
            }

            // 6. 上传文件到 MinIO
            try (InputStream inputStream = file.getInputStream()) {
                minioClient.putObject(
                        PutObjectArgs.builder()
                                .bucket(minioBucketName)          // 桶名
                                .object(fileName)                  // 存储对象名（即文件名）
                                .stream(inputStream, file.getSize(), -1) // 文件流 + 大小
                                .contentType(contentType)          // 文件类型
                                .build()
                );
                System.out.println("文件已上传至 MinIO: " + minioBucketName + "/" + fileName);
            }

            // 7. 生成访问URL
            String avatarUrl = urlPrefix + minioBucketName + "/" + fileName;
            System.out.println("生成访问URL: " + avatarUrl);

            // 8. 更新数据库中的头像URL
            boolean success = userService.updateAvatarUrl(userId, avatarUrl);
            if (!success) {
                System.err.println("❌ 数据库更新失败");
                // 可选：若数据库更新失败，删除 MinIO 中已上传的文件
                // minioClient.removeObject(RemoveObjectArgs.builder().bucket(minioBucketName).object(fileName).build());
                return Result.error("更新头像失败");
            }

            System.out.println("✅ 头像上传成功！");
            return Result.success("头像上传成功", avatarUrl);

        } catch (MinioException e) {
            System.err.println("❌ MinIO 操作失败: " + e.getMessage());
            e.printStackTrace();
            return Result.error("文件上传至 MinIO 失败: " + e.getMessage());
        } catch (Exception e) {
            System.err.println("❌ 上传失败: " + e.getMessage());
            e.printStackTrace();
            return Result.error("上传失败: " + e.getMessage());
        }
    }
    
    /**
     * 获取用户头像URL
     * @param userId 用户ID
     * @return 头像URL
     */
    @GetMapping("/url")
    public Result<String> getAvatarUrl(@RequestParam Long userId) {
        try {
            String avatarUrl = userService.getAvatarUrl(userId);
            return Result.success("获取成功", avatarUrl);
        } catch (Exception e) {
            e.printStackTrace();
            return Result.error("获取失败: " + e.getMessage());
        }
    }
}

