import { getDictionary } from "@/dictionaries";
import Mkdir from "@/lib/cpanel/api2/Fileman/mkdir";
import AddSubDomain from "@/lib/cpanel/api3/SubDomain/addsubdomain";
import { getLocale } from "@/lib/locales";
import { getCpanelVars } from "@/models/cpanel";
import { DBEType } from "@/models/ErrorType";
import { readdir, rm } from "fs/promises";
import { postServerLog } from "./logs";
import uploadFilesInBatch from "./uploadFilesInBatch";

const MAX_UPLOADS_PER_BATCH = 8;

export default async function uploadFolders(
  baseDir: string,
  errores?: string[],
  newDomain = true,
) {
  const dict = await getDictionary(getLocale());
  const cpanel = getCpanelVars();

  const dirReaded = await readdir(baseDir, { recursive: false });
  const projects = dirReaded.filter((e) => e.startsWith("FEDSITE_"));

  for (const project of projects) {
    const projectName = project.slice("FEDSITE_".length).toLowerCase();
    const projectDir = `${baseDir}/${project}`;

    try {
      const files = await readdir(`${projectDir}`, {
        recursive: true,
        withFileTypes: true,
      });

      const fileToUpload: string[] = [];

      for (const file of files) {
        if (file.isDirectory()) {
          const fileDir = `${file.path}/${file.name}`.replaceAll("\\", "/");
          const sliceStart = `${baseDir}/FEDSITE_${projectName}/`.length;
          const formatted = `FEDSITE_${projectName}/${fileDir.slice(
            sliceStart,
          )}`;

          const splitted = formatted.split("/");
          const name = splitted.pop();
          const path = splitted.join("/");

          const res = await Mkdir({
            path: `/home/${cpanel.user}/${path}`,
            name: name!,
          });
        }

        if (file.isFile()) {
          const fileDir = `${file.path}/${file.name}`.replaceAll("\\", "/");

          fileToUpload.push(fileDir);
          if (fileToUpload.length >= MAX_UPLOADS_PER_BATCH) {
            await uploadFilesInBatch(fileToUpload, errores, dict);
            fileToUpload.length = 0;
          }
        }
      }

      if (fileToUpload.length > 0) {
        await uploadFilesInBatch(fileToUpload, errores, dict);
      }

      if (newDomain) {
        const createSubDomain = await AddSubDomain({
          domain: `${projectName}.${cpanel.domain}`,
          rootdomain: `${cpanel.domain}`,
          dir: `/home/${cpanel.user}/FEDSITE_${projectName}`,
        });

        if (createSubDomain.status == 0) {
          errores?.push(
            dict.alerts.create_subdomain.error.replace(
              "{{projectName}}",
              projectName,
            ),
          );
        }
      }

      await rm(projectDir, { recursive: true, force: true });
    } catch (error) {
      await postServerLog({ type: DBEType.ERROR, log: error });
      errores?.push(`${projectName} ${dict.alerts.general.upload_files}`);
    }
  }
  // public\tmp\4b8225f8-7c14-4075-8530-f7d278d26e95\FEDSITE_test\index.html
  // public/tmp/4b8225f8-7c14-4075-8530-f7d278d26e95/FEDSITE_test/index.html,
  for (const item of dirReaded) {
    if (item === ".gitkeep") {
      continue;
    }

    await rm(`${baseDir}/${item}`, { recursive: true, force: true });
  }
}
