import { ComponentConfig } from "@/types/component";

/**
 * 집계 타입
 */
export type AggregationType = "sum" | "avg" | "count" | "max" | "min";

/**
 * 데이터 소스 타입
 */
export type DataSourceType = "table" | "component" | "selection";

/**
 * 필터 연산자
 */
export type FilterOperator =
  | "eq" // 같음 (=)
  | "neq" // 같지 않음 (!=)
  | "gt" // 보다 큼 (>)
  | "gte" // 크거나 같음 (>=)
  | "lt" // 보다 작음 (<)
  | "lte" // 작거나 같음 (<=)
  | "like" // 포함 (LIKE)
  | "in" // 목록에 포함 (IN)
  | "isNull" // NULL 여부
  | "isNotNull"; // NOT NULL 여부

/**
 * 필터 값 소스 타입
 */
export type FilterValueSourceType =
  | "static" // 고정 값
  | "formField" // 폼 필드에서 가져오기
  | "selection" // 선택된 행에서 가져오기
  | "urlParam"; // URL 파라미터에서 가져오기

/**
 * 필터 조건
 */
export interface FilterCondition {
  id: string;
  columnName: string; // 필터 적용할 컬럼 (집계 대상 테이블)
  operator: FilterOperator; // 연산자
  valueSourceType: FilterValueSourceType; // 값 소스 타입
  staticValue?: string | number | boolean; // 고정 값 (valueSourceType이 static일 때)
  formFieldName?: string; // 폼 필드명 (valueSourceType이 formField일 때)
  sourceComponentId?: string; // 소스 컴포넌트 ID (valueSourceType이 selection일 때)
  sourceColumnName?: string; // 소스 컬럼명 - 선택된 데이터의 컬럼 (valueSourceType이 selection일 때)
  urlParamName?: string; // URL 파라미터명 (valueSourceType이 urlParam일 때)
  enabled: boolean; // 필터 활성화 여부
}

/**
 * 개별 집계 항목 설정
 */
export interface AggregationItem {
  id: string;
  columnName: string; // 집계할 컬럼
  columnLabel?: string; // 표시 라벨
  labelLangKeyId?: number; // 다국어 키 ID
  labelLangKey?: string; // 다국어 키
  type: AggregationType; // 집계 타입
  format?: "number" | "currency" | "percent"; // 표시 형식
  decimalPlaces?: number; // 소수점 자릿수
  prefix?: string; // 접두사 (예: "₩")
  suffix?: string; // 접미사 (예: "원", "개")
}

/**
 * 집계 위젯 설정
 */
export interface AggregationWidgetConfig extends ComponentConfig {
  // 데이터 소스 설정
  dataSourceType: DataSourceType; // 데이터 소스 타입
  dataSourceComponentId?: string; // 연결할 컴포넌트 ID (component 타입일 때)

  // 컴포넌트별 테이블 설정 (개발 가이드 준수)
  tableName?: string; // 사용할 테이블명
  customTableName?: string; // 커스텀 테이블명
  useCustomTable?: boolean; // true: customTableName 사용

  // 필터 조건 (table 타입일 때 사용)
  filters?: FilterCondition[];
  filterLogic?: "AND" | "OR"; // 필터 조건 결합 방식 (기본: AND)

  // 집계 항목들
  items: AggregationItem[];

  // 레이아웃 설정
  layout: "horizontal" | "vertical"; // 배치 방향
  showLabels: boolean; // 라벨 표시 여부
  showIcons: boolean; // 아이콘 표시 여부
  gap?: string; // 항목 간 간격

  // 스타일 설정
  backgroundColor?: string;
  borderRadius?: string;
  padding?: string;
  fontSize?: string;
  labelFontSize?: string;
  valueFontSize?: string;
  labelColor?: string;
  valueColor?: string;

  // 자동 새로고침 설정
  autoRefresh?: boolean; // 자동 새로고침 활성화
  refreshInterval?: number; // 새로고침 간격 (초)
  refreshOnFormChange?: boolean; // 폼 데이터 변경 시 새로고침
}

/**
 * 집계 결과
 */
export interface AggregationResult {
  id: string;
  label: string;
  value: number | string;
  formattedValue: string;
  type: AggregationType;
}
