// ===== pop-search 전용 타입 =====
// 단일 필드 검색 컴포넌트. 그리드 한 칸 = 검색 필드 하나.

/** 검색 필드 입력 타입 */
export type SearchInputType =
  | "text"
  | "number"
  | "date"
  | "date-preset"
  | "select"
  | "modal"
  | "toggle";

/** 레거시 입력 타입 정규화 (DB 호환) */
export function normalizeInputType(t: string): SearchInputType {
  if (t === "modal-table" || t === "modal-card" || t === "modal-icon-grid") return "modal";
  if (t === "status-chip" || t === "multi-select" || t === "combo") return "text";
  return t as SearchInputType;
}

/** 날짜 선택 모드 */
export type DateSelectionMode = "single" | "range";

/** 캘린더 표시 방식 (POP 터치 환경에서는 modal 권장) */
export type CalendarDisplayMode = "popover" | "modal";

/** 날짜 프리셋 옵션 */
export type DatePresetOption = "today" | "this-week" | "this-month" | "custom";

/** 셀렉트 옵션 (정적 목록) */
export interface SelectOption {
  value: string;
  label: string;
}

/** 모달 보여주기 방식: 테이블 or 아이콘 */
export type ModalDisplayStyle = "table" | "icon";

/** 모달 검색 방식 */
export type ModalSearchMode = "contains" | "starts-with" | "equals";

/** 검색 값을 대상 리스트에 전달할 때의 필터링 방식 */
export type SearchFilterMode = "contains" | "equals" | "starts_with" | "range";

/** 모달 필터 탭 (가나다 초성 / ABC 알파벳) */
export type ModalFilterTab = "korean" | "alphabet";

/** 모달 선택 설정 */
export interface ModalSelectConfig {
  displayStyle?: ModalDisplayStyle;

  tableName?: string;
  displayColumns?: string[];
  /** 컬럼별 커스텀 헤더 라벨 { column_name: "표시 라벨" } */
  columnLabels?: Record<string, string>;
  searchColumns?: string[];
  searchMode?: ModalSearchMode;
  /** 모달 상단 필터 탭 (가나다 / ABC) */
  filterTabs?: ModalFilterTab[];

  displayField: string;
  valueField: string;

  /** displayField 기준 중복 제거 */
  distinct?: boolean;
}

/** pop-search 전체 설정 */
export interface PopSearchConfig {
  inputType: SearchInputType | string;
  fieldName: string;
  placeholder?: string;
  defaultValue?: unknown;

  // text/number 전용
  debounceMs?: number;
  triggerOnEnter?: boolean;

  // select 전용
  options?: SelectOption[];

  // date 전용
  dateSelectionMode?: DateSelectionMode;
  calendarDisplay?: CalendarDisplayMode;

  // date-preset 전용
  datePresets?: DatePresetOption[];

  // modal 전용
  modalConfig?: ModalSelectConfig;

  // 라벨
  labelText?: string;
  labelVisible?: boolean;

  // 연결된 리스트에 필터를 보낼 때의 매칭 방식
  filterMode?: SearchFilterMode;

  // 필터 대상 컬럼 복수 선택 (fieldName은 대표 컬럼, filterColumns는 전체 대상)
  filterColumns?: string[];

  // 초기값 고정 세팅 (사용자 프로필에서 자동으로 값 설정)
  initialValueSource?: {
    type: "user_profile";
    column: string;
  };
}

/** 기본 설정값 (레지스트리 + 컴포넌트 공유) */
export const DEFAULT_SEARCH_CONFIG: PopSearchConfig = {
  inputType: "text",
  fieldName: "",
  placeholder: "검색어 입력",
  debounceMs: 500,
  triggerOnEnter: true,
  labelText: "",
  labelVisible: true,
};

/** 날짜 프리셋 라벨 매핑 */
export const DATE_PRESET_LABELS: Record<DatePresetOption, string> = {
  today: "오늘",
  "this-week": "이번주",
  "this-month": "이번달",
  custom: "직접",
};

/** 입력 타입 라벨 매핑 (설정 패널용) */
export const SEARCH_INPUT_TYPE_LABELS: Record<SearchInputType, string> = {
  text: "텍스트",
  number: "숫자",
  date: "날짜",
  "date-preset": "날짜 프리셋",
  select: "단일 선택",
  modal: "모달",
  toggle: "토글",
};

/** 모달 보여주기 방식 라벨 */
export const MODAL_DISPLAY_STYLE_LABELS: Record<ModalDisplayStyle, string> = {
  table: "테이블",
  icon: "아이콘",
};

/** 모달 검색 방식 라벨 */
export const MODAL_SEARCH_MODE_LABELS: Record<ModalSearchMode, string> = {
  contains: "포함",
  "starts-with": "시작",
  equals: "같음",
};

/** 모달 필터 탭 라벨 */
export const MODAL_FILTER_TAB_LABELS: Record<ModalFilterTab, string> = {
  korean: "가나다",
  alphabet: "ABC",
};

/** 검색 필터 방식 라벨 (설정 패널용) */
export const SEARCH_FILTER_MODE_LABELS: Record<SearchFilterMode, string> = {
  contains: "포함",
  equals: "일치",
  starts_with: "시작",
  range: "범위",
};

/** 한글 초성 추출 */
const KOREAN_CONSONANTS = [
  "ㄱ", "ㄲ", "ㄴ", "ㄷ", "ㄸ", "ㄹ", "ㅁ", "ㅂ", "ㅃ",
  "ㅅ", "ㅆ", "ㅇ", "ㅈ", "ㅉ", "ㅊ", "ㅋ", "ㅌ", "ㅍ", "ㅎ",
];

/** 초성 -> 대표 초성 (쌍자음 합침) */
const CONSONANT_GROUP: Record<string, string> = {
  "ㄱ": "ㄱ", "ㄲ": "ㄱ",
  "ㄴ": "ㄴ",
  "ㄷ": "ㄷ", "ㄸ": "ㄷ",
  "ㄹ": "ㄹ",
  "ㅁ": "ㅁ",
  "ㅂ": "ㅂ", "ㅃ": "ㅂ",
  "ㅅ": "ㅅ", "ㅆ": "ㅅ",
  "ㅇ": "ㅇ",
  "ㅈ": "ㅈ", "ㅉ": "ㅈ",
  "ㅊ": "ㅊ",
  "ㅋ": "ㅋ",
  "ㅌ": "ㅌ",
  "ㅍ": "ㅍ",
  "ㅎ": "ㅎ",
};

/** 문자열 첫 글자의 그룹 키 추출 (한글 초성 / 영문 대문자 / 기타) */
export function getGroupKey(
  text: string,
  mode: ModalFilterTab
): string {
  if (!text) return "#";
  const ch = text.charAt(0);
  const code = ch.charCodeAt(0);

  if (mode === "korean") {
    if (code >= 0xAC00 && code <= 0xD7A3) {
      const idx = Math.floor((code - 0xAC00) / (21 * 28));
      const consonant = KOREAN_CONSONANTS[idx];
      return CONSONANT_GROUP[consonant] || consonant;
    }
    return "#";
  }

  // alphabet
  if ((code >= 65 && code <= 90) || (code >= 97 && code <= 122)) {
    return ch.toUpperCase();
  }
  return "#";
}

/** 날짜 범위 계산 (date-preset -> 실제 날짜) */
export function computeDateRange(
  preset: DatePresetOption
): { preset: DatePresetOption; from: string; to: string } | null {
  const now = new Date();
  const fmt = (d: Date) => `${d.getFullYear()}-${String(d.getMonth() + 1).padStart(2, "0")}-${String(d.getDate()).padStart(2, "0")}`;

  switch (preset) {
    case "today":
      return { preset, from: fmt(now), to: fmt(now) };
    case "this-week": {
      const day = now.getDay();
      const mon = new Date(now);
      mon.setDate(now.getDate() - ((day + 6) % 7));
      const sun = new Date(mon);
      sun.setDate(mon.getDate() + 6);
      return { preset, from: fmt(mon), to: fmt(sun) };
    }
    case "this-month": {
      const first = new Date(now.getFullYear(), now.getMonth(), 1);
      const last = new Date(now.getFullYear(), now.getMonth() + 1, 0);
      return { preset, from: fmt(first), to: fmt(last) };
    }
    case "custom":
      return null;
  }
}
