package com.yeqifu.sys.controller;

import cn.hutool.core.date.DateUtil;
import com.yeqifu.sys.common.AppFileUtils;
import com.yeqifu.sys.common.Constast;
import org.springframework.http.HttpHeaders;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.http.HttpStatus;

import java.io.File;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;

/**
 *@Author zup
 *@Date: 2024/12/16
 */
@RestController
@RequestMapping("file")
public class FileController {

    /**
     * 图片上传
     * @param mf 上传的文件
     * @return 上传结果
     */
    @RequestMapping("uploadImage")
    public Map<String, Object> uploadImage(MultipartFile mf) {
        Map<String, Object> map = new HashMap<>();

        // 检查 MultipartFile 是否为空
        if (mf == null || mf.isEmpty()) {
            map.put("error", "上传文件为空");
            return map;
        }

        // 得到文件名原始名
        String oldName = mf.getOriginalFilename();

        // 检查文件名是否为空
        if (oldName == null || oldName.trim().isEmpty()) {
            map.put("error", "文件名为空");
            return map;
        }

        try {
            // 根据旧的文件名生成新的文件名
            String newName = AppFileUtils.createNewFileName(oldName);

            // 得到当前日期的字符串
            String dirName = DateUtil.format(new Date(), "yyyy-MM-dd");

            // 构造文件夹路径
            File dirFile = new File(AppFileUtils.UPLOAD_PATH, dirName);

            // 判断当前文件夹是否存在
            if (!dirFile.exists()) {
                // 如果不存在则创建新文件夹
                if (!dirFile.mkdirs()) {
                    map.put("error", "无法创建上传路径：" + dirFile.getAbsolutePath());
                    return map;
                }
            }

            // 构造文件对象
            File file = new File(dirFile, newName + "_temp");

            // 把 mf 里面的图片信息写入 file
            mf.transferTo(file);
            map.put("path", dirName + "/" + newName + "_temp");

        } catch (IOException e) {
            e.printStackTrace();
            map.put("error", "文件上传失败：" + e.getMessage());
        } catch (RuntimeException e) {
            e.printStackTrace();
            map.put("error", "上传过程发生运行时异常：" + e.getMessage());
        }

        return map;
    }

    /**
     * 图片下载
     * @param path 图片路径
     * @return 文件内容或错误信息
     */
    @RequestMapping("showImageByPath")
    public ResponseEntity<byte[]> downloadImage(@RequestParam String path) {
        // 如果是默认图片，直接返回
        if (path.equals(Constast.DEFAULT_IMG_USER) || path.equals(Constast.DEFAULT_IMG_GOODS)) {
            return getDefaultImage(path);
        }

        // 规范路径，防止路径穿越
        Path normalizedPath = Paths.get(AppFileUtils.UPLOAD_PATH, path).normalize();

        // 防止路径越界，确保文件在允许的上传目录下
        if (!normalizedPath.startsWith(AppFileUtils.UPLOAD_PATH)) {
            return ResponseEntity.status(HttpStatus.FORBIDDEN).build(); // 如果路径越界，返回403 Forbidden
        }
        // 检查文件是否存在
        File file = normalizedPath.toFile();
        if (!file.exists() || !file.isFile()) {
            return ResponseEntity.status(HttpStatus.NOT_FOUND).build(); // 文件不存在，返回404 Not Found
        }

        try {
            // 读取文件内容
            byte[] fileContent = Files.readAllBytes(normalizedPath);

            // 根据文件扩展名推测文件类型并返回适当的 Content-Type
            String contentType = Files.probeContentType(normalizedPath);
            if (contentType == null) {
                contentType = "application/octet-stream"; // 默认二进制流类型
            }

            // 返回文件内容，设置响应头和状态码
            return ResponseEntity.ok()
                    .contentType(MediaType.valueOf(contentType))
                    .body(fileContent);

        } catch (IOException e) {
            // 异常捕获并返回500服务器错误
            e.printStackTrace();
            return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).build(); // 服务器错误
        }
    }

    /**
     * 获取默认图片内容
     */
    private ResponseEntity<byte[]> getDefaultImage(String path) {
        // 返回一个 302 重定向响应，重定向到默认图片的 URL
        if (path.equals(Constast.DEFAULT_IMG_USER)) {
            return ResponseEntity.status(HttpStatus.FOUND)
                    .header(HttpHeaders.LOCATION, Constast.DEFAULT_IMG_USER) // 图片的 URL 路径
                    .build();
        } else if (path.equals(Constast.DEFAULT_IMG_GOODS)) {
            return ResponseEntity.status(HttpStatus.FOUND)
                    .header(HttpHeaders.LOCATION, Constast.DEFAULT_IMG_GOODS) // 图片的 URL 路径
                    .build();
        }
        return ResponseEntity.status(HttpStatus.NOT_FOUND).build();
    }
}

