import { useGlobal } from "@/context/global";
import { ConvertJSONToFormData, ServerRequest } from "@/lib/actions";
import { ProjectFilesTree } from "@/models/projectFilesTree";
import { makeProjectLink } from "@/services/download/makeprojectlink";
import downloadSubdomainFiles from "@/services/files/downloadSubdomainFiles";
import { socket } from "@/socket";
import dayjs from "dayjs";
import { useSession } from "next-auth/react";
import { useParams } from "next/navigation";
import { toast } from "sonner";

type UseDownloadProps = {
  treeState?: ProjectFilesTree[];
};
export default function useFilesManager({ treeState }: UseDownloadProps) {
  const { dict } = useGlobal();

  const params = useParams();
  const { data }: any = useSession();

  const handleDownloadFiles = async () => {
    const formData = ConvertJSONToFormData({
      name: params.name,
      files: JSON.stringify(treeState?.map((e) => e.path)),
    });

    const promise = new Promise(async (resolve, reject) => {
      const result = await ServerRequest<{ link: string }>(
        downloadSubdomainFiles(formData),
      );

      if (!result.operation) {
        return reject(result);
      }

      const link = document.createElement("a");
      link.href = result.data.link;

      document.body.appendChild(link);

      link.click();

      link.parentNode?.removeChild(link);
      window.URL.revokeObjectURL(result.data.link);

      return resolve(result);
    });

    toast.promise(promise, {
      loading: dict.alerts.download_files.loading,
      description: dayjs().format("MMM DD, YYYY HH:MM:ss"),
      success: ({ message }) => message,
      error: ({ message }) => message,
    });
  };

  const handleMakePublicLink = async () => {
    const promise = new Promise(async (resolve, reject) => {
      const formData = new FormData();

      formData.append("user", data.user.id as string);
      formData.append("name", params.name as string);
      formData.append("title", `Public download link for ${params.name}`);
      formData.append("files", JSON.stringify(treeState?.map((e) => e.path)));

      const result = await ServerRequest(makeProjectLink(formData));

      if (!result.operation) {
        return reject(result);
      }

      socket.emit("add-download-link", result.data);
      return resolve(result);
    });

    toast.promise(promise, {
      loading: dict.alerts.make_project_download_link.loading,
      description: dayjs().format("MMM DD, YYYY HH:MM:ss"),
      success: ({ message }: any) => message,
      error: ({ message }: any) => message,
    });
  };

  return { handleDownloadFiles, handleMakePublicLink };
}
