import { useRef, useState } from "react";
import { YearsData } from "@/dummyData/data";
import { useMutation, useQueryClient } from "@tanstack/react-query";
import { AxiosError } from "axios";
import { DialogMode } from "../types/experience.types";
import { CertificateFrom, CertificateType } from "@/type/profileType";
import {
  addCertificate,
  editCertificate,
  deleteCertificate,
} from "@/lib/services/profile.service";
import showCustomToast from "@/components/common/toaster/CustomToast";
import {
  mapFormToCertificationBody,
  mapItemToCertificationFormValues,
} from "../utils/certification.utils";

export function useCertificationSection() {
  const queryClient = useQueryClient();

  // ─── Dialog state ─────────────────────────────────────────────────────────
  const [isDialogOpen, setIsDialogOpen] = useState(false);
  const [defaultValues, setDefaultValues] = useState<
    CertificateType[] | undefined
  >(undefined);

  // ─── Refs ─────────────────────────────────────────────────────────────────
  const modeRef = useRef<DialogMode>("add");
  const editingIdRef = useRef<string | undefined>(undefined);

  // ─── Mutation ─────────────────────────────────────────────────────────────
  const { mutate, isPending } = useMutation<
    { message: string },
    AxiosError<{ message: string }>,
    CertificateFrom
  >({
    mutationFn: (body) =>
      modeRef.current === "edit" && editingIdRef.current
        ? editCertificate(editingIdRef.current, body)
        : addCertificate(body),
    onMutate: async (newBody) => {
      await queryClient.cancelQueries({ queryKey: ["profile"] });
      const previousProfile = queryClient.getQueryData(["profile"]);

      queryClient.setQueryData(["profile"], (old: any) => {
        if (!old) return old;
        const certificates = [...(old.data.certificates || [])];

        if (modeRef.current === "edit" && editingIdRef.current) {
          const index = certificates.findIndex(
            (c: any) => c.uuid === editingIdRef.current,
          );
          if (index !== -1) {
            certificates[index] = {
              ...certificates[index],
              ...newBody,
              issue_date: newBody.issue_year,
            };
          }
        } else {
          // Add optimistic item
          certificates.unshift({
            ...newBody,
            uuid: "temp-" + Date.now(),
            issue_date: newBody.issue_year, // Set issue_date for display mapping
          });
        }

        return {
          ...old,
          data: { ...old.data, certificates },
        };
      });

      return { previousProfile };
    },
    onSuccess: (data) => {
      showCustomToast({ type: "success", message: data.message });
      closeDialog();
    },
    onError: (error, _, context: any) => {
      queryClient.setQueryData(["profile"], context.previousProfile);
      showCustomToast({
        type: "error",
        message: error.response?.data?.message ?? "Something went wrong",
      });
    },
    onSettled: () => {
      queryClient.invalidateQueries({ queryKey: ["profile"] });
    },
  });

  const { mutate: deleteMutate } = useMutation({
    mutationFn: deleteCertificate,
    onMutate: async (uuid) => {
      await queryClient.cancelQueries({ queryKey: ["profile"] });
      const previousProfile = queryClient.getQueryData(["profile"]);
      queryClient.setQueryData(["profile"], (old: any) => {
        if (!old) return old;
        return {
          ...old,
          data: {
            ...old.data,
            certificates: (old.data.certificates || []).filter(
              (cert: any) => cert.uuid !== uuid,
            ),
          },
        };
      });
      return { previousProfile };
    },
    onSuccess: () => {
      showCustomToast({ type: "success", message: "Certificate deleted" });
    },
    onError: (err, uuid, context: any) => {
      queryClient.setQueryData(["profile"], context.previousProfile);
      showCustomToast({
        type: "error",
        message: "Failed to delete certificate",
      });
    },
    onSettled: () => {
      queryClient.invalidateQueries({ queryKey: ["profile"] });
    },
  });

  // ─── Handlers ─────────────────────────────────────────────────────────────
  const openAddDialog = () => {
    modeRef.current = "add";
    editingIdRef.current = undefined;
    setDefaultValues(undefined);
    setIsDialogOpen(true);
  };

  const openEditDialog = (item: any) => {
    console.log("-----------------item", item);

    modeRef.current = "edit";
    editingIdRef.current = item.id || item.uuid;
    setDefaultValues([mapItemToCertificationFormValues(item)]);
    setIsDialogOpen(true);
  };

  const closeDialog = () => {
    setIsDialogOpen(false);
    setDefaultValues(undefined);
  };

  const handleSubmit = (data: { certificates: CertificateType[] }) => {
    const body = mapFormToCertificationBody(
      data.certificates[0],
      editingIdRef.current,
    );
    mutate(body as any);
  };

  return {
    isDialogOpen,
    defaultValues,
    isPending,
    isEditing: modeRef.current === "edit",
    openAddDialog,
    openEditDialog,
    closeDialog,
    handleSubmit,
    deleteCertificate: deleteMutate,
    yearsOptions: YearsData,
  };
}
