"use server";

import { ServerAction, ServerRequest, ServerResponse } from "@/lib/actions";
import unzipFile from "@/services/unzipp";
import uploadFolders from "@/services/uploadFolders";
import writeFiles from "@/services/writeFiles";
import { mkdir, rm } from "fs/promises";
import { v4 } from "uuid";

export default async function uploadSubdomainFiles(
  formData: FormData,
  isZip: boolean,
  action?: { isAuth: boolean },
) {
  const { error, con, dict } = await ServerAction(action);

  if (error) {
    return ServerResponse({
      operation: false,
      data: error,
    });
  }

  const projectName = formData.get("name") as string;
  const path = formData.get("path") as string;
  const total = formData.get("totalFiles") as string;
  const files: File | File[] = isZip
    ? (formData.get("file") as File)
    : (() => {
        const array: File[] = [];
        for (let i = 1; i < parseInt(total) + 1; i++) {
          array.push(formData.get(`file-${i}`) as File);
        }
        return array;
      })();

  const baseDir = `public/tmp/${v4()}`;

  try {
    const errores: string[] = [];
    const projectDir = `${baseDir}/FEDSITE_${projectName}`;
    await mkdir(projectDir, { recursive: true });

    if (isZip) {
      const unzipResponse = await ServerRequest(
        unzipFile(files as File, projectDir),
      );

      if (!unzipResponse.operation) {
        return ServerResponse({
          operation: false,
          message: unzipResponse.message,
          data: errores.join("::"),
        });
      }
    } else {
      const writeResponse = await ServerRequest(
        writeFiles(files as File[], path, projectDir),
      );

      if (!writeResponse.operation) {
        return ServerResponse({
          operation: false,
          message: writeResponse.message,
          data: errores.join("::"),
        });
      }
    }

    await uploadFolders(baseDir, errores);

    return ServerResponse({
      operation: true,
      message: dict.alerts.upload_files.success,
      data: errores,
    });
  } catch (error) {
    return ServerResponse({
      operation: false,
      message: dict.alerts.general.unexpected_error,
      data: error,
    });
  } finally {
    con.release();
    await rm(baseDir, { recursive: true, force: true });
  }
}
