"use client";

import { useState, useEffect, useCallback } from "react";
import {
  getStandardOptions,
  getTemplateOptions,
  getAuditStageOptions,
  getAuditorOptions,
  searchCompanies,
} from "@/lib/api/job.api";
import type { SelectOption } from "@/lib/api/types/job.types";

interface UseJobDropdownsReturn {
  standardOptions:   SelectOption[];
  templateOptions:   SelectOption[];
  auditStageOptions: SelectOption[];
  auditorOptions:    SelectOption[];
  loading:           boolean;
  // ✅ Async company search — debounced, returns options for AsyncSelect
  loadCompanyOptions: (inputValue: string) => Promise<SelectOption[]>;
}

export function useJobDropdowns(): UseJobDropdownsReturn {
  const [standardOptions,   setStandardOptions]   = useState<SelectOption[]>([]);
  const [templateOptions,   setTemplateOptions]   = useState<SelectOption[]>([]);
  const [auditStageOptions, setAuditStageOptions] = useState<SelectOption[]>([]);
  const [auditorOptions,    setAuditorOptions]    = useState<SelectOption[]>([]);
  const [loading,           setLoading]           = useState(true);

  useEffect(() => {
    let cancelled = false;

    async function load() {
      try {
        // Load all static dropdowns in parallel
        const [standards, templates, auditStages, auditors] = await Promise.all([
          getStandardOptions(),
          getTemplateOptions(),
          getAuditStageOptions(),
          getAuditorOptions(),
        ]);
        if (cancelled) return;
        setStandardOptions(standards);
        setTemplateOptions(templates);
        setAuditStageOptions(auditStages);
        setAuditorOptions(auditors);
      } catch (err) {
        console.error("[useJobDropdowns] Failed to load dropdowns:", err);
      } finally {
        if (!cancelled) setLoading(false);
      }
    }

    load();
    return () => { cancelled = true; };
  }, []);

  // ✅ AsyncSelect loader — called on every keystroke by react-select
  // Companies are NOT pre-loaded (7442 records) — always search
  const loadCompanyOptions = useCallback(
    async (inputValue: string): Promise<SelectOption[]> => {
      try {
        return await searchCompanies(inputValue, 50);
      } catch {
        return [];
      }
    },
    []
  );

  return {
    standardOptions,
    templateOptions,
    auditStageOptions,
    auditorOptions,
    loading,
    loadCompanyOptions,
  };
}
