package org.dromara.zhishu.util;

import com.pdd.pop.sdk.common.util.JsonUtil;
import org.dromara.zhishu.domain.bo.TaskBo;
import org.springframework.web.multipart.MultipartFile;

import java.io.*;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.text.SimpleDateFormat;
import java.util.Base64;
import java.util.Date;
import java.util.List;
import java.util.Map;


public class FileUtil {

    /**
     * 判断指定路径下的指定文件是否存在
     *
     * @param filePath 文件的完整路径（包括文件名和扩展名）
     * @return 存在返回 true，不存在返回 false
     */
    public static boolean isFileExists(String filePath) {
        if (filePath == null || filePath.trim().isEmpty()) {
            return false;
        }

        File file = new File(filePath);
        return file.exists() && file.isFile();
    }

    public static boolean fileDelete(String filePath) {
        if (filePath == null || filePath.trim().isEmpty()) {
            return false;
        }

        File file = new File(filePath);
        if (file.exists() && file.isFile()) {
            if (file.delete()) {
                System.out.println("原文件删除成功: " + filePath);
                return true;
            } else {
                System.err.println("尝试删除原文件时发生错误: " + filePath);
                return false;
            }
        } else {
            System.err.println("未找到原文件或不是文件: " + filePath);
            return false;
        }
    }

    /**
     * 校验文件大小是否超过指定值
     * @param filePath 文件路径
     * @return 如果文件大小超过最大值返回 true，否则返回 false
     */
    public static boolean isFileSizeExceeds(String filePath) {
        long maxSize = 1024 * 1024 * 2; // 2MB
        File file = new File(filePath);
        if (file.exists() && file.isFile()) {
            return file.length() > maxSize;
        }
        return false;
    }

    /**
     * 根据路径获取TXT文件内容，如果文件不存在则创建。
     *
     * @param filePath 文件的路径
     * @param contentToAppend 要追加的内容
     * @return 文件的完整内容
     */
    public static String processTxtFile(String filePath, String contentToAppend) {
        try {
            File file = new File(filePath);

            // 确保父目录存在
            if (!file.getParentFile().exists()) {
                if (!file.getParentFile().mkdirs()) {
                    throw new IOException("无法创建目标目录: " + file.getParent());
                }
            }

            // 如果文件不存在，则创建
            if (!file.exists()) {
                file.createNewFile();
            }

            // 读取文件内容
            String fileContent = new String(Files.readAllBytes(Paths.get(filePath)));

            // 追加内容并换行
            try (FileWriter writer = new FileWriter(file, true)) {
                writer.write(System.lineSeparator() + contentToAppend);
            }

            return fileContent;
        } catch (IOException e) {
            e.printStackTrace();
            return null;
        }
    }

    public static String convertToBase64(MultipartFile file) {
        try {
            InputStream inputStream = new ByteArrayInputStream(file.getBytes());
            ByteArrayOutputStream outputStream = new ByteArrayOutputStream();

            byte[] buffer = new byte[1024];
            int bytesRead;

            while ((bytesRead = inputStream.read(buffer)) != -1) {
                outputStream.write(buffer, 0, bytesRead);
            }

            byte[] byteArray = outputStream.toByteArray();
            return Base64.getEncoder().encodeToString(byteArray);
        } catch (Exception e) {
            // 处理异常
            e.printStackTrace();
            return null;
        }
    }


    /**
     * 通用参数日志记录方法
     * @param methodName 方法名称
     * @param parameters 可变参数，可以传入任意数量的参数
     */
    public static void logParameters(String methodName, Object... parameters) {
        FileWriter fileWriter = null;
        BufferedWriter bufferedWriter = null;

        try {
            // 获取当前项目路径
            String projectPath = System.getProperty("user.dir");
            String logDirPath = projectPath + File.separator + methodName;
            File logDir = new File(logDirPath);

            // 创建目录（如果不存在）
            if (!logDir.exists()) {
                logDir.mkdirs();
            }

            // 查找可用的日志文件（不超过50MB）
            File logFile = findAvailableLogFile(logDir);

            // 创建文件写入器（追加模式）
            fileWriter = new FileWriter(logFile, true);
            bufferedWriter = new BufferedWriter(fileWriter);

            // 构建日志内容
            StringBuilder logContent = new StringBuilder();
            logContent.append("=== Method Parameter Log ===\n");
            logContent.append("Time: ").append(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date())).append("\n");
            logContent.append("Method: ").append(methodName).append("\n");

            // 记录所有参数
            logContent.append("Parameters:\n");
            if (parameters != null && parameters.length > 0) {
                for (int i = 0; i < parameters.length; i++) {
                    Object param = parameters[i];
                    String paramJson = JsonUtil.transferToJson(param);
                    logContent.append("  Parameter ").append(i + 1).append(": ").append(paramJson).append("\n");
                }
            } else {
                logContent.append("  No parameters\n");
            }

            logContent.append("=============================\n\n");

            // 写入日志
            bufferedWriter.write(logContent.toString());
            bufferedWriter.flush();

        } catch (Exception e) {
            // 日志记录失败不应该影响主流程，只打印错误信息
            e.printStackTrace();
        } finally {
            // 关闭资源
            try {
                if (bufferedWriter != null) {
                    bufferedWriter.close();
                }
                if (fileWriter != null) {
                    fileWriter.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

    /**
     * 查找可用的日志文件（不超过50MB）
     * @param logDir 日志目录
     * @return 可用的日志文件
     */
    private static File findAvailableLogFile(File logDir) {
        // 基础日志文件名
        String baseFileName = "stock_sync_log";
        String fileExtension = ".txt";

        // 首先检查当前日期的最新文件
        String currentDate = new SimpleDateFormat("yyyy-MM-dd").format(new Date());
        String todayFileName = baseFileName + "_" + currentDate + fileExtension;
        File todayFile = new File(logDir, todayFileName);

        // 如果文件不存在，直接返回新文件
        if (!todayFile.exists()) {
            return todayFile;
        }

        // 如果文件存在且小于50MB，则使用该文件
        if (todayFile.length() < 50 * 1024 * 1024) { // 50MB in bytes
            return todayFile;
        }

        // 如果今天的文件已满，创建带序号的新文件
        int fileIndex = 1;
        File newFile;
        do {
            String newFileName = baseFileName + "_" + currentDate + "_" + fileIndex + fileExtension;
            newFile = new File(logDir, newFileName);
            fileIndex++;
        } while (newFile.exists() && newFile.length() >= 50 * 1024 * 1024);

        return newFile;
    }
}