/**
 * PivotGrid 컴포넌트 타입 정의
 * 다차원 데이터 분석을 위한 피벗 테이블 컴포넌트
 */

// ==================== 기본 타입 ====================

// 필드 영역 타입
export type PivotAreaType = "row" | "column" | "data" | "filter";

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

// 요약 표시 모드
export type SummaryDisplayMode = 
  | "absoluteValue"      // 절대값 (기본)
  | "percentOfColumnTotal"   // 열 총계 대비 %
  | "percentOfRowTotal"      // 행 총계 대비 %
  | "percentOfGrandTotal"    // 전체 총계 대비 %
  | "percentOfColumnGrandTotal" // 열 대총계 대비 %
  | "percentOfRowGrandTotal"    // 행 대총계 대비 %
  | "runningTotalByRow"      // 행 방향 누계
  | "runningTotalByColumn"   // 열 방향 누계
  | "differenceFromPrevious" // 이전 대비 차이
  | "percentDifferenceFromPrevious"; // 이전 대비 % 차이

// 정렬 방향
export type SortDirection = "asc" | "desc" | "none";

// 날짜 그룹 간격
export type DateGroupInterval = "year" | "quarter" | "month" | "week" | "day";

// 필드 데이터 타입
export type FieldDataType = "string" | "number" | "date" | "boolean";

// 데이터 소스 타입
export type DataSourceType = "table" | "api" | "static";

// ==================== 필드 설정 ====================

// 필드 포맷 설정
export interface PivotFieldFormat {
  type: "number" | "currency" | "percent" | "date" | "text";
  precision?: number; // 소수점 자릿수
  thousandSeparator?: boolean; // 천단위 구분자
  prefix?: string; // 접두사 (예: "$", "₩")
  suffix?: string; // 접미사 (예: "%", "원")
  dateFormat?: string; // 날짜 형식 (예: "YYYY-MM-DD")
}

// 필드 설정
export interface PivotFieldConfig {
  // 기본 정보
  field: string; // 데이터 필드명
  caption: string; // 표시 라벨
  area: PivotAreaType; // 배치 영역
  areaIndex?: number; // 영역 내 순서

  // 데이터 타입
  dataType?: FieldDataType; // 데이터 타입

  // 집계 설정 (data 영역용)
  summaryType?: AggregationType; // 집계 함수
  summaryDisplayMode?: SummaryDisplayMode; // 요약 표시 모드
  showValuesAs?: SummaryDisplayMode; // 값 표시 방식 (summaryDisplayMode 별칭)

  // 정렬 설정
  sortBy?: "value" | "caption"; // 정렬 기준
  sortOrder?: SortDirection; // 정렬 방향
  sortBySummary?: string; // 요약값 기준 정렬 (data 필드명)

  // 날짜 그룹화 설정
  groupInterval?: DateGroupInterval; // 날짜 그룹 간격
  groupName?: string; // 그룹 이름 (같은 그룹끼리 계층 형성)

  // 표시 설정
  visible?: boolean; // 표시 여부
  width?: number; // 컬럼 너비
  expanded?: boolean; // 기본 확장 상태

  // 포맷 설정
  format?: PivotFieldFormat; // 값 포맷

  // 필터 설정
  filterValues?: any[]; // 선택된 필터 값
  filterType?: "include" | "exclude"; // 필터 타입
  allowFiltering?: boolean; // 필터링 허용
  allowSorting?: boolean; // 정렬 허용

  // 계층 관련
  displayFolder?: string; // 필드 선택기에서 폴더 구조
  isMeasure?: boolean; // 측정값 전용 필드 (data 영역만 가능)
  
  // 계산 필드
  isCalculated?: boolean; // 계산 필드 여부
  calculateFormula?: string; // 계산 수식 (예: "[Sales] / [Quantity]")
}

// ==================== 데이터 소스 설정 ====================

// 필터 조건
export interface PivotFilterCondition {
  field: string;
  operator: "=" | "!=" | ">" | "<" | ">=" | "<=" | "LIKE" | "IN";
  value?: any;
  valueFromField?: string; // formData에서 값 가져오기
}

// 조인 설정
export interface PivotJoinConfig {
  joinType: "INNER" | "LEFT" | "RIGHT";
  targetTable: string;
  sourceColumn: string;
  targetColumn: string;
  columns: string[]; // 가져올 컬럼들
}

// 데이터 소스 설정
export interface PivotDataSourceConfig {
  type: DataSourceType;

  // 테이블 기반
  tableName?: string; // 테이블명

  // API 기반
  apiEndpoint?: string; // API 엔드포인트
  apiMethod?: "GET" | "POST"; // HTTP 메서드

  // 정적 데이터
  staticData?: any[]; // 정적 데이터

  // 필터 조건
  filterConditions?: PivotFilterCondition[];

  // 조인 설정
  joinConfigs?: PivotJoinConfig[];
}

// ==================== 표시 설정 ====================

// 총합계 표시 설정
export interface PivotTotalsConfig {
  // 행 총합계
  showRowGrandTotals?: boolean; // 행 총합계 표시
  showRowTotals?: boolean; // 행 소계 표시
  rowTotalsPosition?: "first" | "last"; // 소계 위치
  rowGrandTotalPosition?: "top" | "bottom"; // 행 총계 위치 (상단/하단)

  // 열 총합계
  showColumnGrandTotals?: boolean; // 열 총합계 표시
  showColumnTotals?: boolean; // 열 소계 표시
  columnTotalsPosition?: "first" | "last"; // 소계 위치
  columnGrandTotalPosition?: "left" | "right"; // 열 총계 위치 (좌측/우측)
}

// 필드 선택기 설정
export interface FieldChooserConfig {
  enabled: boolean; // 활성화 여부
  allowSearch?: boolean; // 검색 허용
  layout?: "default" | "simplified"; // 레이아웃
  height?: number; // 높이
  applyChangesMode?: "instantly" | "onDemand"; // 변경 적용 시점
}

// 차트 연동 설정
export interface PivotChartConfig {
  enabled: boolean; // 차트 표시 여부
  type: "bar" | "line" | "area" | "pie" | "stackedBar";
  position: "top" | "bottom" | "left" | "right";
  height?: number;
  showLegend?: boolean;
  animate?: boolean;
}

// 조건부 서식 규칙
export interface ConditionalFormatRule {
  id: string;
  type: "colorScale" | "dataBar" | "iconSet" | "cellValue";
  field?: string; // 적용할 데이터 필드 (없으면 전체)

  // colorScale: 값 범위에 따른 색상 그라데이션
  colorScale?: {
    minColor: string; // 최소값 색상 (예: "#ff0000")
    midColor?: string; // 중간값 색상 (선택)
    maxColor: string; // 최대값 색상 (예: "#00ff00")
  };

  // dataBar: 값에 따른 막대 표시
  dataBar?: {
    color: string; // 막대 색상
    showValue?: boolean; // 값 표시 여부
    minValue?: number; // 최소값 (없으면 자동)
    maxValue?: number; // 최대값 (없으면 자동)
  };

  // iconSet: 값에 따른 아이콘 표시
  iconSet?: {
    type: "arrows" | "traffic" | "rating" | "flags";
    thresholds: number[]; // 경계값 (예: [30, 70] = 0-30, 30-70, 70-100)
    reverse?: boolean; // 아이콘 순서 반전
  };

  // cellValue: 조건에 따른 스타일
  cellValue?: {
    operator: ">" | ">=" | "<" | "<=" | "=" | "!=" | "between";
    value1: number;
    value2?: number; // between 연산자용
    backgroundColor?: string;
    textColor?: string;
    bold?: boolean;
  };
}

// 스타일 설정
export interface PivotStyleConfig {
  theme: "default" | "compact" | "modern";
  headerStyle: "default" | "dark" | "light";
  cellPadding: "compact" | "normal" | "comfortable";
  borderStyle: "none" | "light" | "heavy";
  alternateRowColors?: boolean;
  highlightTotals?: boolean; // 총합계 강조
  conditionalFormats?: ConditionalFormatRule[]; // 조건부 서식 규칙
  mergeCells?: boolean; // 같은 값 셀 병합
}

// ==================== 내보내기 설정 ====================

export interface PivotExportConfig {
  excel?: boolean;
  pdf?: boolean;
  fileName?: string;
}

// ==================== 메인 Props ====================

export interface PivotGridProps {
  // 기본 설정
  id?: string;
  title?: string;

  // 데이터 소스
  dataSource?: PivotDataSourceConfig;

  // 필드 설정
  fields?: PivotFieldConfig[];

  // 표시 설정
  totals?: PivotTotalsConfig;
  style?: PivotStyleConfig;

  // 필드 선택기
  fieldChooser?: FieldChooserConfig;

  // 차트 연동
  chart?: PivotChartConfig;

  // 기능 설정
  allowSortingBySummary?: boolean; // 요약값 기준 정렬
  allowFiltering?: boolean; // 필터링 허용
  allowExpandAll?: boolean; // 전체 확장/축소 허용
  wordWrapEnabled?: boolean; // 텍스트 줄바꿈

  // 크기 설정
  height?: string | number;
  maxHeight?: string;

  // 상태 저장
  stateStoring?: {
    enabled: boolean;
    storageKey?: string; // localStorage 키
  };

  // 내보내기
  exportConfig?: PivotExportConfig;

  // 데이터 (외부 주입용)
  data?: any[];

  // 이벤트
  onCellClick?: (cellData: PivotCellData) => void;
  onCellDoubleClick?: (cellData: PivotCellData) => void;
  onFieldDrop?: (field: PivotFieldConfig, targetArea: PivotAreaType) => void;
  onExpandChange?: (expandedPaths: string[][]) => void;
  onDataChange?: (data: any[]) => void;
}

// ==================== 결과 데이터 구조 ====================

// 셀 데이터
export interface PivotCellData {
  value: any; // 셀 값
  rowPath: string[]; // 행 경로 (예: ["북미", "뉴욕"])
  columnPath: string[]; // 열 경로 (예: ["2024", "Q1"])
  field?: string; // 데이터 필드명
  aggregationType?: AggregationType;
  isTotal?: boolean; // 총합계 여부
  isGrandTotal?: boolean; // 대총합 여부
}

// 헤더 노드 (트리 구조)
export interface PivotHeaderNode {
  value: any; // 원본 값
  caption: string; // 표시 텍스트
  level: number; // 깊이
  children?: PivotHeaderNode[]; // 자식 노드
  isExpanded: boolean; // 확장 상태
  hasChildren: boolean; // 자식 존재 가능 여부 (다음 레벨 필드 있음)
  path: string[]; // 경로 (드릴다운용)
  subtotal?: PivotCellValue[]; // 소계
  span?: number; // colspan/rowspan
}

// 셀 값
export interface PivotCellValue {
  field: string; // 데이터 필드
  value: number | null; // 집계 값
  formattedValue: string; // 포맷된 값
}

// 피벗 결과 데이터 구조
export interface PivotResult {
  // 행 헤더 트리
  rowHeaders: PivotHeaderNode[];

  // 열 헤더 트리
  columnHeaders: PivotHeaderNode[];

  // 데이터 매트릭스 (rowPath + columnPath → values)
  dataMatrix: Map<string, PivotCellValue[]>;

  // 플랫 행 목록 (렌더링용)
  flatRows: PivotFlatRow[];

  // 플랫 열 목록 (렌더링용) - 리프 노드만
  flatColumns: PivotFlatColumn[];
  
  // 열 헤더 레벨별 (다중 행 헤더용)
  columnHeaderLevels: PivotColumnHeaderCell[][];

  // 총합계
  grandTotals: {
    row: Map<string, PivotCellValue[]>; // 행별 총합
    column: Map<string, PivotCellValue[]>; // 열별 총합
    grand: PivotCellValue[]; // 대총합
  };
}

// 플랫 행 (렌더링용)
export interface PivotFlatRow {
  path: string[];
  level: number;
  caption: string;
  isExpanded: boolean;
  hasChildren: boolean;
  isTotal?: boolean;
}

// 플랫 열 (렌더링용)
export interface PivotFlatColumn {
  path: string[];
  level: number;
  caption: string;
  span: number;
  isTotal?: boolean;
}

// 열 헤더 셀 (다중 행 헤더용)
export interface PivotColumnHeaderCell {
  caption: string;      // 표시 텍스트
  colSpan: number;      // 병합할 열 수
  path: string[];       // 전체 경로
  level: number;        // 레벨 (0부터 시작)
}

// ==================== 상태 관리 ====================

export interface PivotGridState {
  expandedRowPaths: string[][]; // 확장된 행 경로들
  expandedColumnPaths: string[][]; // 확장된 열 경로들
  sortConfig: {
    field: string;
    direction: SortDirection;
  } | null;
  filterConfig: Record<string, any[]>; // 필드별 필터값
}

// ==================== 컴포넌트 Config (화면관리용) ====================

export interface PivotGridComponentConfig {
  // 데이터 소스
  dataSource?: PivotDataSourceConfig;

  // 필드 설정
  fields?: PivotFieldConfig[];

  // 표시 설정
  totals?: PivotTotalsConfig;
  style?: PivotStyleConfig;

  // 필드 선택기
  fieldChooser?: FieldChooserConfig;

  // 차트 연동
  chart?: PivotChartConfig;

  // 기능 설정
  allowSortingBySummary?: boolean;
  allowFiltering?: boolean;
  allowExpandAll?: boolean;
  wordWrapEnabled?: boolean;

  // 크기 설정
  height?: string | number;
  maxHeight?: string;

  // 내보내기
  exportConfig?: PivotExportConfig;
}


