/**
 * 테이블 화면 표시 데이터 전역 저장소
 * 엑셀 다운로드 등에서 현재 화면에 표시된 데이터에 접근하기 위함
 */

interface TableDisplayState {
  data: any[];
  columnOrder: string[];
  sortBy: string | null;
  sortOrder: "asc" | "desc";
  tableName: string;
  
  // 🆕 엑셀 다운로드 개선을 위한 추가 필드
  filterConditions?: Record<string, any>; // 필터 조건
  searchTerm?: string; // 검색어
  visibleColumns?: string[]; // 화면 표시 컬럼
  columnLabels?: Record<string, string>; // 컬럼 라벨
  currentPage?: number; // 현재 페이지
  pageSize?: number; // 페이지 크기
  totalItems?: number; // 전체 항목 수
}

class TableDisplayStore {
  private state: Map<string, TableDisplayState> = new Map();
  private listeners: Set<() => void> = new Set();

  /**
   * 테이블 표시 데이터 저장
   * @param tableName 테이블명
   * @param data 화면에 표시된 데이터
   * @param columnOrder 컬럼 순서
   * @param sortBy 정렬 컬럼
   * @param sortOrder 정렬 방향
   * @param options 추가 옵션 (필터, 페이징 등)
   */
  setTableData(
    tableName: string,
    data: any[],
    columnOrder: string[],
    sortBy: string | null,
    sortOrder: "asc" | "desc",
    options?: {
      filterConditions?: Record<string, any>;
      searchTerm?: string;
      visibleColumns?: string[];
      columnLabels?: Record<string, string>;
      currentPage?: number;
      pageSize?: number;
      totalItems?: number;
    }
  ) {
    this.state.set(tableName, {
      data,
      columnOrder,
      sortBy,
      sortOrder,
      tableName,
      ...options,
    });
    
    this.notifyListeners();
  }

  /**
   * 테이블 표시 데이터 조회
   * @param tableName 테이블명
   */
  getTableData(tableName: string): TableDisplayState | undefined {
    return this.state.get(tableName);
  }

  /**
   * 모든 테이블 데이터 조회
   */
  getAllTableData(): Map<string, TableDisplayState> {
    return new Map(this.state);
  }

  /**
   * 테이블 데이터 삭제
   * @param tableName 테이블명
   */
  clearTableData(tableName: string) {
    this.state.delete(tableName);
    this.notifyListeners();
  }

  /**
   * 모든 데이터 삭제
   */
  clearAll() {
    this.state.clear();
    this.notifyListeners();
  }

  /**
   * 변경 리스너 등록
   */
  subscribe(listener: () => void) {
    this.listeners.add(listener);
    return () => {
      this.listeners.delete(listener);
    };
  }

  private notifyListeners() {
    this.listeners.forEach((listener) => listener());
  }
}

// 싱글톤 인스턴스
export const tableDisplayStore = new TableDisplayStore();

