/**
 * Типы для пакета bms-shared-components (Vue 3 shared components library).
 *
 * Интерфейсы *Props экспортируются для подсказок и `import type { TheTableProps }`.
 * В шаблонах Volar подхватывает пропсы у импортированных компонентов и у глобальных
 * (см. пакетный файл `bms-shared-components/global`).
 */
declare module "bms-shared-components" {
  import type { App, Component, DefineComponent } from "vue";

  // --- TheTable ---

  /** Пропсы TheTable (обёртка над DataTable из bms-ui-lib-ihp). */
  export interface TheTableProps {
    /** Индикатор загрузки */
    loading?: boolean;
    /** Высота таблицы (px) */
    height?: number;
    /** Функция цвета выделения строки */
    selectedColor?: ((...args: unknown[]) => unknown) | null;
    /** Разрешить выбор строк */
    selectable?: boolean;
    /** Источник данных (массив записей) */
    dataSource: unknown[];
    /** Описание колонок */
    columns: unknown[];
    /** Обработчик выбора строки */
    onSelectRow?: (...args: unknown[]) => unknown;
    /** Действия над строками / ячейками */
    actions?: Record<string, unknown> | null;
    /** Чередование фона строк */
    striped?: boolean;
    /** Компактный режим */
    compact?: boolean;
    /** Сортировка по умолчанию */
    defaultSort?: { column: string; desc: boolean };
    /** Доп. функции колонок (объект настроек) */
    showFunctions?: Record<string, unknown>;
    /** Кастомная раскраска строки */
    customColoring?: ((...args: unknown[]) => unknown) | null;
    /** Альтернативная раскраска */
    coloring?: ((...args: unknown[]) => unknown) | null;
    /** Показывать нумерацию */
    numbering?: boolean;
    onEdit?: ((...args: unknown[]) => unknown) | null;
    onDelete?: ((...args: unknown[]) => unknown) | null;
    /** Не вызывать повторно выбор той же строки */
    preventReselection?: boolean;
    /** Поле ключа для выбора (по умолчанию Index) */
    selectingKey?: string;
    /** Сбрасывать выбор при потере фокуса и т.п. */
    dropSelect?: boolean;
    /** Количество строк на странице; 0 — без пагинации */
    pagination?: number;
    /** Использовать исходные данные без отображаемых преобразований */
    originalData?: boolean;
    /** Высота в строках (вспомогательный режим) */
    heightInRows?: number;
    showEdit?: ((...args: unknown[]) => unknown) | null;
    showDelete?: ((...args: unknown[]) => unknown) | null;
    /** Порядок кнопок действий: строка или массив имён */
    actionsOrder?: string | unknown[];
    /** Задержка перед событием фильтров (мс) */
    filtersDelay?: number;
    /** Фильтрация только по уже загруженным данным */
    localFiltering?: boolean;
    /** Запрет переноса длинных слов в ячейках */
    noBreakWord?: boolean;
    /** Показать контекстное меню строки (слот rowContextMenu) */
    showRowContextMenu?: boolean;
    /** v-model:selected — выбранные строки */
    selected?: unknown;
  }

  export const TheTable: DefineComponent<TheTableProps>;

  // --- ReSimpleTable ---

  /** Пропсы ReSimpleTable (таблица на «чистых» колонках Title/Field и т.д.). */
  export interface ReSimpleTableProps {
    striped?: boolean;
    /** Колонки (Title, Field, …) */
    columns?: unknown[];
    /** Строки данных */
    data?: unknown[];
    /** Размер страницы */
    pageSize?: number;
    /** Действия в строке */
    rowActions?: unknown[];
    /** Функция цвета строки → CSS color */
    rowColor?: (...args: unknown[]) => string;
    /** Показать экспорт в Excel */
    enableXlsxExport?: boolean;
    contextActions?: unknown[];
    /** Горизонтальная раскладка строки */
    rowHorizontal?: boolean;
    tableClass?: string;
    /** Пагинация управляется снаружи */
    customPagination?: boolean;
    recordTotal?: number;
    /**
     * Уникальный id таблицы (localStorage, пресеты, экспорт).
     * В шаблоне: table-id="..."
     */
    tableId: string;
    stickyHeader?: boolean;
    wheelPropagation?: boolean;
    numbering?: boolean;
    enablePageSizeSelector?: boolean;
    footer?: boolean;
    growOnlyX?: boolean;
    /** Пресеты колонок (шапка) */
    enablePresets?: boolean;
    presetsTableKey?: string;
    presetsEmployeePostId?: string | null;
    presetsDeleted?: boolean | null;
    /** v-model:sort-direction */
    sortDirection?: unknown;
    /** v-model:sort-column-index */
    sortColumnIndex?: unknown;
  }

  export const ReSimpleTable: DefineComponent<ReSimpleTableProps>;

  // --- TableAccordion ---

  /** Пропсы TableAccordion (иерархическая таблица-аккордеон). */
  export interface TableAccordionProps {
    data?: unknown[];
    columns: unknown[];
    /** Действия по уровням: all,0, 1, … */
    actions?: Record<string, unknown>;
    selected?: Record<string, unknown>;
    loading?: boolean;
    options?: Record<string, unknown> | null;
    bindOptions?: Record<string, unknown> | null;
    contextMenuVisible?: boolean;
    /** Опции PerfectScrollbar */
    psOptions?: Record<string, unknown>;
    bindMenuAction?: Record<string, (...args: unknown[]) => unknown> | null;
    showActionsMenu?: boolean;
    enablePresets?: boolean;
    presetsTableKey?: string;
    presetsEmployeePostId?: string | null;
    presetsDeleted?: boolean | null;
  }

  export const TableAccordion: DefineComponent<TableAccordionProps>;

  // --- TablePresetPicker ---

  export interface TablePresetPickerProps {
    modelValue?: string | null;
    tableKey: string;
    employeePostId: string | null;
    columns?: unknown[];
    deleted?: boolean | null;
    autoLoad?: boolean;
    applyOnSelect?: boolean;
    compact?: boolean;
    disabled?: boolean;
  }

  export const TablePresetPicker: DefineComponent<TablePresetPickerProps>;

  // --- FullLoader ---

  export interface FullLoaderProps {
    /** v-model — показать оверлей */
    modelValue?: boolean;
    /** Минимальное время показа (мс) */
    minShowTime?: number;
  }

  export const FullLoader: DefineComponent<FullLoaderProps>;

  // Остальные компоненты (детальные пропсы при необходимости дополняйте по аналогии)
  export const ConstructorReportsQueue: Component;
  export const ConstructorReports: Component;
  export const PatientInfoComponent: Component;
  export const NewBenefitList: Component;
  export const BenefitForm: Component;
  export const ApplicationForm: Component;
  export const ApiUseBenefit: Component;
  export const ScanWriteOffMedicalDevicesFormMDLP: Component;
  export const IsOkay: Component;
  export const InventoryV2Page: Component;

  /** Приёмка по накладным v2 (слоты scanner, stock-filter — выбор склада и сканер из приложения). */
  export const PriemkaV2Page: Component;

  /** Готовая страница приёмки: PriemkaV2Page со складом и сканером. */
  export const PriemkaPage: Component;

  // API
  export function configureApi(config: { baseURL: string; token?: string; headers?: Record<string, string> }): void;
  export function getApiConfig(): { baseURL: string; token: string; headers: Record<string, string> };
  export function updateToken(token: string): void;
  export function setNotifyLib(notifyFn: (options: { type: string; title: string; text: string }, timeout: number) => void): void;

  export function useAxios(): unknown;

  // Axios setup
  export function setupAxios(instance: unknown): void;
  export function getAxiosInstance(): unknown;
  export function updateAxiosToken(token: string): void;
  export function updateAxiosConfig(config: Record<string, unknown>): void;
  export function getAxiosConfiguration(): Record<string, unknown>;

  // Stores
  export function useUserStore(): unknown;
  export function usePatientStore(): unknown;
  export function useStockStore(): unknown;

  // Pinia
  export function usePinia(): unknown;
  export function providePinia(app: App, pinia: unknown): void;
  export const PINIA_KEY: symbol;

  /** Регулярное выражение полного скана SGTIN Data Matrix (01, 21, 91, 92). */
  export const SGTIN_DATAMATRIX_FULL_SCAN_RE: RegExp;
  export function normalizeSgtinScanString(value: string | null | undefined): string;
  export function shouldValidateSgtinDatamatrixScan(value: string | null | undefined): boolean;
  export function isValidSgtinDatamatrixFullScan(value: string | null | undefined): boolean;
  export function getSgtinDatamatrixScanValidationError(value: string | null | undefined): string | null;

  /** Composable: авторизация в МДЛП и подписание/отправка MDLP-документов (накладных). */
  export function useMdlpDocumentSign(options?: {
    http: unknown;
    apiBaseUrl?: string;
    authBaseUrl?: string;
    paths?: Partial<{
      documentXml: string;
      sendMdlp: string;
      authData: string;
      mdlpSession: string;
      tokenMdlp: string;
    }>;
    tokenKey?: string;
    onSuccess?: (msg: string) => void;
    onError?: (msg: string, err?: unknown) => void;
  }): Record<string, unknown>;

  // Плагин
  export function createBmsComponentsPlugin(options?: Record<string, unknown>): { install(app: App): void };

  // Установка как плагин Vue
  export function install(app: App, options?: Record<string, unknown>): void;

  const plugin: { install: typeof install };
  export default plugin;
}
