"use server";

import {
  ConvertFormdataToJSON,
  ServerAction,
  ServerResponse,
} from "@/lib/actions";
import FileOp from "@/lib/cpanel/api2/Fileman/fileop";
import { getCpanelVars } from "@/models/cpanel";
import { Client } from "basic-ftp";
import { createWriteStream, unlink, WriteStream } from "fs";
import { mkdir, rm } from "fs/promises";
import { v4 } from "uuid";

export default async function downloadSubdomainFiles(
  formData: FormData,
  action?: { isAuth: boolean },
) {
  const { error, con, dict } = await ServerAction(action);
  const cpanel = getCpanelVars();

  if (error) {
    return ServerResponse({
      operation: false,
      data: error,
    });
  }

  const { name, files, permanent = "0" } = ConvertFormdataToJSON(formData);

  const sourceFiles =
    typeof files === "string" ? JSON.parse(files).join(",") : files.join(",");

  const uuid = v4();
  const baseDir = `public/tmp/${uuid}`;

  const path = `${baseDir}/${name}.zip`;
  let stream: WriteStream;

  try {
    const cpanelRes: { [key: string]: any } = {};

    cpanelRes.compress = await FileOp({
      operation: "compress",
      sourceFiles,
      destFiles: "site.zip",
      metadata: "zip",
      doubleDecode: true,
    });

    const client = new Client();

    await client.access({
      host: process.env.CPANEL_FTP_HOST,
      user: process.env.CPANEL_USER,
      password: process.env.CPANEL_PASS,
    });

    const folderToCreate = path.slice(0, path.lastIndexOf("/"));

    await mkdir(folderToCreate, { recursive: true });
    stream = createWriteStream(path);

    await client.downloadTo(
      stream,
      cpanelRes.compress.cpanelresult.data[0].dest.slice(
        `/home/${cpanel.user}/`.length,
      ),
    );

    client.close();

    cpanelRes.remove = await FileOp({
      operation: "trash",
      sourceFiles: cpanelRes.compress.cpanelresult.data[0].dest,
      doubleDecode: true,
    });

    return ServerResponse({
      operation: true,
      message: dict.alerts.download_files.success,
      data: {
        uuid,
        link: `${process.env.NEXTAUTH_URL}${path.slice("public/".length)}`,
        local: path,
      },
    });
  } catch (error) {
    unlink(path, (err) => {
      if (err) {
        console.error(`Error al eliminar el archivo: ${err.message}`);
      } else {
        console.log(`Archivo eliminado: ${path}`);
      }
    });

    return ServerResponse({
      operation: false,
      message: dict.alerts.general.unexpected_error,
      data: error,
    });
  } finally {
    stream.end();
    if (permanent && permanent.toString() != "1") {
      setTimeout(async () => {
        await rm(baseDir, { recursive: true, force: true });
      }, 60 * 1000);
    }
    con.release();
  }
}
