/**
 * V2 이벤트 타입 정의
 *
 * 모든 V2 컴포넌트 간의 통신에 사용되는 이벤트 타입을 정의합니다.
 * 타입 안전성과 IDE 자동완성을 위해 명시적으로 정의합니다.
 */

// ============================================================================
// 이벤트 이름 상수
// ============================================================================

export const V2_EVENTS = {
  // 폼 저장 흐름
  FORM_SAVE_REQUEST: "v2:form:save:request",
  FORM_SAVE_COLLECT: "v2:form:save:collect",
  FORM_SAVE_COMPLETE: "v2:form:save:complete",
  FORM_SAVE_ERROR: "v2:form:save:error",

  // 테이블
  TABLE_REFRESH: "v2:table:refresh",
  TABLE_DATA_CHANGE: "v2:table:data:change",
  TABLE_SELECTION_CHANGE: "v2:table:selection:change",
  TABLE_ROW_CLICK: "v2:table:row:click",
  TABLE_ROW_DOUBLE_CLICK: "v2:table:row:doubleclick",

  // 리피터
  REPEATER_DATA_COLLECT: "v2:repeater:data:collect",
  REPEATER_SAVE: "v2:repeater:save",
  REPEATER_DATA_CHANGE: "v2:repeater:data:change",

  // 모달
  MODAL_OPEN: "v2:modal:open",
  MODAL_CLOSE: "v2:modal:close",
  MODAL_SAVE_SUCCESS: "v2:modal:save:success",

  // 카드 디스플레이
  CARD_REFRESH: "v2:card:refresh",

  // 집계 위젯
  AGGREGATION_UPDATE: "v2:aggregation:update",

  // 분할 패널
  SPLIT_PANEL_DATA_TRANSFER: "v2:splitpanel:data:transfer",

  // 컴포넌트 데이터 전송
  COMPONENT_DATA_TRANSFER: "v2:component:data:transfer",

  // 컴포넌트 에러
  COMPONENT_ERROR: "v2:component:error",
  COMPONENT_RECOVER: "v2:component:recover",

  // 관련 버튼 (Related Button)
  RELATED_BUTTON_REGISTER: "v2:related-button:register",
  RELATED_BUTTON_UNREGISTER: "v2:related-button:unregister",
  RELATED_BUTTON_SELECT: "v2:related-button:select",

  // 출하계획 저장
  SHIPPING_PLAN_SAVE: "v2:shipping-plan:save",

  // 스케줄 자동 생성
  SCHEDULE_GENERATE_REQUEST: "v2:schedule:generate:request",
  SCHEDULE_GENERATE_PREVIEW: "v2:schedule:generate:preview",
  SCHEDULE_GENERATE_APPLY: "v2:schedule:generate:apply",
  SCHEDULE_GENERATE_COMPLETE: "v2:schedule:generate:complete",
  SCHEDULE_GENERATE_ERROR: "v2:schedule:generate:error",
} as const;

export type V2EventName = (typeof V2_EVENTS)[keyof typeof V2_EVENTS];

// ============================================================================
// 이벤트 페이로드 인터페이스
// ============================================================================

/** 폼 저장 요청 이벤트 */
export interface V2FormSaveRequestEvent {
  requestId: string;
  tableName: string;
  formData: Record<string, any>;
  originalData?: Record<string, any>;
  source: string; // 요청 발생 컴포넌트
}

/** 폼 저장 데이터 수집 이벤트 */
export interface V2FormSaveCollectEvent {
  requestId: string;
  formData: Record<string, any>;
  componentId: string;
}

/** 폼 저장 완료 이벤트 */
export interface V2FormSaveCompleteEvent {
  requestId: string;
  success: boolean;
  savedData?: Record<string, any>;
  tableName: string;
}

/** 폼 저장 에러 이벤트 */
export interface V2FormSaveErrorEvent {
  requestId: string;
  error: string;
  componentId?: string;
  tableName?: string;
}

/** 테이블 새로고침 이벤트 */
export interface V2TableRefreshEvent {
  tableName?: string;
  target?: "all" | "single";
  screenCode?: string;
}

/** 테이블 데이터 변경 이벤트 */
export interface V2TableDataChangeEvent {
  tableName: string;
  data: any[];
  totalCount: number;
  source: string;
}

/** 테이블 선택 변경 이벤트 */
export interface V2TableSelectionChangeEvent {
  tableName: string;
  selectedRows: any[];
  selectedRowIds: (string | number)[];
  source: string;
}

/** 테이블 행 클릭 이벤트 */
export interface V2TableRowClickEvent {
  tableName: string;
  row: any;
  rowIndex: number;
}

/** 리피터 데이터 수집 이벤트 */
export interface V2RepeaterDataCollectEvent {
  requestId: string;
  repeaterId: string;
  tableName: string;
}

/** 리피터 저장 이벤트 */
export interface V2RepeaterSaveEvent {
  repeaterId: string;
  tableName: string;
  items: any[];
  joinData?: {
    column: string;
    value: any;
  };
}

/** 리피터 데이터 변경 이벤트 */
export interface V2RepeaterDataChangeEvent {
  repeaterId: string;
  tableName: string;
  data: any[];
  action: "add" | "update" | "delete" | "init";
}

/** 모달 열기 이벤트 */
export interface V2ModalOpenEvent {
  modalId: string;
  screenCode?: string;
  data?: Record<string, any>;
  mode?: "create" | "edit" | "view";
}

/** 모달 닫기 이벤트 */
export interface V2ModalCloseEvent {
  modalId: string;
  reason?: "save" | "cancel" | "close";
}

/** 모달 저장 성공 이벤트 */
export interface V2ModalSaveSuccessEvent {
  modalId: string;
  savedData: Record<string, any>;
  tableName: string;
}

/** 카드 새로고침 이벤트 */
export interface V2CardRefreshEvent {
  cardId?: string;
  tableName?: string;
}

/** 집계 업데이트 이벤트 */
export interface V2AggregationUpdateEvent {
  source: string;
  tableName: string;
  data: any[];
}

/** 분할 패널 데이터 전송 이벤트 */
export interface V2SplitPanelDataTransferEvent {
  sourcePanel: "left" | "right";
  targetPanel: "left" | "right";
  data: Record<string, any>;
  tableName: string;
}

/** 컴포넌트 데이터 전송 이벤트 */
export interface V2ComponentDataTransferEvent {
  sourceComponentId: string;
  targetComponentId?: string;
  data: Record<string, any>;
  tableName?: string;
}

/** 컴포넌트 에러 이벤트 */
export interface V2ComponentErrorEvent {
  componentId: string;
  componentType: string;
  error: Error | string;
  recoverable: boolean;
}

/** 컴포넌트 복구 이벤트 */
export interface V2ComponentRecoverEvent {
  componentId: string;
  componentType: string;
}

/** 관련 버튼 등록 이벤트 */
export interface V2RelatedButtonRegisterEvent {
  buttonId: string;
  targetTables: string[];
}

/** 관련 버튼 해제 이벤트 */
export interface V2RelatedButtonUnregisterEvent {
  buttonId: string;
}

/** 관련 버튼 선택 이벤트 */
export interface V2RelatedButtonSelectEvent {
  tableName: string;
  selectedData: any[];
}

// ============================================================================
// 출하계획 저장 이벤트
// ============================================================================

/** 출하계획 저장 요청 이벤트 */
export interface V2ShippingPlanSaveEvent {
  requestId: string;
}

// ============================================================================
// 스케줄 자동 생성 이벤트
// ============================================================================

/** 스케줄 타입 */
export type ScheduleType = "PRODUCTION" | "MAINTENANCE" | "SHIPPING" | "WORK_ASSIGN";

/** 스케줄 생성 요청 이벤트 */
export interface V2ScheduleGenerateRequestEvent {
  requestId: string;
  scheduleType: ScheduleType;
  sourceData?: any[];        // 선택 데이터 (없으면 TABLE_SELECTION_CHANGE로 받은 데이터 사용)
  period?: { start: string; end: string };
}

/** 스케줄 미리보기 결과 이벤트 */
export interface V2ScheduleGeneratePreviewEvent {
  requestId: string;
  scheduleType: ScheduleType;
  preview: {
    toCreate: any[];
    toDelete: any[];
    toUpdate: any[];
    summary: {
      createCount: number;
      deleteCount: number;
      updateCount: number;
      totalQty: number;
    };
  };
}

/** 스케줄 적용 이벤트 */
export interface V2ScheduleGenerateApplyEvent {
  requestId: string;
  confirmed: boolean;
}

/** 스케줄 생성 완료 이벤트 */
export interface V2ScheduleGenerateCompleteEvent {
  requestId: string;
  success: boolean;
  applied: {
    created: number;
    deleted: number;
    updated: number;
  };
  scheduleType: ScheduleType;
  targetTableName: string;
}

/** 스케줄 생성 에러 이벤트 */
export interface V2ScheduleGenerateErrorEvent {
  requestId: string;
  error: string;
  scheduleType?: ScheduleType;
}

// ============================================================================
// 이벤트 타입 맵핑 (타입 안전성을 위한)
// ============================================================================

export interface V2EventPayloadMap {
  [V2_EVENTS.FORM_SAVE_REQUEST]: V2FormSaveRequestEvent;
  [V2_EVENTS.FORM_SAVE_COLLECT]: V2FormSaveCollectEvent;
  [V2_EVENTS.FORM_SAVE_COMPLETE]: V2FormSaveCompleteEvent;
  [V2_EVENTS.FORM_SAVE_ERROR]: V2FormSaveErrorEvent;

  [V2_EVENTS.TABLE_REFRESH]: V2TableRefreshEvent;
  [V2_EVENTS.TABLE_DATA_CHANGE]: V2TableDataChangeEvent;
  [V2_EVENTS.TABLE_SELECTION_CHANGE]: V2TableSelectionChangeEvent;
  [V2_EVENTS.TABLE_ROW_CLICK]: V2TableRowClickEvent;
  [V2_EVENTS.TABLE_ROW_DOUBLE_CLICK]: V2TableRowClickEvent;

  [V2_EVENTS.REPEATER_DATA_COLLECT]: V2RepeaterDataCollectEvent;
  [V2_EVENTS.REPEATER_SAVE]: V2RepeaterSaveEvent;
  [V2_EVENTS.REPEATER_DATA_CHANGE]: V2RepeaterDataChangeEvent;

  [V2_EVENTS.MODAL_OPEN]: V2ModalOpenEvent;
  [V2_EVENTS.MODAL_CLOSE]: V2ModalCloseEvent;
  [V2_EVENTS.MODAL_SAVE_SUCCESS]: V2ModalSaveSuccessEvent;

  [V2_EVENTS.CARD_REFRESH]: V2CardRefreshEvent;

  [V2_EVENTS.AGGREGATION_UPDATE]: V2AggregationUpdateEvent;

  [V2_EVENTS.SPLIT_PANEL_DATA_TRANSFER]: V2SplitPanelDataTransferEvent;

  [V2_EVENTS.COMPONENT_DATA_TRANSFER]: V2ComponentDataTransferEvent;

  [V2_EVENTS.COMPONENT_ERROR]: V2ComponentErrorEvent;
  [V2_EVENTS.COMPONENT_RECOVER]: V2ComponentRecoverEvent;

  [V2_EVENTS.RELATED_BUTTON_REGISTER]: V2RelatedButtonRegisterEvent;
  [V2_EVENTS.RELATED_BUTTON_UNREGISTER]: V2RelatedButtonUnregisterEvent;
  [V2_EVENTS.RELATED_BUTTON_SELECT]: V2RelatedButtonSelectEvent;

  [V2_EVENTS.SHIPPING_PLAN_SAVE]: V2ShippingPlanSaveEvent;

  [V2_EVENTS.SCHEDULE_GENERATE_REQUEST]: V2ScheduleGenerateRequestEvent;
  [V2_EVENTS.SCHEDULE_GENERATE_PREVIEW]: V2ScheduleGeneratePreviewEvent;
  [V2_EVENTS.SCHEDULE_GENERATE_APPLY]: V2ScheduleGenerateApplyEvent;
  [V2_EVENTS.SCHEDULE_GENERATE_COMPLETE]: V2ScheduleGenerateCompleteEvent;
  [V2_EVENTS.SCHEDULE_GENERATE_ERROR]: V2ScheduleGenerateErrorEvent;
}

// ============================================================================
// 유틸리티 타입
// ============================================================================

/** 이벤트 핸들러 타입 */
export type V2EventHandler<T extends V2EventName> = (
  payload: V2EventPayloadMap[T]
) => void | Promise<void>;

/** 구독 해제 함수 타입 */
export type V2Unsubscribe = () => void;

