"use client";

import { ComponentConfig } from "@/types/component";
import type { OptionFilter } from "@/lib/registry/components/input/use-option-loader";

/**
 * Stats 컴포넌트 통합 설정 타입
 *
 * 통계/KPI 카드 통합. v2-aggregation-widget + v2-status-count + v2-card-display
 * + aggregation-widget(legacy) + card-display(legacy) + customer-item-mapping(legacy)
 * 를 흡수.
 */

export type StatsAggregation =
  | "count"
  | "sum"
  | "avg"
  | "min"
  | "max"
  | "distinctCount";
export type StatsOrientation = "horizontal" | "vertical" | "grid";
export type StatsStyle = "card" | "chip" | "bigNumber";

/**
 * StatItemDataSource — 항목 단위 데이터 바인딩 (Phase G.1)
 *
 * tableName 이 비어 있으면 fetch 를 건너뛰고 정적 `value` 사용.
 * `filters` 는 canonical `OptionFilter` 와 동일한 모양 — runtime hook 이
 * `value_type` (`field` / `user`) 를 formData / userContext 로 치환한 후 백엔드에
 * 전달.
 */
export interface StatItemDataSource {
  tableName?: string;
  aggregation?: StatsAggregation;
  columnName?: string;
  filters?: OptionFilter[];
}

export interface StatsItem {
  /** 항목 id (안정적 hook 키). 없으면 index 사용 */
  id?: string;
  /** 라벨 */
  label: string;
  /** 집계 대상 컬럼 (레거시 static 호환 — Phase G.1 부터는 dataSource 권장) */
  column?: string;
  /** 집계 방식 (레거시 static 호환) */
  aggregation?: StatsAggregation;
  /** 고정 값 (column 없이 직접 지정 — dataSource 결과가 우선) */
  value?: string | number;
  /** 라벨 앞 아이콘 (이모지 또는 lucide 이름) */
  icon?: string;
  /** 값 색상 */
  color?: string;
  /** 값 포맷 (#,##0 등) */
  format?: string;
  /** 변화량 (예: +12.4%) */
  delta?: string;
  /** 변화 방향: up / down / neutral */
  deltaDirection?: "up" | "down" | "neutral";
  /** Phase G.1 — DB 기반 데이터 바인딩 */
  dataSource?: StatItemDataSource;
}

export interface StatsConfig extends ComponentConfig {
  /** 통계 항목 목록 */
  items?: StatsItem[];
  /** 배치 방향 */
  orientation?: StatsOrientation;
  /** 표시 스타일 */
  style?: StatsStyle;
  /** 그리드 열 수 (orientation='grid' 일 때) */
  columns?: number;
  /** 데이터 소스 테이블 (선택) */
  sourceTable?: string;
  /** 제목 */
  title?: string;
}
