/**
 * 🎯 통합 타입 시스템 Index
 *
 * 모든 타입 정의를 중앙에서 관리하고 re-export합니다.
 * 이 파일을 통해 모든 타입에 일관성 있게 접근할 수 있습니다.
 */

// ===== 핵심 공통 타입들 =====
export * from "./v2-core";
import type { WebType, ButtonActionType, CompanyCode } from "./v2-core";
import type { ComponentData } from "./screen-management";

// ===== 시스템별 전용 타입들 =====
export * from "./screen-management";
export * from "./control-management";
export * from "./table-management";

// ===== 기존 호환성을 위한 re-export =====

// v2-core에서 제공하는 주요 타입들을 직접 export
export type {
  // 핵심 타입들
  WebType,
  DynamicWebType,
  ButtonActionType,
  ComponentType,
  Position,
  Size,
  CommonStyle,
  ValidationRule,
  ConditionOperator,

  // API 관련
  BaseApiResponse,
  PaginatedResponse,

  // 공통 필드들
  CompanyCode,
  ActiveStatus,
  TimestampFields,
  AuditFields,

  // 이벤트 타입들
  WebTypeEvent,
  ComponentEvent,
} from "./v2-core";

// screen-management에서 제공하는 주요 타입들
export type {
  // 컴포넌트 타입들
  ComponentData,
  BaseComponent,
  WidgetComponent,
  ContainerComponent,
  GroupComponent,
  DataTableComponent,
  FileComponent,

  // 웹타입 설정들
  WebTypeConfig,
  DateTypeConfig,
  NumberTypeConfig,
  SelectTypeConfig,
  TextTypeConfig,
  FileTypeConfig,
  EntityTypeConfig,
  ButtonTypeConfig,

  // 화면 관련
  ScreenDefinition,
  CreateScreenRequest,
  UpdateScreenRequest,
  LayoutData,
  GridSettings,
  ScreenTemplate,
  ScreenResolution,
  GroupState,

  // 화면 해상도 상수
  SCREEN_RESOLUTIONS,

  // 데이터 테이블
  DataTableColumn,
  DataTableFilter,

  // 파일 업로드
  UploadedFile,
} from "./screen-management";

// control-management에서 제공하는 주요 타입들
export type {
  // 버튼 제어
  ExtendedButtonTypeConfig,
  ButtonDataflowConfig,
  ControlDataSource,

  // 데이터플로우
  DataflowCondition,
  DataflowAction,
  ActionType,
  DatabaseOperation,
  NotificationType,

  // 트랜잭션 관리
  TransactionGroup,
  RollbackStrategy,
  FailureHandling,
  ConditionalExecutionPlan,
  ExecutionCondition,

  // 실행 결과
  ActionExecutionResult,
  TransactionExecutionState,
  DataflowExecutionResult,

  // 컨텍스트
  ExtendedControlContext,
  QuickValidationResult,

  // 버튼 액션 표준
  ButtonActionStandard,
  ButtonActionFormData,
} from "./control-management";

// table-management에서 제공하는 주요 타입들
export type {
  // 테이블 정보
  TableInfo,
  V2ColumnInfo,
  ColumnTypeInfo,
  ColumnSettings,

  // 웹타입 표준
  WebTypeStandard,
  WebTypeDefinition,

  // 라벨 관리
  TableLabels,
  ColumnLabels,

  // 엔티티 조인
  EntityJoinConfig,
  EntityJoinResponse,
  BatchLookupRequest,
  BatchLookupResponse,

  // 테이블 관계
  TableRelationship,
  DataRelationshipBridge,

  // 컬럼 웹타입 설정
  ColumnWebTypeSetting,

  // API 응답들
  TableListResponse,
  ColumnListResponse,
  ColumnTypeInfoResponse,
  WebTypeStandardListResponse,
  TableDataResponse,
} from "./table-management";

// ===== 타입 가드 함수들 통합 export =====

// v2-core 타입 가드들
export { isWebType, isButtonActionType, isComponentType, ynToBoolean, booleanToYN } from "./v2-core";

// screen-management 타입 가드들
export {
  isWidgetComponent,
  isContainerComponent,
  isGroupComponent,
  isDataTableComponent,
  isFileComponent,
  asWidgetComponent,
  asContainerComponent,
  asGroupComponent,
  asDataTableComponent,
  asFileComponent,
} from "./screen-management";

// control-management 타입 가드들
export {
  isSingleCondition,
  isGroupCondition,
  isDatabaseAction,
  isApiAction,
  isActionSuccess,
  isTransactionCompleted,
} from "./control-management";

// table-management 타입 가드들
export {
  isReferenceWebType,
  isNumericWebType,
  isDateWebType,
  isSelectWebType,
  isRequiredColumn,
  isSystemColumn,
  mapWebTypeStandardToDefinition,
  mapColumnTypeInfoToV2,
  mapV2ToColumnTypeInfo,
} from "./table-management";

// ===== 상수들 통합 export =====

// table-management 상수들
export { WEB_TYPE_OPTIONS } from "./table-management";

// ===== 타입 별칭 (기존 호환성) =====

/**
 * @deprecated screen.ts에서 이전하세요. v2-core.ts의 WebType을 사용하세요.
 */
export type LegacyWebType = WebType;

/**
 * @deprecated screen.ts에서 이전하세요. v2-core.ts의 ButtonActionType을 사용하세요.
 */
export type LegacyButtonActionType = ButtonActionType;

/**
 * @deprecated screen.ts에서 이전하세요. screen-management.ts의 ComponentData를 사용하세요.
 */
export type LegacyComponentData = ComponentData;

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

/**
 * 컴포넌트 업데이트를 위한 부분 타입
 */
export type ComponentUpdate<T extends ComponentData> = Partial<Omit<T, "id" | "type">> & {
  id: string;
  type: T["type"];
};

/**
 * API 요청을 위한 기본 파라미터
 */
export interface BaseRequestParams {
  companyCode?: CompanyCode;
  page?: number;
  size?: number;
  sortBy?: string;
  sortDirection?: "asc" | "desc";
  searchTerm?: string;
}

/**
 * 폼 데이터 타입 (모든 시스템에서 공통 사용)
 */
export type FormData = Record<string, unknown>;

/**
 * 선택된 행 데이터 타입
 */
export type SelectedRowData = Record<string, unknown>;

/**
 * 테이블 데이터 타입
 */
export type TableData = Record<string, unknown>[];

