package com.backendsys.modules.common.utils;

import cn.hutool.core.convert.Convert;
import cn.hutool.core.io.FileUtil;
import cn.hutool.core.lang.UUID;
import cn.hutool.core.util.StrUtil;
import cn.hutool.http.HttpRequest;
import cn.hutool.http.HttpResponse;
import cn.hutool.http.HttpUtil;
import org.springframework.util.StringUtils;
import org.springframework.web.multipart.MultipartFile;

import java.io.File;
import java.io.IOException;
import java.net.MalformedURLException;
import java.net.URL;
import java.nio.charset.StandardCharsets;
import java.nio.file.Path;
import java.nio.file.Paths;

public class CommonUtil {

    // [文件名] 获得文件后缀名
    public static String getFilenameSuffix(MultipartFile multipartFile, boolean includeDot) {
        String originalFileName = multipartFile.getOriginalFilename();
        int dotIndex = originalFileName.lastIndexOf(".");
        // 根据 includeDot 参数决定是否包含点
        if (includeDot) {
            return originalFileName.substring(dotIndex);
        } else {
            return originalFileName.substring(dotIndex + 1);
        }
    }

    // [文件名] 生成新的文件名 (UUID + 后缀名)
    public static String generateUUIDFilename(MultipartFile multipartFile) {
        return Convert.toStr(UUID.randomUUID()) + getFilenameSuffix(multipartFile, true);
    }
    public static String generateUUIDFilename(String suffix) {
        return Convert.toStr(UUID.randomUUID()) + "." + suffix;
    }

//    // 获取远程文件大小（有问题，暂不可用）
//    public static long getFileSize(String fileUrl) throws IOException {
//        HttpResponse response = HttpRequest.head(fileUrl).execute();
//        if (response.isOk()) {
//            String contentLength = response.header("Content-Length");
//            if (StrUtil.isNotEmpty(contentLength)) {
//                return Long.parseLong(contentLength);
//            } else {
//                throw new IOException("无法获取文件大小，响应头中缺少 Content-Length 字段。");
//            }
//        } else {
//            throw new IOException("无法获取文件大小，HTTP 响应码: " + response.getStatus());
//        }
//    }

    // 获得URL文件后缀名
    public static String getFileSuffixFromUrl(String url) {
        try {
            // 获得远程 url
            URL urlObject = new URL(url);
            // 获得文件名
            String filename = Paths.get(urlObject.getPath()).getFileName().toString();
            // 获取文件后缀名
            String fileSuffix = FileUtil.extName(filename);
            return fileSuffix;
        } catch (MalformedURLException e) {
            throw new RuntimeException(e);
        }
    }

    /**
     * 从 URL 下载文件到本地临时目录（兼容 Windows & Linux）
     * @param url 文件下载地址（如 "http://example.com/file.txt"）
     * @return 下载后的本地文件对象
     * @throws RuntimeException 如果下载失败
     */
    public static File downloadLocalFromUrl(String url) {
        try {
            // 1. 获取系统临时目录（兼容 Win/Linux）
            Path tempDirPath = Paths.get(System.getProperty("java.io.tmpdir"));
            // 2. 解析 URL 获取文件名（处理编码和路径）
            URL urlObject = new URL(url);
            String filename = extractValidFilename(urlObject);
            // 3. 构建目标文件路径（自动处理路径分隔符）
            Path targetPath = tempDirPath.resolve(filename);
            // 4. 下载文件（示例使用 Hutool 的 HttpUtil）
            HttpUtil.downloadFile(url, targetPath.toFile());
            // 5. 检查文件是否下载成功
            if (!targetPath.toFile().exists()) {
                throw new RuntimeException("下载失败，文件不存在: " + targetPath);
            }
            return targetPath.toFile();
        } catch (MalformedURLException e) {
            throw new RuntimeException("URL 格式错误: " + url, e);
        } catch (IOException e) {
            throw new RuntimeException("下载文件失败: " + url, e);
        }
    }

    /**
     * 从 URL 提取有效文件名（移除非法字符）
     */
    private static String extractValidFilename(URL url) {
        // 获取原始文件名（如 "/downloads/file.txt" → "file.txt"）
        String filename = Paths.get(url.getPath()).getFileName().toString();
        // 移除 URL 编码（如 "%20" → " "）
        filename = java.net.URLDecoder.decode(filename, StandardCharsets.UTF_8);
        // 替换非法字符（兼容 Win/Linux）
        return filename.replaceAll("[\\\\/:*?\"<>|]", "_");
    }

//    public static File downloadLocalFromUrl(String url) {
//        try {
//            // 获取系统默认的临时目录
//            Path tempDirPath = Paths.get(System.getProperty("java.io.tmpdir"));
//            // 下载文件到本地 (可能会有性能问题)
//            HttpUtil.downloadFile(url, tempDirPath.toFile());
//            // 获得远程 url
//            URL urlObject = new URL(url);
//            // 获得文件名
//            String filename = Paths.get(urlObject.getPath()).getFileName().toString();
//            // 获得下载到本地的路径
//            File downloadFile = new File(tempDirPath + File.separator + filename);
//            return downloadFile;
//        } catch (MalformedURLException e) {
//            throw new RuntimeException(e);
//        }
//    }

    // [文件名] 插入 '-thumb' 文件名后缀
    public static String insertThumbSuffix(String filePath) {
        int dotIndex = filePath.lastIndexOf('.');
        if (dotIndex != -1) {
            return filePath.substring(0, dotIndex) + "-thumb" + filePath.substring(dotIndex);
        } else {
            return filePath;
        }
    }

}
