"use client";

/**
 * useDbTables — DB 테이블 목록을 mount 시 한 번 로드하고, CPSelect 옵션 형식으로 제공
 *
 * Codex 검토 (2026-04-28) 권장:
 *  - normalize 기본값은 hook 안에 둠 (snake/camel 모두 흡수)
 *  - 호출처가 다른 우선순위 / 라벨을 원하면 opts.normalize 로 override
 *
 * 사용처: search / table / stats InvXxxConfigPanel (3 패널)
 *  - 모두 같은 useEffect + useMemo 패턴 중복이었음 → hook 으로 통합
 */

import { useState, useEffect, useMemo } from "react";

export interface UseDbTablesOptions {
  fallback?: any[];
  normalize?: (t: any) => { value: string; label: string };
}

export interface UseDbTablesResult {
  tables: any[];
  options: { value: string; label: string }[];
  loading: boolean;
}

const defaultNormalize = (t: any): { value: string; label: string } => ({
  value: t.tableName || t.table_name || "",
  label:
    t.display_name ||
    t.tableLabel ||
    t.table_label ||
    t.tableName ||
    t.table_name ||
    "",
});

export function useDbTables(opts: UseDbTablesOptions = {}): UseDbTablesResult {
  const { fallback, normalize = defaultNormalize } = opts;

  const [allDbTables, setAllDbTables] = useState<any[]>([]);
  const [loading, setLoading] = useState(true);

  useEffect(() => {
    let cancelled = false;
    (async () => {
      try {
        const { tableManagementApi } = await import("@/lib/api/tableManagement");
        const res = await tableManagementApi.getTableList();
        if (!cancelled && res.success && res.data) setAllDbTables(res.data);
      } catch {
        /* ignore */
      } finally {
        if (!cancelled) setLoading(false);
      }
    })();
    return () => {
      cancelled = true;
    };
  }, []);

  const tables = useMemo<any[]>(
    () => (allDbTables.length > 0 ? allDbTables : fallback || []),
    [allDbTables, fallback],
  );

  const options = useMemo(
    () => tables.map(normalize).filter((o) => o.value),
    [tables, normalize],
  );

  return { tables, options, loading };
}
