"use server";

import { ServerAction, ServerRequest, ServerResponse } from "@/lib/actions";
import FileList from "@/lib/cpanel/api3/Fileman/listfiles";
import {  convertBytes } from "@/lib/utils";
import { getCpanelVars } from "@/models/cpanel";
import { ProjectFilesTree } from "@/models/projectFilesTree";

async function generateSubdomainFilesTree(dir: string, dict: Dictionary) {
  const result = await FileList({ dir });

  if (result.status === 0) {
    return ServerResponse({
      operation: false,
      message: dict.alerts.fetch_subdomain_files.error.get_subdirectories,
    });
  }

  const files: ProjectFilesTree[] = [];

  for (const file of result.data) {
    if (file.type === "dir") {
      const f = await ServerRequest<ProjectFilesTree>(
        generateSubdomainFilesTree(file.fullpath, dict),
      );

      if (!f.operation) {
        break;
      }

      files.push(f.data);
    } else {
      files.push({
        name: file.file,
        path: file.fullpath,
        size: convertBytes(parseInt(file.size)),
        type: file.type,
      });
    }
  }

  return ServerResponse({
    operation: true,
    data: {
      name: dir.split("/").pop()!,
      path: dir,
      children: files,
    },
  });
}

export default async function fetchSubdomainFiles(formData: FormData) {
  const { error, con, dict } = await ServerAction();

  if (error) {
    return ServerResponse({
      operation: false,
      data: error,
    });
  }

  const cpanel = getCpanelVars();
  const name = formData.get("name") as string;

  try {
    const tree = await ServerRequest<ProjectFilesTree>(
      generateSubdomainFilesTree(`/home/${cpanel.user}/FEDSITE_${name}`, dict),
    );

    if (!tree.operation) {
      return ServerResponse({
        operation: false,
        message: dict.alerts.fetch_subdomain_files.error.file_list,
      });
    }

    tree.data.children = tree.data.children?.filter(
      (item) => item.name !== "cgi-bin",
    );

    return ServerResponse(tree);
  } catch (error) {
    return ServerResponse({
      operation: false,
      message: dict.alerts.general.unexpected_error,
      data: error,
    });
  } finally {
    con.release();
  }
}
