"use client";

import { ComponentConfig } from "@/types/component";
import type { FieldRef, FieldOption } from "@/types/invyone-component";

/**
 * Input 컴포넌트 통합 설정 타입
 *
 * 20+ 개의 기존 입력 계열 컴포넌트를 통합한 **범용 필드 입력**. FieldConfig.type
 * 과 완전히 호환되어, 화면 수준 `fields: FieldConfig[]` 가 각 Input 컴포넌트에
 * 그대로 흘러가도록 설계.
 *
 * 흡수 대상 (20+, 폴더 삭제 완료):
 *   v2 입력/선택 (Phase D.2) · v2-category-manager · v2-file-upload · v2-media ·
 *   v2-numbering-rule · entity-search-input · v2-location-swap-selector ·
 *   Phase D.7 의 슬라이더 · Phase E 의 기본 입력 6종 (텍스트/숫자/날짜/셀렉트/
 *   체크박스/textarea) · Phase F.1 의 radio-basic / toggle-switch ·
 *   Phase F.2 의 test-input · file-upload · image-display · image-widget.
 *   (selected-items-detail-input 은 explicit 컴포넌트로 별도 유지.)
 *
 * 날짜/시간 (date / datetime / time / daterange) 은 InputFieldType 4종으로 통합되어
 * SingleDatePicker / DateTimePicker / TimePicker / RangeDatePicker 가 직접 렌더한다
 * (lib/registry/components/input/pickers.tsx).
 */

export type InputFieldType =
  | "text"       // 일반 문자열
  | "number"     // 숫자
  | "date"       // 날짜
  | "datetime"   // 날짜+시간
  | "time"       // 시간만
  | "daterange"  // 기간 (시작 ~ 끝)
  | "select"     // 드롭다운
  | "entity"     // FK 참조 (팝업 검색)
  | "checkbox"   // 체크박스
  | "textarea"   // 장문
  | "file"       // 파일 첨부
  | "code";      // 자동채번 (readonly)

export interface InputConfig extends ComponentConfig {
  /** 필드 타입 (렌더링 방식 결정) */
  type?: InputFieldType;
  /** 라벨 (상단 표시) */
  label?: string;
  /** placeholder / 기본 안내 텍스트 */
  placeholder?: string;
  /** 도움말 텍스트 (하단) */
  helperText?: string;
  /** 기본값 */
  defaultValue?: unknown;
  /** 필수 입력 여부 */
  required?: boolean;
  /** 편집 가능 여부 (false 면 readonly) */
  editable?: boolean;
  /** 읽기 전용 (editable 과 동의; editable 우선) */
  readonly?: boolean;
  /** 비활성화 */
  disabled?: boolean;

  // ─── 타입별 확장 ────────────────────────────────────────────────

  /** select 타입: 선택지. FieldOption 과 호환. */
  options?: FieldOption[];
  /** entity 타입: FK 참조 정보 */
  ref?: FieldRef;
  /** 포맷 문자열 (number: '#,##0', date: 'YYYY-MM-DD') */
  format?: string;
  /** 자동 계산 수식 (computed) */
  computed?: string;

  // ─── number / slider ────────────────────────────────────────────

  /** 최소값 */
  min?: number;
  /** 최대값 */
  max?: number;
  /** 증감 단위 */
  step?: number;

  // ─── text / textarea ────────────────────────────────────────────

  /** 최소 길이 */
  minLength?: number;
  /** 최대 길이 */
  maxLength?: number;
  /** textarea 줄 수. 기본 3 */
  rows?: number;
  /**
   * 입력 마스크 패턴. `#`/`0` = 숫자, `A` = 영문, `*` = 임의 문자, 그 외는 literal.
   * 예: `###-####`, `010-####-####`, `####-****-****-####`
   */
  mask?: string;

  // ─── file ────────────────────────────────────────────────────────

  /** 파일 허용 확장자. 예: "image/*", ".pdf,.doc" */
  accept?: string;
  /** 다중 선택 */
  multiple?: boolean;
  /** 최대 파일 개수 (multiple=true 일 때만 유의). 미지정 시 무제한 */
  maxFiles?: number;
  /** image/* 또는 explicit 옵션일 때 미리보기 thumbnail 노출 */
  showPreview?: boolean;

  // ─── date / datetime / time / daterange ─────────────────────────

  /** 표시 형식. 기본: date="YYYY-MM-DD" / datetime="YYYY-MM-DD HH:mm" / time="HH:mm" */
  dateFormat?: string;
  /** 선택 가능한 최소 날짜 (YYYY-MM-DD). 비우면 제한 없음 */
  minDate?: string;
  /** 선택 가능한 최대 날짜 (YYYY-MM-DD) */
  maxDate?: string;
  /** "오늘" 빠른 선택 버튼 노출 여부 */
  showToday?: boolean;
  /** 달력 시작 요일. "sun" | "mon" */
  weekStart?: "sun" | "mon";
  /** 기본값 모드. "none" | "today" | "now" */
  dateDefault?: "none" | "today" | "now";
  /** daterange 전용: 빠른 범위 프리셋 (어제/지난주/이번달 등) 노출 */
  rangePresets?: boolean;
  /** daterange 전용: 선택 가능한 최대 기간 (일) */
  maxRangeDays?: number;
}
