"use client";

// 개발관리 PART 자동완성 셀렉트 — wace select2-part 1:1 (영업관리 PartSelect 패턴 동일).
//
// 영업관리 PartSelect 는 item_info(영업 마스터) 기반.
// 개발관리는 part_mng 기반이므로 별도 컴포넌트.
//
// - part_mng IS_LAST='1' 전체를 한 번 캐시 (objid 기준 단일 소스)
// - mode='partNo'  : 라벨로 part_no 표시
// - mode='partName': 라벨로 part_name 표시
// - 선택 시 onValueChange(part_no/part_name 텍스트, 원본 row) — ebom-search 가 LIKE 가 아닌
//   완전일치 검색을 하므로 value 는 텍스트 그대로 전달

import React, { useEffect, useState } from "react";
import { SmartSelect, SmartSelectOption } from "@/components/common/SmartSelect";
import { apiClient } from "@/lib/api/client";

interface DevPartRow {
  objid: string;
  part_no: string;
  part_name: string;
}

interface DevPartSelectProps {
  mode: "partNo" | "partName";
  /** 현재 선택값 — part_no 또는 part_name 텍스트 */
  value: string;
  /** 선택 시 텍스트 + 원본 row */
  onValueChange: (value: string, row?: DevPartRow) => void;
  placeholder?: string;
  disabled?: boolean;
  className?: string;
}

let cachedRows: DevPartRow[] | null = null;
let inflight: Promise<DevPartRow[]> | null = null;

const fetchParts = async (): Promise<DevPartRow[]> => {
  if (cachedRows) return cachedRows;
  if (inflight) return inflight;
  inflight = (async () => {
    const res = await apiClient.get("/development/part/options");
    const rows = (res.data?.data?.rows ?? []) as any[];
    cachedRows = rows
      .filter((r) => r.objid != null)
      .map((r) => ({
        objid: String(r.objid),
        part_no: r.part_no ?? "",
        part_name: r.part_name ?? "",
      }));
    return cachedRows!;
  })();
  try {
    return await inflight;
  } finally {
    inflight = null;
  }
};

const toOptions = (rows: DevPartRow[], mode: DevPartSelectProps["mode"]): SmartSelectOption[] => {
  const seen = new Set<string>();
  const result: SmartSelectOption[] = [];
  for (const r of rows) {
    const label = mode === "partNo" ? r.part_no : r.part_name;
    if (!label || seen.has(label)) continue;
    seen.add(label);
    result.push({ code: label, label });
  }
  return result;
};

export function DevPartSelect({
  mode, value, onValueChange,
  placeholder = mode === "partNo" ? "품번 입력하여 검색..." : "품명 입력하여 검색...",
  disabled, className,
}: DevPartSelectProps) {
  const [options, setOptions] = useState<SmartSelectOption[]>(
    cachedRows ? toOptions(cachedRows, mode) : [],
  );

  useEffect(() => {
    let alive = true;
    fetchParts()
      .then((rows) => { if (alive) setOptions(toOptions(rows, mode)); })
      .catch(() => {});
    return () => { alive = false; };
  }, [mode]);

  return (
    <SmartSelect
      options={options}
      value={value}
      onValueChange={(v) => {
        const row = cachedRows?.find((r) => (mode === "partNo" ? r.part_no : r.part_name) === v);
        onValueChange(v, row);
      }}
      placeholder={placeholder}
      disabled={disabled}
      className={className}
    />
  );
}
