import { loadLicelFileFromArrayBuffer, loadLicelFile } from "./licelfile";
import { type ILicelFile, type ILicelPack } from "./licelTypes";
import { ZipReader, BlobReader, TextWriter, Uint8ArrayWriter } from '@zip.js/zip.js';

/**
* Загружает пакет Licel из файлов.
* @param filePaths - Массив путей к файлам.
* @returns Объект ILicelPack, содержащий время начала измерения и данные измерения.
*/
export async function loadLicelPack(filePaths: string[]): Promise<ILicelPack> {
    const data = new Map<string, ILicelFile>();
    let startTime: Date | null = null;

    for (const path of filePaths) {
        const licelFile = await loadLicelFile(path);
        data.set(path, licelFile);
        if (!startTime || licelFile.measurementStartTime < startTime) {
            startTime = licelFile.measurementStartTime;
        }
    }

    return {
        startTime: startTime!,
        data: data,
    };
}

/**
* Загружает пакет Licel из zip-файла.
* @param zipFile - Путь к zip-файлу.
* @returns Объект ILicelPack, содержащий время начала измерения и данные измерения.
*/
export async function loadLicelPackFromZip(zipFile: string): Promise<ILicelPack> {
    const zipBlob = new Blob([await Bun.file(zipFile).arrayBuffer()]);
    const zipReader = new ZipReader(new BlobReader(zipBlob));
    const entries = await zipReader.getEntries();
    const data = new Map<string, ILicelFile>();
    let startTime: Date | null = null;
    for (const entry of entries) {
        if (!entry.filename.startsWith("b")) continue
        const writer = new Uint8ArrayWriter();
        const buffer = await entry.getData!(writer);
        const arrayBuffer = buffer.buffer.slice(buffer.byteOffset, buffer.byteOffset + buffer.byteLength) as ArrayBuffer;
        const licelFile = await loadLicelFileFromArrayBuffer(arrayBuffer);
        data.set(entry.filename, licelFile);
        if (!startTime || licelFile.measurementStartTime < startTime) {
            startTime = licelFile.measurementStartTime;
        }
    }
    await zipReader.close();
    return {
        startTime: startTime!,
        data: data,
    };
}


