/**
 * 백엔드 입력 타입 정의 (테이블 타입 관리 개선)
 * 프론트엔드와 동일한 8개 핵심 입력 타입 정의
 */

// 8개 핵심 입력 타입 (프론트엔드와 동일)
export type InputType =
  | "text" // 텍스트
  | "number" // 숫자
  | "date" // 날짜
  | "code" // 코드
  | "entity" // 엔티티
  | "select" // 선택박스
  | "checkbox" // 체크박스
  | "radio"; // 라디오버튼

// 입력 타입 옵션 정의
export interface InputTypeOption {
  value: InputType;
  label: string;
  description: string;
  category: "basic" | "reference" | "selection";
}

// 입력 타입 옵션 목록
export const INPUT_TYPE_OPTIONS: InputTypeOption[] = [
  {
    value: "text",
    label: "텍스트",
    description: "일반 텍스트 입력",
    category: "basic",
  },
  {
    value: "number",
    label: "숫자",
    description: "숫자 입력 (정수/소수)",
    category: "basic",
  },
  { value: "date", label: "날짜", description: "날짜 선택", category: "basic" },
  {
    value: "code",
    label: "코드",
    description: "공통코드 참조",
    category: "reference",
  },
  {
    value: "entity",
    label: "엔티티",
    description: "다른 테이블 참조",
    category: "reference",
  },
  {
    value: "select",
    label: "선택박스",
    description: "드롭다운 선택",
    category: "selection",
  },
  {
    value: "checkbox",
    label: "체크박스",
    description: "체크박스 입력",
    category: "selection",
  },
  {
    value: "radio",
    label: "라디오버튼",
    description: "단일 선택",
    category: "selection",
  },
];

// 입력 타입 검증 함수
export const isValidInputType = (inputType: string): inputType is InputType => {
  return INPUT_TYPE_OPTIONS.some((option) => option.value === inputType);
};

// 레거시 웹 타입 → 입력 타입 매핑
export const WEB_TYPE_TO_INPUT_TYPE: Record<string, InputType> = {
  // 텍스트 관련
  text: "text",
  textarea: "text",
  email: "text",
  tel: "text",
  url: "text",
  password: "text",

  // 숫자 관련
  number: "number",
  decimal: "number",

  // 날짜 관련
  date: "date",
  datetime: "date",
  time: "date",

  // 선택 관련
  select: "select",
  dropdown: "select",
  checkbox: "checkbox",
  boolean: "checkbox",
  radio: "radio",

  // 참조 관련
  code: "code",
  entity: "entity",

  // 기타 (기본값: text)
  file: "text",
  button: "text",
};

// 입력 타입 변환 함수
export const convertWebTypeToInputType = (webType: string): InputType => {
  return WEB_TYPE_TO_INPUT_TYPE[webType] || "text";
};
