import { isInvalid } from "@/components/TableBuilder/util/data";
import { ProjectStatusMap } from "@/models/projects/statusMap";
import { socket } from "@/socket";
import { useEffect } from "react";

type Props = {
  list: ProjectsData;
  setList: React.Dispatch<React.SetStateAction<ProjectsData>>;
  fetchData: () => void;
};

export const useProjectSocket = ({ list, setList, fetchData }: Props) => {
  const onAddProject = ({
    name,
    email,
    ready,
  }: ProjectData & { ready: boolean }) => {
    // setList((prev) => {
    //   const copy = prev === "empty" ? [] : (prev as ProjectData[]);

    //   const newProject: ProjectData = {
    //     name,
    //     email,
    //     sslRedirect: null,
    //     redirectsTo: "not redirected",
    //     status: ready ? ProjectStatusMap.SENDED : ProjectStatusMap.PENDING,
    //   };

    //   return [...copy, newProject] as ProjectData[];
    // });

    fetchData();
  };

  const onDeleteProject = ({ name }: ProjectData) => {
    // setList((prev) => {
    //   const copy = prev === "empty" ? [] : (prev as ProjectData[]);

    //   const projectIndex = copy.findIndex((p) => p.name === name);

    //   return [
    //     ...copy.slice(0, projectIndex),
    //     ...copy.slice(projectIndex + 1),
    //   ] as ProjectData[];
    // });

    fetchData();
  };

  const onToggleProjectStatus = ({ name, redirectsTo }: ProjectData) => {
    setList((prev) => {
      if (isInvalid(prev)) return prev;

      const copy = [...(prev as ProjectData[])];

      const index = copy.findIndex((p) => p.name === name);

      if (index === -1) return prev;

      const updatedProject: ProjectData = {
        ...copy[index],
        redirectsTo: redirectsTo,
      };

      return [
        ...prev.slice(0, index),
        updatedProject,
        ...prev.slice(index + 1),
      ] as ProjectData[];
    });
  };

  const onToggleProjectSecureRedirect = ({
    name,
    sslRedirect,
  }: ProjectData) => {
    setList((prev) => {
      const copy = [...(prev as ProjectData[])];

      const index = copy.findIndex((p) => p.name === name);

      if (index === -1) return prev;

      const updatedProject: ProjectData = {
        ...copy[index],
      };

      updatedProject.sslRedirect = sslRedirect ? 0 : 1;

      return [
        ...prev.slice(0, index),
        updatedProject,
        ...prev.slice(index + 1),
      ] as ProjectData[];
    });
  };

  const onSendToPlatform = ({ name }: ProjectData) => {
    setList((prev) => {
      const copy = [...(prev as ProjectData[])];

      const index = copy.findIndex((p) => p.name === name);

      if (index === -1) return prev;

      const updatedProject: ProjectData = {
        ...copy[index],
        status: ProjectStatusMap.SENDED,
      };

      return [
        ...prev.slice(0, index),
        updatedProject,
        ...prev.slice(index + 1),
      ] as ProjectData[];
    });
  };

  const onCloseNote = ({ domain }) => {
    let isNotesEmpty = false;

    setList((prev) => {
      const copy = [...(prev as ProjectData[])];

      const index = copy.findIndex((p) => p.name === domain);

      if (index === -1) return prev;

      const updatedProject: ProjectData = {
        ...copy[index],
        notes: copy[index].notes - 1,
      };

      if (updatedProject.notes === 0) {
        isNotesEmpty = true;
      }

      return [
        ...prev.slice(0, index),
        updatedProject,
        ...prev.slice(index + 1),
      ] as ProjectData[];
    });

    if (isNotesEmpty) {
      fetchData();
    }
  };

  useEffect(() => {
    socket.on("add-project", onAddProject);
    socket.on("delete-project", onDeleteProject);
    socket.on("toggle-project-status", onToggleProjectStatus);
    socket.on(
      "toggle-project-secure-redirection",
      onToggleProjectSecureRedirect,
    );
    socket.on("send-to-platform", onSendToPlatform);

    socket.on("close-note", onCloseNote);

    return () => {
      socket.off("add-project", onAddProject);
      socket.off("delete-project", onDeleteProject);
      socket.off("toggle-project-status", onToggleProjectStatus);
      socket.off(
        "toggle-project-secure-redirection",
        onToggleProjectSecureRedirect,
      );

      socket.off("send-to-platform", onSendToPlatform);

      socket.off("close-note", onCloseNote);
    };
  }, []);
};
