import { useMemo } from "react";
import { useQuery } from "@tanstack/react-query";
import { MappedSkill, SkillsApiResponse } from "../types/skills.type";
import {
  getLanguages,
  getProfile,
  getProfileLanguages,
  getSkills,
} from "@/lib/services/profile.service";
import { mapSkills } from "@/lib/utils";

interface UseSkillsDataReturn {
  // Options for CustomTextbox dropdowns
  softSkills: MappedSkill[];
  toolSkills: MappedSkill[];
  languageSkills: MappedSkill[];

  // Raw profile skills (used to seed form via setValue)
  profileSoftSkills: MappedSkill[];
  profileToolSkills: MappedSkill[];
  profileLanguageSkills: any[]; // Changed to support proficiency

  isLoading: boolean;
  isError: boolean;
}

/**
 * Owns all READ queries for the skills section.
 */
export function useSkillsData(): UseSkillsDataReturn {
  const profileQuery = useQuery({
    queryKey: ["profile"],
    queryFn: getProfile,
    staleTime: 5 * 60 * 1000,
  });

  const skillsQuery = useQuery({
    queryKey: ["skills"],
    queryFn: getSkills,
    staleTime: 10 * 60 * 1000,
  });

  const languagesQuery = useQuery({
    queryKey: ["languages-list"],
    queryFn: getLanguages,
    staleTime: 30 * 60 * 1000, // Languages don't change often
  });

  const profileLanguagesQuery = useQuery({
    queryKey: ["profile-languages"],
    queryFn: getProfileLanguages,
  });

  const catalogue = skillsQuery.data?.data as SkillsApiResponse | undefined;

  // ─── Available catalogue options ──────────────────────────────────────────
  const softSkills = useMemo(
    () => mapSkills(catalogue?.soft),
    [catalogue?.soft],
  );
  const toolSkills = useMemo(
    () => mapSkills(catalogue?.tool || (catalogue as any)?.tools),
    [catalogue?.tool, (catalogue as any)?.tools],
  );

  // Available languages from the new dedicated endpoint
  const languageSkills = useMemo(() => {
    const rawLanguages = languagesQuery.data?.data || [];
    return rawLanguages.map((l: any) => ({
      id: l.uuid,
      uuid: l.uuid,
      label: l.name,
    }));
  }, [languagesQuery.data?.data]);

  // ─── User's saved skills ─────────────────────
  const savedSkills = profileQuery.data?.data?.skills;

  const profileSoftSkills = useMemo(
    () => mapSkills(savedSkills?.soft),
    [savedSkills?.soft],
  );
  const profileToolSkills = useMemo(
    () => mapSkills(savedSkills?.tool || (savedSkills as any)?.tools),
    [savedSkills?.tool, (savedSkills as any)?.tools],
  );

  // User's languages from the dedicated profile languages endpoint
  const profileLanguageSkills = useMemo(() => {
    const rawProfileLanguages = profileLanguagesQuery.data?.data || [];
    return rawProfileLanguages.map((l: any) => ({
      id: l.uuid, // This is the profile_language record UUID
      language_uuid: l.language_uuid,
      label: l.language_name,
      proficiency: l.proficiency || "1", // Default to 1 star if empty
    }));
  }, [profileLanguagesQuery.data?.data]);

  return {
    softSkills,
    toolSkills,
    languageSkills,
    profileSoftSkills,
    profileToolSkills,
    profileLanguageSkills,
    isLoading:
      profileQuery.isLoading ||
      skillsQuery.isLoading ||
      languagesQuery.isLoading ||
      profileLanguagesQuery.isLoading,
    isError:
      profileQuery.isError ||
      skillsQuery.isError ||
      languagesQuery.isError ||
      profileLanguagesQuery.isError,
  };
}
