import React from "react";

//#region src/components/pisellLookup/types.d.ts
/**
 * 触发器类型
 */
type TriggerType = 'input' | 'button' | 'icon' | 'text';
/**
 * 展示类型
 */
type DisplayType = 'inline' | 'popup' | 'modal' | 'drawer' | 'detached';
/**
 * 搜索模式
 */
type SearchMode = 'realtime' | 'confirm';
/**
 * 输入框尺寸
 */
type SizeType = 'large' | 'middle' | 'small';
/**
 * PisellLookup Ref 接口
 */
interface PisellLookupRef {
  /**
   * 打开搜索
   */
  open: () => void;
  /**
   * 关闭搜索
   */
  close: () => void;
  /**
   * 获取当前关键词
   */
  getKeyword: () => string;
  /**
   * 设置关键词
   */
  setKeyword: (keyword: string) => void;
}
/**
 * Drawer 位置
 */
type DrawerPlacement = 'left' | 'right' | 'top' | 'bottom';
/**
 * PisellLookup 组件 Props
 */
interface PisellLookupProps {
  /**
   * 预设触发器类型（与 trigger 互斥）
   * @default 'input'
   */
  triggerType?: TriggerType;
  /**
   * 自定义触发器（与 triggerType 互斥）
   * 传入任意 ReactNode 作为触发器，点击时打开搜索
   */
  trigger?: React.ReactNode;
  /**
   * 触发器文本（triggerType='text' 时有效）
   */
  triggerText?: string;
  /**
   * 触发器图标（triggerType='icon' 时有效）
   */
  triggerIcon?: React.ReactNode;
  /**
   * 按钮文本（triggerType='button' 时有效）
   * @default '搜索'
   */
  buttonText?: string;
  /**
   * 是否禁用
   * @default false
   */
  disabled?: boolean;
  /**
   * 占位符文本
   * @default '请输入搜索内容'
   */
  placeholder?: string;
  /**
   * 输入框尺寸
   * @default 'default'
   */
  size?: SizeType;
  /**
   * 是否显示前缀图标
   * @default false
   */
  showPrefixIcon?: boolean;
  /**
   * 前缀图标
   */
  prefixIcon?: React.ReactNode;
  /**
   * 是否显示清除按钮
   * @default true
   */
  showClear?: boolean;
  /**
   * 是否显示确认触发按钮
   * @default true
   */
  showConfirmButton?: boolean;
  /**
   * 确认按钮文本
   * @default 'Lookup'
   */
  confirmButtonText?: string;
  /**
   * 搜索触发模式
   * - realtime: 实时搜索（输入即触发）
   * - confirm: 确认触发（点击按钮或按 Enter 键触发）
   * 注意：如果 showConfirmButton=false，会自动使用 realtime 模式
   * @default 'realtime'
   */
  searchMode?: SearchMode;
  /**
   * 防抖时间（毫秒）
   * @default 300
   */
  debounceTime?: number;
  /**
   * 搜索关键词（受控）
   */
  value?: string;
  /**
   * 默认搜索关键词（非受控）
   */
  defaultValue?: string;
  /**
   * 关键词变化回调
   * @param value 当前关键词
   */
  onChange?: (value: string) => void;
  /**
   * 搜索触发回调
   * @param keyword 搜索关键词
   */
  onSearch?: (keyword: string) => void;
  /**
   * 是否显示扫码按钮
   * @default true
   */
  showScan?: boolean;
  /**
   * 扫码完成回调
   * @param code 扫码结果
   */
  onScan?: (code: string) => void;
  /**
   * 是否显示搜索历史
   * @default false
   */
  showHistory?: boolean;
  /**
   * 历史记录存储 key
   * @default 'pisell_lookup_history'
   */
  historyKey?: string;
  /**
   * 历史记录数量上限
   * @default 10
   */
  maxHistoryCount?: number;
  /**
   * 加载历史记录回调（用于自定义存储）
   * @returns 历史记录数组
   */
  onLoadHistory?: () => string[];
  /**
   * 保存历史记录回调（用于自定义存储）
   * @param history 历史记录数组
   */
  onSaveHistory?: (history: string[]) => void;
  /**
   * 自定义历史记录渲染
   * @param history 历史记录数组
   * @param onSelect 选择历史记录的回调
   * @returns 渲染内容
   */
  historyRender?: (history: string[], onSelect: (keyword: string) => void) => React.ReactNode;
  /**
   * 是否显示联想词
   * @default false
   */
  showSuggestions?: boolean;
  /**
   * 加载联想词回调
   * @param keyword 当前输入的关键词
   * @returns 联想词数组或 Promise
   */
  onLoadSuggestions?: (keyword: string) => Promise<string[]> | string[];
  /**
   * 自定义联想词渲染
   * @param suggestions 联想词数组
   * @param onSelect 选择联想词的回调
   * @returns 渲染内容
   */
  suggestionsRender?: (suggestions: string[], onSelect: (keyword: string) => void) => React.ReactNode;
  /**
   * 是否显示热门搜索
   * @default false
   */
  showHotWords?: boolean;
  /**
   * 加载热门搜索回调
   * @returns 热门搜索数组或 Promise
   */
  onLoadHotWords?: () => Promise<string[]> | string[];
  /**
   * 自定义热门搜索渲染
   * @param hotWords 热门搜索数组
   * @param onSelect 选择热门搜索的回调
   * @returns 渲染内容
   */
  hotWordsRender?: (hotWords: string[], onSelect: (keyword: string) => void) => React.ReactNode;
  /**
   * 结果展示方式
   * 如果不指定，将根据 triggerType 智能判断：
   * - triggerType='input' → 'inline'
   * - 其他 → 'modal'
   */
  displayType?: DisplayType;
  /**
   * 结果渲染函数
   * @param keyword 搜索关键词
   * @param onClose 关闭搜索的回调（可选）
   * @returns 渲染的结果内容
   */
  resultRender?: (keyword: string, onClose?: () => void) => React.ReactNode;
  /**
   * 是否显示加载状态
   * @default false
   */
  loading?: boolean;
  /**
   * 空状态渲染
   * @returns 空状态内容
   */
  emptyRender?: () => React.ReactNode;
  /**
   * Modal 宽度
   * @default 834
   */
  modalWidth?: number | string;
  /**
   * Modal 自定义样式
   */
  modalStyle?: React.CSSProperties;
  /**
   * Modal 挂载节点
   * - HTMLElement: 挂载到指定的 DOM 节点
   * - () => HTMLElement: 返回挂载节点的函数
   * - false: 挂载到触发器的父节点
   * - undefined: 默认挂载到 document.body
   * @default undefined
   */
  getContainer?: HTMLElement | (() => HTMLElement) | false;
  /**
   * Drawer 宽度
   * @default 378
   */
  drawerWidth?: number | string;
  /**
   * Drawer 位置
   * @default 'right'
   */
  drawerPlacement?: DrawerPlacement;
  /**
   * Popup 宽度
   */
  popupWidth?: number | string;
  /**
   * 容器自定义样式
   */
  containerStyle?: React.CSSProperties;
  /**
   * 容器自定义类名
   */
  containerClassName?: string;
  /**
   * 是否可见（受控）
   */
  visible?: boolean;
  /**
   * 默认是否可见（非受控）
   * @default false
   */
  defaultVisible?: boolean;
  /**
   * 可见性变化回调
   * @param visible 当前可见性
   */
  onVisibleChange?: (visible: boolean) => void;
  /**
   * 打开回调
   */
  onOpen?: () => void;
  /**
   * 关闭回调
   */
  onClose?: () => void;
  /**
   * 是否显示遮罩层（仅 Modal/Drawer）
   * @default false
   */
  mask?: boolean;
  /**
   * 点击遮罩是否关闭（仅 Modal/Drawer）
   * 注意：只有 mask=true 时此配置才生效
   * @default true
   */
  maskClosable?: boolean;
  /**
   * 关闭时是否清空关键词
   * @default false
   */
  clearOnClose?: boolean;
  /**
   * 自定义类名
   */
  className?: string;
  /**
   * 自定义样式
   */
  style?: React.CSSProperties;
  /**
   * 层级
   */
  zIndex?: number;
}
//#endregion
export { DisplayType, DrawerPlacement, PisellLookupProps, PisellLookupRef, SearchMode, SizeType, TriggerType };