import { ServerAction, ServerResponse } from "@/lib/actions";
import { getExtension } from "@/lib/utils";
import { existsSync } from "fs";
import { mkdir, writeFile } from "fs/promises";
import unzipper from "unzipper";

export default async function unzipFile(
  files: File,
  baseDir: string,
  action?: { isAuth: boolean },
) {
  const { error, con, dict } = await ServerAction(action);

  if (error) {
    return ServerResponse({
      operation: false,
      data: error,
    });
  }

  const extension = getExtension(files.name);

  if (files.size != 0 && files.name != undefined) {
    try {
      if (!extension || extension !== "zip") {
        return ServerResponse({
          operation: false,
          message: dict.alerts.general.type_not_allowed,
        });
      }

      const zipBuffer = await files.arrayBuffer();
      const zipStream = await unzipper.Open.buffer(Buffer.from(zipBuffer));

      for (const f of zipStream.files) {
        const splittedPath = f.path.split("/");

        if (f.type !== "File") continue;

        const fileName = splittedPath.pop();
        const dir = `${baseDir}/${splittedPath.join("/")}`;

        if (!existsSync(dir)) {
          await mkdir(dir, {
            recursive: true,
          });
        }

        const localDir = `${dir}/${fileName}`;
        const content = await f.buffer();
        await writeFile(localDir, content);
      }

      return ServerResponse({ operation: true, message: "UnZip successful" });
    } catch (error) {
      return ServerResponse({
        operation: false,
        message: "Error unziping",
        data: error,
      });
    } finally {
      con.release();
    }
  }

  return ServerResponse({ operation: true, message: "Nothing to process" });
}
