import { BaseSelectProps, SelectOption } from "@pisell/utils";

//#region src/components/pisellMultipleSelect/types.d.ts
/**
 * PisellMultipleSelect 组件 Props 类型定义
 *
 * 继承 BaseSelectProps，添加多选特有的配置
 * @template T 选项值的类型，默认为 string | number
 */
interface PisellMultipleSelectProps<T = string | number> extends BaseSelectProps<T> {
  /**
   * 受控模式：当前选中值数组
   */
  value?: T[];
  /**
   * 非受控模式：默认选中值数组
   */
  defaultValue?: T[];
  /**
   * 值变化回调
   * @param value 新的选中值数组
   * @param options 选中的选项对象数组
   */
  onChange?: (value: T[], options: SelectOption<T>[]) => void;
  /**
   * 最多显示的标签数量
   * 超出部分会显示 "+N" 聚合标签
   * @default 3
   */
  maxTagCount?: number;
  /**
   * 超出标签 hover 时是否显示 Tooltip
   * @default true
   */
  showTooltipOnOverflow?: boolean;
  /**
   * 最大可选数量
   * 达到上限时阻止继续选择
   * @default undefined（无限制）
   */
  maxCount?: number;
  /**
   * 取消选中某项时触发
   * @param value 被取消选中的值
   * @param option 被取消选中的选项对象
   */
  onDeselect?: (value: T, option: SelectOption<T>) => void;
  /**
   * ARIA 标签
   */
  'aria-label'?: string;
  /**
   * ARIA 是否必填
   */
  'aria-required'?: boolean;
  /**
   * ARIA 是否无效
   */
  'aria-invalid'?: boolean;
  /**
   * ARIA 描述关联 ID
   */
  'aria-describedby'?: string;
  /**
   * ARIA 多选标识
   * @default true
   */
  'aria-multiselectable'?: boolean;
}
/**
 * PisellMultipleSelect 组件 Ref 方法
 * @template T 选项值的类型
 */
interface MultipleSelectRef<T = string | number> {
  /**
   * 聚焦到组件
   */
  focus: () => void;
  /**
   * 失焦
   */
  blur: () => void;
  /**
   * 获取当前选中值数组
   */
  getValue: () => T[];
  /**
   * 设置选中值数组
   */
  setValue: (value: T[]) => void;
  /**
   * 清空所有选中值
   */
  clearValue: () => void;
  /**
   * 添加一个选中值
   */
  addValue: (value: T) => void;
  /**
   * 移除一个选中值
   */
  removeValue: (value: T) => void;
}
//#endregion
export { MultipleSelectRef, PisellMultipleSelectProps };