import { gzipSync, gunzipSync } from 'fflate';

export enum CompressFormat {
    GZIP = 'gzip',
    BROTLI = 'brotli',
}

// brotli-wasm 在模块顶层用 top-level await + fetch 加载 .wasm 二进制。若在此文件顶层静态 import，
// 预渲染（SSG，Node 端无 fetch）时会在模块求值阶段崩溃（"fetch failed / not implemented"）。
// 改为在真正需要压缩时（仅浏览器端）动态 import，SSG 期间完全不触碰 brotli-wasm。
type BrotliModule = Awaited<(typeof import('brotli-wasm'))['default']>;
let brotliModule: BrotliModule | null = null;

async function getBrotli(): Promise<BrotliModule> {
    if (brotliModule) return brotliModule;
    const mod = await import('brotli-wasm');
    brotliModule = await mod.default;
    return brotliModule;
}

/**
 * 使用 fflate(brotli-wasm) 压缩二进制数据
 * @param bytes 原始二进制数据
 * @param format 压缩格式
 * @returns 压缩后的二进制数据
 */
export async function compressBytes(
    bytes: Uint8Array,
    format: CompressFormat
): Promise<Uint8Array> {
    if (format === CompressFormat.GZIP) {
        return gzipSync(bytes);
    }
    const brotli = await getBrotli();
    return brotli.compress(bytes);
}

/**
 * 使用 fflate(brotli-wasm) 解压二进制数据
 * @param bytes 压缩后的二进制数据
 * @param format 压缩格式（需与压缩时一致）
 * @returns 解压后的二进制数据
 */
export async function decompressBytes(
    bytes: Uint8Array,
    format: CompressFormat
): Promise<Uint8Array> {
    if (format === CompressFormat.GZIP) {
        return gunzipSync(bytes);
    }
    const brotli = await getBrotli();
    return brotli.decompress(bytes);
}
