package org.kne.codec.kif;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.nio.ByteBuffer;
import java.nio.ByteOrder;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.UUID;

/**
 * 调试工具：将字节数组 dump 到磁盘文件
 * 用于保存算法中间状态，方便用十六进制编辑器分析
 */
public class DebugDump {

    // 调试开关：设为 false 可全局禁用 dump
    private static boolean ENABLED = true;

    // dump 文件根目录
    private static final String DUMP_DIR = "debug";

    /**
     * 将字节数组 dump 到文件
     * 文件名：debug/[uuid].dat
     * 
     * @param data 要保存的字节数组
     * @return 保存的文件路径，如果禁用则返回 null
     */
    public static String dump(byte[] data) {
        return dump(data, null);
    }

    /**
     * 将字节数组 dump 到文件，附带说明标签
     * 文件名：debug/[uuid]_[tag].dat
     * 
     * @param data 要保存的字节数组
     * @param tag  标签（如 "raw", "predicted", "compressed"），可为 null
     * @return 保存的文件路径，如果禁用则返回 null
     */
    public static String dump(byte[] data, String tag) {
        if (!ENABLED) {
            return null;
        }

        try {
            // 确保目录存在
            File dir = new File(DUMP_DIR);
            if (!dir.exists()) {
                dir.mkdirs();
            }

            // 生成文件名
            String uuid = UUID.randomUUID().toString().substring(0, 8);
            String fileName = tag != null && !tag.isEmpty() 
                ? uuid + "_" + tag + ".dat" 
                : uuid + ".dat";
            File file = new File(dir, fileName);

            // 写入数据
            try (FileOutputStream fos = new FileOutputStream(file)) {
                fos.write(data);
            }

            // 同时输出一个 .info 文件，记录元数据
            String infoFile = fileName.replace(".dat", ".info");
            String infoContent = String.format(
                "Dump Info:\n" +
                "  UUID: %s\n" +
                "  Tag: %s\n" +
                "  Size: %,d bytes (%.2f KB)\n" +
                "  Time: %s\n",
                uuid,
                tag != null ? tag : "(none)",
                data.length,
                data.length / 1024.0,
                java.time.LocalDateTime.now()
            );
            Files.write(Paths.get(dir.getPath(), infoFile), infoContent.getBytes());

            System.out.println("🔍 Dump: " + file.getAbsolutePath() + " (" + data.length + " bytes)");
            return file.getAbsolutePath();

        } catch (IOException e) {
            System.err.println("❌ Dump 失败: " + e.getMessage());
            return null;
        }
    }

    /**
     * 将 int 数组转为 byte 数组后 dump（小端序）
     */
    public static String dumpIntArray(int[] data, String tag) {
        byte[] bytes = new byte[data.length * 4];
        ByteBuffer bb = ByteBuffer.wrap(bytes);
        bb.order(ByteOrder.LITTLE_ENDIAN);
        for (int v : data) {
            bb.putInt(v);
        }
        return dump(bytes, tag);
    }

    /**
     * 将 int 数组转为 byte 数组后 dump（大端序）
     */
    public static String dumpIntArrayBE(int[] data, String tag) {
        byte[] bytes = new byte[data.length * 4];
        ByteBuffer bb = ByteBuffer.wrap(bytes);
        bb.order(ByteOrder.BIG_ENDIAN);
        for (int v : data) {
            bb.putInt(v);
        }
        return dump(bytes, tag);
    }

    /**
     * 将 short 数组转为 byte 数组后 dump（小端序）
     */
    public static String dumpShortArray(short[] data, String tag) {
        byte[] bytes = new byte[data.length * 2];
        ByteBuffer bb = ByteBuffer.wrap(bytes);
        bb.order(ByteOrder.LITTLE_ENDIAN);
        for (short v : data) {
            bb.putShort(v);
        }
        return dump(bytes, tag);
    }

    /**
     * 启用/禁用 dump
     */
    public static void setEnabled(boolean enabled) {
        ENABLED = enabled;
    }

    /**
     * 清空 debug 目录
     */
    public static void clean() throws IOException {
        File dir = new File(DUMP_DIR);
        if (dir.exists()) {
            for (File f : dir.listFiles()) {
                f.delete();
            }
        }
    }
}