import React from "react";
import { FormBuilder } from "@/components/FormBuilder";
import { FormCard, FormContent } from "@/components/FormCard";
import { Form } from "@/components/ui/form";
import { useGlobal } from "@/context/global";
import { ServerRequest } from "@/lib/actions";
import { getRenameFileFormFields } from "@/models/files";
import { ProjectFilesTree } from "@/models/projectFilesTree";
import {
  getRenameFileSchema,
  RenameFileSchema,
} from "@/schemas/files/_renameFile";
import renameSubdomainFiles from "@/services/files/renameSubdomainFile";
import { faFileSignature } from "@fortawesome/free-solid-svg-icons";
import { zodResolver } from "@hookform/resolvers/zod";
import { useParams } from "next/navigation";
import { useEffect, useTransition } from "react";
import { useForm } from "react-hook-form";
import { toast } from "sonner";

type SelectedProjectRenameItemFormProps = {
  item: ProjectFilesTree;
  sendSignal: React.Dispatch<React.SetStateAction<boolean>>;
};
export default function SelectedProjectRenameItemForm({
  item,
  sendSignal,
}: SelectedProjectRenameItemFormProps) {
  const { dict, closeModal } = useGlobal();

  const params = useParams();

  const [isPending, startTransition] = useTransition();

  const form = useForm<RenameFileSchema>({
    resolver: zodResolver(getRenameFileSchema()),
    mode: "onChange",
    defaultValues: {
      name: item.name,
      path: "",
    },
  });

  const onSubmit = async (values: RenameFileSchema) => {
    startTransition(() => {
      const promise = new Promise(async (resolve, reject) => {
        const formData = new FormData();
        formData.append("name", values.name);
        formData.append("path", values.path);
        formData.append("sysPath", item.path);
        formData.append("project", params.name as string);

        const result = await ServerRequest(renameSubdomainFiles(formData));

        if (!result.operation) {
          return reject(result);
        }

        return resolve(result);
      });

      toast.promise(promise, {
        loading: dict.alerts.rename_file.loading,
        success: ({ message }: any) => {
          closeModal("rename-project-file");
          sendSignal((prev) => !prev);
          return message;
        },
        error: ({ message }: any) => message,
      });
    });
  };

  useEffect(() => {
    let path = "";
    path = item.path.slice(`/home/fedgovad/FEDSITE_${params.name}/`.length);
    path = path.slice(0, -item.name.length - 1);

    form.setValue("path", path);

    return () => {
      form.reset();
    };
  }, []);

  return (
    <FormCard>
      <FormContent
        title={dict.pages.project_files.forms.rename_file.title}
        icon={faFileSignature}
      >
        <Form {...form}>
          <form onSubmit={form.handleSubmit(onSubmit)}>
            <FormBuilder
              form={form}
              elements={getRenameFileFormFields({
                closeModal,
                isPending,
                dict,
              })}
              upperLabel
            />
          </form>
        </Form>
      </FormContent>
    </FormCard>
  );
}
