import React from "react";

/**
 * 웹타입 정의 인터페이스
 */
export interface WebTypeDefinition {
  /** 고유 식별자 */
  id: string;
  /** 표시 이름 */
  name: string;
  /** 카테고리 (input, display, layout 등) */
  category: string;
  /** 설명 */
  description: string;
  /** 렌더링 컴포넌트 */
  component: React.ComponentType<any>;
  /** 설정 패널 컴포넌트 */
  configPanel: React.ComponentType<WebTypeConfigPanelProps>;
  /** 기본 설정값 */
  defaultConfig: Record<string, any>;
  /** 활성화 상태 */
  isActive: boolean;
  /** 아이콘 (선택사항) */
  icon?: React.ComponentType<any>;
  /** 태그 (선택사항) */
  tags?: string[];
}

/**
 * 버튼 액션 정의 인터페이스
 */
export interface ButtonActionDefinition {
  /** 고유 식별자 */
  id: string;
  /** 표시 이름 */
  name: string;
  /** 카테고리 (save, delete, navigate 등) */
  category: string;
  /** 설명 */
  description: string;
  /** 핸들러 함수 */
  handler: (context: ButtonActionContext) => void | Promise<void>;
  /** 기본 설정값 */
  defaultConfig: Record<string, any>;
  /** 활성화 상태 */
  isActive: boolean;
  /** 아이콘 (선택사항) */
  icon?: React.ComponentType<any>;
  /** 확인 메시지 필요 여부 */
  requiresConfirmation?: boolean;
}

/**
 * 웹타입 컴포넌트 Props
 */
export interface WebTypeComponentProps {
  /** 컴포넌트 객체 */
  component: any;
  /** 현재 값 */
  value?: any;
  /** 값 변경 핸들러 */
  onChange?: (value: any) => void;
  /** 읽기 전용 모드 */
  readonly?: boolean;
  /** 추가 속성들 */
  [key: string]: any;
}

/**
 * 웹타입 설정 패널 Props
 */
export interface WebTypeConfigPanelProps {
  /** 컴포넌트 객체 */
  component: any;
  /** 컴포넌트 업데이트 핸들러 */
  onUpdateComponent: (component: any) => void;
  /** 속성 업데이트 핸들러 */
  onUpdateProperty: (property: string, value: any) => void;
}

/**
 * 버튼 액션 실행 컨텍스트
 */
export interface ButtonActionContext {
  /** 현재 화면 데이터 */
  screenData: Record<string, any>;
  /** 선택된 데이터 */
  selectedData?: Record<string, any>;
  /** 화면 설정 */
  screenConfig: Record<string, any>;
  /** 사용자 정보 */
  user: any;
  /** 네비게이션 함수 */
  navigate: (path: string) => void;
  /** 메시지 표시 함수 */
  showMessage: (message: string, type?: "success" | "error" | "warning" | "info") => void;
  /** API 호출 함수 */
  api: {
    get: (url: string, params?: any) => Promise<any>;
    post: (url: string, data?: any) => Promise<any>;
    put: (url: string, data?: any) => Promise<any>;
    delete: (url: string) => Promise<any>;
  };
}

/**
 * 레지스트리 이벤트 타입
 */
export type RegistryEventType =
  | "webtype_registered"
  | "webtype_unregistered"
  | "buttonaction_registered"
  | "buttonaction_unregistered";

/**
 * 레지스트리 이벤트 인터페이스
 */
export interface RegistryEvent {
  type: RegistryEventType;
  data: WebTypeDefinition | ButtonActionDefinition;
  timestamp: Date;
}

/**
 * 웹타입 카테고리
 */
export type WebTypeCategory = "input" | "display" | "layout" | "media" | "data" | "action";

/**
 * 버튼 액션 카테고리
 */
export type ButtonActionCategory = "save" | "delete" | "navigate" | "export" | "import" | "custom";

/**
 * 동적 컴포넌트 렌더러 Props
 */
export interface DynamicComponentProps {
  /** 웹타입 ID */
  webType: string;
  /** 컴포넌트 속성 */
  props: Record<string, any>;
  /** 컴포넌트 설정 */
  config?: Record<string, any>;
  /** 이벤트 핸들러 */
  onEvent?: (event: string, data: any) => void;
}

/**
 * 레지스트리 훅 반환 타입
 */
export interface UseRegistryReturn {
  /** 등록된 웹타입 목록 */
  webTypes: WebTypeDefinition[];
  /** 등록된 버튼 액션 목록 */
  buttonActions: ButtonActionDefinition[];
  /** 웹타입 등록 */
  registerWebType: (definition: WebTypeDefinition) => void;
  /** 웹타입 등록 해제 */
  unregisterWebType: (id: string) => void;
  /** 버튼 액션 등록 */
  registerButtonAction: (definition: ButtonActionDefinition) => void;
  /** 버튼 액션 등록 해제 */
  unregisterButtonAction: (id: string) => void;
  /** 웹타입 조회 */
  getWebType: (id: string) => WebTypeDefinition | undefined;
  /** 버튼 액션 조회 */
  getButtonAction: (id: string) => ButtonActionDefinition | undefined;
  /** 이벤트 구독 */
  subscribe: (callback: (event: RegistryEvent) => void) => () => void;
}

/**
 * 웹타입 필터 옵션
 */
export interface WebTypeFilterOptions {
  /** 카테고리 필터 */
  category?: WebTypeCategory;
  /** 활성화 상태 필터 */
  isActive?: boolean;
  /** 검색어 */
  search?: string;
  /** 태그 필터 */
  tags?: string[];
}

/**
 * 버튼 액션 필터 옵션
 */
export interface ButtonActionFilterOptions {
  /** 카테고리 필터 */
  category?: ButtonActionCategory;
  /** 활성화 상태 필터 */
  isActive?: boolean;
  /** 검색어 */
  search?: string;
  /** 확인 필요 여부 필터 */
  requiresConfirmation?: boolean;
}
