import { useState } from "react";
import { useMutation, useQuery, useQueryClient } from "@tanstack/react-query";
import { AxiosError } from "axios";

import showCustomToast from "@/components/common/toaster/CustomToast";
import { getExpertise } from "@/lib/services/expertise.services";
import { ExpertiseOptionType } from "@/type/checkboxType";
import { APIResponseType } from "@/type/comonType";
import { ProfileDataType } from "@/type/userType";
import { editProfile } from "@/lib/services/profile.service";

export function useExpertiseSection(currentExpertiseUuids: string[]) {
  const queryClient = useQueryClient();

  // ─── Dialog state ─────────────────────────────────────────────────────────
  const [isDialogOpen, setIsDialogOpen] = useState(false);
  const [isEdit, setIsEdit] = useState(false);

  // ─── Expertise options query ──────────────────────────────────────────────
  const { data: expertiseResponse } = useQuery<
    APIResponseType<ExpertiseOptionType[]>
  >({
    queryKey: ["expertise"],
    queryFn: getExpertise,
  });

  // ─── Mutation ─────────────────────────────────────────────────────────────
  const { mutate, isPending } = useMutation<
    APIResponseType<unknown>,
    AxiosError<{ message: string }>,
    Partial<ProfileDataType>
  >({
    mutationFn: editProfile as any,
    onMutate: async (newProfileData) => {
      await queryClient.cancelQueries({ queryKey: ["profile"] });
      const previousProfile = queryClient.getQueryData(["profile"]);

      queryClient.setQueryData(["profile"], (old: any) => {
        if (!old) return old;
        const newExpertiseUuids = newProfileData.expertise_uuids;
        if (!newExpertiseUuids) return old;

        const allExpertiseOptions = expertiseResponse?.data ?? [];
        const updatedExpertises = newExpertiseUuids.map((uuid) => {
          const found = (old.data.expertises || []).find((e: any) => e.uuid === uuid);
          if (found) return found;
          const option = allExpertiseOptions.find((o) => o.uuid === uuid);
          return {
            uuid,
            id: option?.id || uuid,
            name: option?.name || "Loading...",
          };
        });

        return {
          ...old,
          data: {
            ...old.data,
            expertises: updatedExpertises,
          },
        };
      });

      return { previousProfile };
    },
    onSuccess: (data) => {
      showCustomToast({ type: "success", message: data.message });
      setIsDialogOpen(false);
    },
    onError: (error, _, context: any) => {
      if (context?.previousProfile) {
        queryClient.setQueryData(["profile"], context.previousProfile);
      }
      showCustomToast({
        type: "error",
        message: error.response?.data?.message || "Something went wrong",
      });
    },
    onSettled: () => {
      queryClient.invalidateQueries({ queryKey: ["profile"] });
    },
  });
  // ─── Handlers ─────────────────────────────────────────────────────────────
  const openDialog = () => setIsDialogOpen(true);
  const closeDialog = () => setIsDialogOpen(false);

  const handleSubmit = (data: any) => {
    const expertiseIds =
      data?.expertise?.flatMap((item: any) => item.father_name ?? []) ?? [];

    if (!expertiseIds.length) return;
    mutate({ expertise_uuids: expertiseIds });
  };

  const deleteExpertise = (uuidToDelete: string) => {
    const newUuids = currentExpertiseUuids.filter(
      (uuid) => uuid !== uuidToDelete,
    );
    mutate({ expertise_uuids: newUuids });
  };

  // ─── Default values: pre-select already saved expertises ──────────────────
  // Maps current saved uuids → the { father_name: uuid[] } shape CustomDialog expects
  const defaultValues =
    currentExpertiseUuids.length > 0
      ? {
          expertise: [{ father_name: currentExpertiseUuids }],
        }
      : undefined;

  const isEditingToggle = () => {
    setIsEdit((prev) => !prev); // ✅ always works off the latest value
    console.log(isEdit);
  };

  return {
    isDialogOpen,
    isPending,
    expertiseOptions: expertiseResponse?.data ?? [],
    defaultValues, // ✅ pre-fills saved selections on open
    openDialog,
    isEditingToggle,
    isEdit,
    closeDialog,
    handleSubmit,
    deleteExpertise,
  };
}
