/**
 * 테이블 타입 관리 페이지 공통 타입
 * page.tsx에서 추출한 인터페이스 및 타입별 색상/그룹 유틸
 */

import {
  AlignLeft,
  Braces,
  Calendar,
  CheckSquare,
  ChevronDown,
  CircleDot,
  FolderTree,
  Hash,
  HelpCircle,
  Image as ImageIcon,
  Link2,
  ListOrdered,
  Paperclip,
  Type,
  type LucideIcon,
} from "lucide-react";
import { USER_SELECTABLE_INPUT_TYPE_ORDER } from "@/types/input-types";

export interface TableInfo {
  table_name: string;
  display_name: string;
  description: string;
  column_count: number;
}

export interface ColumnTypeInfo {
  column_name: string;
  display_name: string;
  input_type: string;
  detail_settings: string;
  description: string;
  is_nullable: string;
  is_unique: string;
  default_value?: string;
  max_length?: number;
  numeric_precision?: number;
  numeric_scale?: number;
  code_info?: string;
  code_value?: string;
  reference_table?: string;
  reference_column?: string;
  display_column?: string;
  category_menus?: number[];
  hierarchy_role?: "large" | "medium" | "small";
  numbering_rule_id?: string;
  category_ref?: string | null;
}

export interface SecondLevelMenu {
  menu_objid: number;
  menu_name: string;
  parent_menu_name: string;
  screen_code?: string;
}

/** 컬럼 그룹 분류 */
export type ColumnGroup = "basic" | "reference" | "meta";

/** 타입별 색상 매핑 (다크모드 호환 레이어 사용) */
export interface TypeColorConfig {
  color: string;
  bgColor: string;
  barColor: string;
  label: string;
  desc: string;
  Icon: LucideIcon;
}

/** Legacy/알 수 없는 타입용 fallback config */
export const FALLBACK_TYPE_CONFIG: TypeColorConfig = {
  color: "text-muted-foreground",
  bgColor: "bg-muted",
  barColor: "bg-muted",
  label: "Legacy",
  desc: "구버전 타입",
  Icon: HelpCircle,
};

/** 입력 타입별 색상 맵 - Icon 은 lucide 컴포넌트로 통일 (letter/symbol/emoji 혼재 방지) */
export const INPUT_TYPE_COLORS: Record<string, TypeColorConfig> = {
  text:      { color: "text-slate-600",   bgColor: "bg-slate-50",   barColor: "bg-slate-400",   label: "텍스트",      desc: "일반 텍스트 입력",   Icon: Type },
  number:    { color: "text-indigo-600",  bgColor: "bg-indigo-50",  barColor: "bg-indigo-500",  label: "숫자",        desc: "숫자만 입력",         Icon: Hash },
  date:      { color: "text-amber-600",   bgColor: "bg-amber-50",   barColor: "bg-amber-500",   label: "날짜",        desc: "날짜 선택",           Icon: Calendar },
  code:      { color: "text-emerald-600", bgColor: "bg-emerald-50", barColor: "bg-emerald-500", label: "코드",        desc: "공통코드 선택",       Icon: Braces },
  entity:    { color: "text-violet-600",  bgColor: "bg-violet-50",  barColor: "bg-violet-500",  label: "테이블 참조", desc: "다른 테이블 연결",   Icon: Link2 },
  select:    { color: "text-cyan-600",    bgColor: "bg-cyan-50",    barColor: "bg-cyan-500",    label: "셀렉트",      desc: "직접 옵션 선택",      Icon: ChevronDown },
  checkbox:  { color: "text-pink-600",    bgColor: "bg-pink-50",    barColor: "bg-pink-500",    label: "체크박스",    desc: "예/아니오 선택",      Icon: CheckSquare },
  numbering: { color: "text-orange-600",  bgColor: "bg-orange-50",  barColor: "bg-orange-500",  label: "채번",        desc: "자동 번호 생성",     Icon: ListOrdered },
  category:  { color: "text-teal-600",    bgColor: "bg-teal-50",    barColor: "bg-teal-500",    label: "카테고리",    desc: "등록된 선택지",       Icon: FolderTree },
  textarea:  { color: "text-indigo-600",  bgColor: "bg-indigo-50",  barColor: "bg-indigo-400",  label: "여러 줄",     desc: "긴 텍스트 입력",      Icon: AlignLeft },
  radio:     { color: "text-rose-600",    bgColor: "bg-rose-50",    barColor: "bg-rose-500",    label: "라디오",      desc: "하나만 선택",         Icon: CircleDot },
  file:      { color: "text-amber-600",   bgColor: "bg-amber-50",   barColor: "bg-amber-500",   label: "파일",        desc: "파일 업로드",         Icon: Paperclip },
  image:     { color: "text-sky-600",     bgColor: "bg-sky-50",     barColor: "bg-sky-500",     label: "이미지",      desc: "이미지 표시",         Icon: ImageIcon },
};

/** v3.2 — 사용자 선택 가능한 8개 입력 타입 색상 맵 (T2 드롭다운/카드 그리드용) */
export const USER_SELECTABLE_INPUT_TYPE_COLORS = USER_SELECTABLE_INPUT_TYPE_ORDER.reduce(
  (acc, key) => {
    if (INPUT_TYPE_COLORS[key]) acc[key] = INPUT_TYPE_COLORS[key];
    return acc;
  },
  {} as Record<string, TypeColorConfig>,
);

/** 컬럼 그룹 판별 — 시스템 자동 생성 컬럼은 meta 로 분류 (사용자가 거의 수정하지 않으므로 시각 분리) */
export function getColumnGroup(col: ColumnTypeInfo): ColumnGroup {
  // 시스템 컬럼: invyone 자동 생성 (id/날짜/작성자/회사) 외에 VEX 계승 (objid), 멀티테넌트 (tenant_id),
  // 수정자/생성자 변형 (creator/modifier/created_at/updated_at) 까지 모두 포함
  const metaCols = [
    "id",
    "objid",
    "tenant_id",
    "created_date",
    "updated_date",
    "created_at",
    "updated_at",
    "writer",
    "creator",
    "modifier",
    "company_code",
  ];
  if (metaCols.includes(col.column_name)) return "meta";
  if (["entity", "code", "category"].includes(col.input_type)) return "reference";
  return "basic";
}
