"use client";

import { createContext, useContext, useState, type ReactNode } from "react";
import type { OpenPositionResolved } from "@/lib/positions";
import { HireWizard } from "./HireWizard";

type Location = { id: string; name: string; country: string };
type HireDraft = { id: string; step: number; payload: Record<string, unknown> };

type OpenWizardOptions = { draftId?: string; positionId?: string };

type HireWizardContextValue = {
  openWizard: (options?: OpenWizardOptions) => void;
};

const HireWizardContext = createContext<HireWizardContextValue | null>(null);

export function HireWizardProvider({
  children,
  openPositions,
  locations,
  drafts,
}: {
  children: ReactNode;
  openPositions: OpenPositionResolved[];
  locations: Location[];
  drafts: HireDraft[];
}) {
  const [open, setOpen] = useState(false);
  const [resumeDraft, setResumeDraft] = useState<HireDraft | null>(null);
  const [initialPositionId, setInitialPositionId] = useState<string | undefined>(undefined);
  // Forces HireWizard to remount fresh each time it's opened, so its
  // internal draft/step state is (re-)initialized directly from the current
  // resumeDraft/initialPositionId props at mount time — no reset-on-open
  // effect needed inside HireWizard itself.
  const [openKey, setOpenKey] = useState(0);

  function openWizard(options?: OpenWizardOptions) {
    setResumeDraft(options?.draftId ? (drafts.find((d) => d.id === options.draftId) ?? null) : null);
    setInitialPositionId(options?.positionId);
    setOpen(true);
    setOpenKey((k) => k + 1);
  }

  return (
    <HireWizardContext.Provider value={{ openWizard }}>
      {children}
      <HireWizard
        key={openKey}
        open={open}
        onClose={() => setOpen(false)}
        openPositions={openPositions}
        locations={locations}
        resumeDraft={resumeDraft}
        initialPositionId={initialPositionId}
      />
    </HireWizardContext.Provider>
  );
}

export function useHireWizard(): HireWizardContextValue {
  const ctx = useContext(HireWizardContext);
  if (!ctx) throw new Error("useHireWizard must be used within a HireWizardProvider");
  return ctx;
}
