import brotliWasm from 'brotli-wasm';
import { gzipSync, gunzipSync } from 'fflate';

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

let brotliModule: Awaited<typeof brotliWasm> | null = null;

async function getBrotli() {
    if (brotliModule) return brotliModule;
    brotliModule = await brotliWasm;
    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);
}
