package com.ycwl.basic.image.pipeline.util;

import lombok.extern.slf4j.Slf4j;

import java.io.File;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.util.ArrayList;
import java.util.List;
import java.util.UUID;

/**
 * 临时文件管理器
 * 统一管理所有临时文件的创建和清理
 */
@Slf4j
public class TempFileManager {

    private final String processId;
    private final Path tempDir;
    private final List<File> tempFiles;

    public TempFileManager() {
        this.processId = UUID.randomUUID().toString();
        this.tempDir = initTempDirectory();
        this.tempFiles = new ArrayList<>();
    }

    public TempFileManager(String processId) {
        this.processId = processId;
        this.tempDir = initTempDirectory();
        this.tempFiles = new ArrayList<>();
    }

    private Path initTempDirectory() {
        Path baseDir = Path.of(System.getProperty("java.io.tmpdir"), "photo_process", processId);
        try {
            Files.createDirectories(baseDir);
            log.debug("创建隔离临时目录: {}", baseDir);
            return baseDir;
        } catch (IOException e) {
            log.warn("无法创建隔离临时目录,尝试使用系统临时目录", e);
            try {
                Path fallback = Files.createTempDirectory("photo_process_" + processId + "_");
                log.debug("创建备用临时目录: {}", fallback);
                return fallback;
            } catch (IOException ex) {
                log.warn("无法创建系统临时目录,使用当前目录", ex);
                return Path.of(".");
            }
        }
    }

    /**
     * 创建临时文件
     *
     * @param prefix 文件名前缀
     * @param suffix 文件名后缀(如 .jpg, .png)
     * @return 临时文件
     */
    public File createTempFile(String prefix, String suffix) {
        String filename = String.format("%s_%s%s", prefix, processId, suffix);
        File tempFile = tempDir.resolve(filename).toFile();
        tempFiles.add(tempFile);
        log.debug("创建临时文件: {}", tempFile.getAbsolutePath());
        return tempFile;
    }

    /**
     * 注册外部创建的临时文件
     */
    public void registerTempFile(File file) {
        if (file != null && !tempFiles.contains(file)) {
            tempFiles.add(file);
            log.debug("注册临时文件: {}", file.getAbsolutePath());
        }
    }

    /**
     * 清理所有临时文件
     */
    public void cleanup() {
        int deletedCount = 0;
        int failedCount = 0;

        for (File file : tempFiles) {
            if (file != null && file.exists()) {
                boolean deleted = file.delete();
                if (deleted) {
                    deletedCount++;
                    log.debug("删除临时文件: {}", file.getAbsolutePath());
                } else {
                    failedCount++;
                    log.warn("无法删除临时文件: {}", file.getAbsolutePath());
                }
            }
        }

        tempFiles.clear();

        if (deletedCount > 0) {
            log.info("清理临时文件: 成功{}个, 失败{}个", deletedCount, failedCount);
        }

        cleanupTempDirectory();
    }

    private void cleanupTempDirectory() {
        if (tempDir != null && !tempDir.equals(Path.of("."))) {
            try {
                Files.deleteIfExists(tempDir);
                log.debug("删除临时目录: {}", tempDir);
            } catch (IOException e) {
                log.warn("无法删除临时目录: {}", tempDir, e);
            }
        }
    }

    public String getProcessId() {
        return processId;
    }

    public int getTempFileCount() {
        return tempFiles.size();
    }
}
