"use client";

import { ComponentConfig } from "@/types/component";
import { ColumnConfig, EntityJoinInfo } from "../v2-table-list/types";

/**
 * 그룹 요약 설정
 */
export interface GroupSummaryConfig {
  /** 합계를 계산할 컬럼 목록 */
  sumColumns?: string[];
  /** 개수 표시 여부 */
  showCount?: boolean;
  /** 평균 컬럼 목록 */
  avgColumns?: string[];
  /** 최대값 컬럼 목록 */
  maxColumns?: string[];
  /** 최소값 컬럼 목록 */
  minColumns?: string[];
}

/**
 * 그룹화 설정
 */
export interface GroupConfig {
  /** 그룹화 기준 컬럼 */
  groupByColumn: string;

  /** 그룹 표시 형식 (예: "{item_name} ({item_code})") */
  groupLabelFormat?: string;

  /** 그룹 요약 설정 */
  summary?: GroupSummaryConfig;

  /** 초기 펼침 상태 (기본값: true) */
  defaultExpanded?: boolean;

  /** 중첩 그룹 (다중 그룹화) - 향후 확장 */
  nestedGroup?: GroupConfig;

  /** 그룹 정렬 방식 */
  sortDirection?: "asc" | "desc";

  /** 그룹 정렬 컬럼 (기본: groupByColumn) */
  sortColumn?: string;
}

/**
 * 그룹화 테이블 설정 (ComponentConfig 기반)
 */
export interface TableGroupedConfig extends ComponentConfig {
  /** 테이블명 */
  selectedTable?: string;

  /** 커스텀 테이블 사용 여부 */
  useCustomTable?: boolean;

  /** 커스텀 테이블명 */
  customTableName?: string;

  /** 그룹화 설정 */
  groupConfig: GroupConfig;

  /** 컬럼 설정 */
  columns?: ColumnConfig[];

  /** 체크박스 표시 여부 */
  showCheckbox?: boolean;

  /** 체크박스 모드 */
  checkboxMode?: "single" | "multi";

  /** 페이지네이션 (그룹 단위) */
  pagination?: {
    enabled: boolean;
    pageSize: number;
  };

  /** 기본 정렬 설정 */
  defaultSort?: {
    column: string;
    direction: "asc" | "desc";
  };

  /** 읽기 전용 */
  isReadOnly?: boolean;

  /** 행 클릭 가능 여부 */
  rowClickable?: boolean;

  /** 높이 설정 */
  height?: number | string;

  /** 최대 높이 */
  maxHeight?: number | string;

  /** 전체 펼치기/접기 버튼 표시 */
  showExpandAllButton?: boolean;

  /** 그룹 헤더 스타일 */
  groupHeaderStyle?: "default" | "compact" | "card";

  /** 빈 데이터 메시지 */
  emptyMessage?: string;

  /** Entity 조인 컬럼 정보 */
  entityJoinColumns?: Array<{
    columnName: string;
    entityJoinInfo: EntityJoinInfo;
  }>;

  /** 데이터 필터 */
  dataFilter?: {
    column: string;
    operator: "eq" | "ne" | "gt" | "lt" | "gte" | "lte" | "like" | "in";
    value: any;
  }[];

  /** 연결된 필터 설정 (다른 컴포넌트와 연동) */
  linkedFilters?: LinkedFilterConfig[];
}

/**
 * 연결된 필터 설정
 */
export interface LinkedFilterConfig {
  /** 소스 컴포넌트 ID */
  sourceComponentId: string;
  /** 소스 필드 */
  sourceField?: string;
  /** 대상 컬럼 */
  targetColumn: string;
  /** 활성화 여부 */
  enabled?: boolean;
}

/**
 * 그룹 요약 데이터
 */
export interface GroupSummary {
  /** 개수 */
  count: number;
  /** 합계 (컬럼별) */
  sum?: Record<string, number>;
  /** 평균 (컬럼별) */
  avg?: Record<string, number>;
  /** 최대값 (컬럼별) */
  max?: Record<string, number>;
  /** 최소값 (컬럼별) */
  min?: Record<string, number>;
}

/**
 * 그룹 상태
 */
export interface GroupState {
  /** 그룹 키 (groupByColumn 값) */
  groupKey: string;

  /** 그룹 표시 라벨 */
  groupLabel: string;

  /** 펼침 여부 */
  expanded: boolean;

  /** 그룹 내 데이터 */
  items: any[];

  /** 그룹 요약 데이터 */
  summary: GroupSummary;

  /** 그룹 선택 여부 */
  selected?: boolean;

  /** 그룹 내 선택된 아이템 ID 목록 */
  selectedItemIds?: string[];
}

/**
 * 선택 이벤트 데이터
 */
export interface SelectionChangeEvent {
  /** 선택된 그룹 키 목록 */
  selectedGroups: string[];
  /** 선택된 아이템 (전체) */
  selectedItems: any[];
  /** 모두 선택 여부 */
  isAllSelected: boolean;
}

/**
 * 그룹 토글 이벤트
 */
export interface GroupToggleEvent {
  /** 그룹 키 */
  groupKey: string;
  /** 펼침 상태 */
  expanded: boolean;
}

/**
 * 행 클릭 이벤트
 */
export interface RowClickEvent {
  /** 클릭된 행 데이터 */
  row: any;
  /** 그룹 키 */
  groupKey: string;
  /** 그룹 내 인덱스 */
  indexInGroup: number;
}

/**
 * TableGroupedComponent Props
 */
export interface TableGroupedComponentProps {
  /** 컴포넌트 설정 */
  config: TableGroupedConfig;

  /** 디자인 모드 여부 */
  isDesignMode?: boolean;

  /** 폼 데이터 (formData 전달용) */
  formData?: Record<string, any>;

  /** 선택 변경 이벤트 */
  onSelectionChange?: (event: SelectionChangeEvent) => void;

  /** 그룹 토글 이벤트 */
  onGroupToggle?: (event: GroupToggleEvent) => void;

  /** 행 클릭 이벤트 */
  onRowClick?: (event: RowClickEvent) => void;

  /** 외부에서 주입된 데이터 (선택) */
  externalData?: any[];

  /** 로딩 상태 (외부 제어) */
  isLoading?: boolean;

  /** 에러 상태 (외부 제어) */
  error?: string;

  /** 컴포넌트 ID */
  componentId?: string;
}

/**
 * useGroupedData 훅 반환 타입
 */
export interface UseGroupedDataResult {
  /** 그룹화된 데이터 */
  groups: GroupState[];

  /** 로딩 상태 */
  isLoading: boolean;

  /** 에러 */
  error: string | null;

  /** 그룹 펼치기/접기 토글 */
  toggleGroup: (groupKey: string) => void;

  /** 전체 펼치기 */
  expandAll: () => void;

  /** 전체 접기 */
  collapseAll: () => void;

  /** 아이템 선택 토글 */
  toggleItemSelection: (groupKey: string, itemId: string) => void;

  /** 그룹 전체 선택 토글 */
  toggleGroupSelection: (groupKey: string) => void;

  /** 전체 선택 토글 */
  toggleAllSelection: () => void;

  /** 선택된 아이템 목록 */
  selectedItems: any[];

  /** 모두 선택 여부 */
  isAllSelected: boolean;

  /** 일부 선택 여부 */
  isIndeterminate: boolean;

  /** 데이터 새로고침 */
  refresh: () => void;

  /** 원본 데이터 */
  rawData: any[];

  /** 전체 데이터 개수 */
  totalCount: number;

  /** 그룹 개수 */
  groupCount: number;
}
