import { type CSSProperties, type ReactNode } from 'react';
import { type Target } from '../utils/redirectToLink';
import { type Variant } from './enums';
import type { NoDataProps } from './NoData';
export type AlignVariant = 'left' | 'center' | 'right';
export type SortState = 'asc' | 'desc';
export type RenderCell<TData> = (params: TData) => ReactNode;
export type CellValue = unknown;
export type DataGridProps<TData extends Record<string, CellValue> = DataGridRow, TSortField extends keyof TData = keyof TData> = {
    /**
     * Название класса, применяется к корневому компоненту
     */
    className?: string;
    /**
     * Массив данных для таблицы
     */
    rows: DataGridRowWithOptions<TData>[];
    /**
     * @example <DataGrid columns={[
     *   {
     *     field: 'test',
     *     label: 'Тестовая колонка',
     *     sortable: true,
     *   }]} />
     * Конфигурация колонок для таблицы
     */
    columns: DataGridColumns<TData>[];
    /**
     * Идентификатор активного элемента массива rows. Выделяет активную строку в таблице
     *
     * @deprecated Не поддерживается, параметр будет удален в следующей major версии пакета.
     * Мотивация: Использование активного элемента не является типичным сценарием использования таблицы.
     */
    activeRowId?: string;
    /**
     * Поле, которое будет использоваться в качестве ключа
     */
    keyId: keyof TData;
    /**
     * @example <DataGrid selectedRows={[{name: 'test'}]} />
     * Массив выбранных строк
     */
    selectedRows?: TData[];
    /**
     * @example <DataGrid sorting={{fieldId: 'test', sort: 'asc'}} />
     * Параметры сортируемой колонки
     */
    sorting?: DataGridSort<TSortField>;
    /**
     * Компонент кастомного футера (например Pagination)
     */
    footer?: ReactNode;
    /**
     *  Используется для отображения placeholder при отсутствии данных в таблице
     */
    noDataPlaceholder?: ReactNode;
    /**
     * Максимальная высота для таблицы
     */
    maxHeight?: number;
    /**
     * Если true, показывается анимация загрузки
     */
    isLoading?: boolean;
    /**
     * Если true, таблица будет заблокирована для взаимодействия
     */
    isDisabled?: boolean;
    /**
     * Флаг состояния ошибки
     */
    isError?: boolean;
    /**
     * Текст ошибки
     */
    errorMsg?: string;
    /**
     * Вариант отображения вложенных элементов
     * @default 'tree'
     */
    variant?: `${Variant}`;
    /**
     * Опции для отображения древовидных списков
     * Применяется если variant="tree"
     */
    tree?: {
        /**
         * Если true, то дерево будет раскрыто по умолчанию
         * @default 'false'
         */
        isInitialExpanded?: boolean;
        /**
         * Уровень раскрытия дерева по умолчанию, при `isInitialExpanded=true`
         * @default '1'
         */
        expandedLevel?: number;
        /**
         * Количество отображаемых по умолчанию дочерних элементов
         * @default '2'
         */
        initialVisibleChildrenCount?: number;
    };
    /**
     * Опции для отображения вложенных списков
     * Применяется если variant="subrows"
     */
    subrows?: {
        /**
         * Уровень раскрытия дочерних элементов по умолчанию, при `isInitialExpanded=true`
         * @default '1'
         */
        expandedLevel?: number;
        /**
         * Количество отображаемых по умолчанию дочерних элементов
         * @default '2'
         */
        initialVisibleChildrenCount?: number;
        /**
         * Номер колонки, в которой будет расположена кнопка "Показать все"
         * @default 1
         */
        moreButtonColumnPosition?: number;
        /**
         * Если false, кнопка разворачивания элементов не показывается
         * @default true
         */
        isVisibleCollapseButton?: boolean;
    };
    /**
     * Заглушка для пустых ячеек (если отсутствует field и filter и renderCell)
     * @default '—'
     */
    emptyCellValue?: ReactNode;
    /**
     * Используется для отображения переданного кол-ва строк при отсутствии данных
     * @default 10
     * @deprecated Не поддерживается, параметр будет удален в следующей major версии пакета.
     * Мотивация: задание минимальной высоты через параметр компонента мешает корректной работе таблицы
     * в части верстки.
     * Чтобы отключить минимальную высоту таблицы, задайте в ConfigProvider:
     * `components.dataGrid.defaultProps.disableMinHeight: true`
     */
    minDisplayRows?: number;
    /**
     * Функция обработки нажатия на кнопку "Повторить запрос"
     */
    onRetry: () => void;
    /**
     * Обработчик клика строки таблицы
     */
    onRowClick?: (row: TData) => void;
    /**
     * Обработчик выбора строки
     */
    onSelectRow?: (row: TData[]) => void;
    /**
     * @example <DataGrid onSort={({fieldId: 'test', sort: 'asc'}) => console.log('sorted')} />
     * Обработчик сортировки
     */
    onSort?: (sorting: DataGridSort<TSortField> | undefined) => void;
    /**
     * Используется для кастомизации компонента, использующегося в сценарии отсутствия данных
     */
    noDataOptions?: NoDataProps;
    /**
     * Используется для скрытия чекбокса "Выбрать все"
     */
    isHideSelectAll?: boolean;
    /**
     * Место для рендера перед head страницы
     * @private Предполагается для использования в реализации изменения размеров таблицы
     */
    headPreAddon?: ReactNode;
    /**
     * Убирает шапку таблицы, когда нет данных
     */
    isHideHeaderIfNoData?: boolean;
    /**
     * Режим отображения разделителей в таблице
     * @default standard
     */
    gridViewMode?: 'full' | 'standard';
};
export type DataGridSort<TSortField> = {
    /**
     * @example {fieldId: 'test'}
     * Значение поля сортируемой колонки
     */
    fieldId: TSortField;
    /**
     * @example {sort: 'asc'}
     * Значение возрастающий или убывающий сортировки (asc | desc)
     */
    sort: SortState;
};
export type DataGridGroupColumn<TData extends Record<string, CellValue>> = {
    /**
     * Группа дочерних колонок
     */
    children: DataGridSingleColumn<TData>[];
    /**
     * Принимает компонент DataGridColumnHintIcon - подсказка в шапке колонки
     */
    columnHint?: ReactNode;
    /**
     * Название колонки таблицы
     */
    label: string;
    /**
     * Закрепление группы дочерних колонок в таблице
     */
    pinned?: 'left' | 'right';
    /**
     * Скрывает группу колонок на мобильных устройствах
     */
    isHideOnMobile?: boolean;
    /**
     * Скрывает название группы колонок на мобильных устройствах
     */
    hideTitleOnMobile?: boolean;
    /**
     * Скрывает персональные данные в группе колонок
     */
    isHidePersonalData?: boolean;
};
export type DataGridSingleColumn<TData extends Record<string, CellValue>> = {
    /**
     * @example {field: 'test'}
     * Значение ключа поля данных для колонки
     */
    field?: keyof TData;
    /**
     * Название колонки таблицы
     */
    label?: string;
    /**
     * Если true, будет включена сортировка колонки
     */
    sortable?: boolean;
    pointer?: boolean;
    /**
     * @example {renderCell: (row) => <div>Hello Cell</div>'}
     * Кастомное отображение ячеек для колонки
     */
    renderCell?: RenderCell<TData>;
    /**
     * @example {format: (row) => new Date(row.createDate).toLocaleDateString()}
     * Функция для кастомного форматирования данных ячеек для колонки
     */
    format?: (data: TData) => CellValue;
    /**
     * CSS свойство размещения контента в ячейке
     */
    align?: AlignVariant;
    /**
     * @example {width: '100%'}
     * Ширина ячейка. Допустимые единицы: px, %, fr
     */
    width?: CSSProperties['width'];
    /**
     * @example {minWidth: '120px'}
     * Минимальная ширина ячейки в px
     */
    minWidth?: `${string}px`;
    /**
     * Скрывает содержимое столбца от инструментов мониторинга
     */
    isHidePersonalData?: boolean;
    /**
     * Принимает компонент DataGridColumnHintIcon - подсказка в шапке колонки
     */
    columnHint?: ReactNode;
    /**
     * Закрепление колонки в таблице
     */
    pinned?: 'left' | 'right';
    /**
     * Скрывает колонку на мобильных устройствах
     */
    isHideOnMobile?: boolean;
    /**
     * Скрывает заголовок колонки на мобильных устройствах
     */
    hideTitleOnMobile?: boolean;
    children?: never;
};
export type DataGridColumns<TData extends Record<string, CellValue>> = DataGridSingleColumn<TData> | DataGridGroupColumn<TData>;
export type DataGridRowOptionColumns<TData extends Record<string, CellValue>> = {
    /**
     * Значение ключа поля данных для колонки
     */
    field: keyof TData;
    /**
     * Кастомное отображение ячеек для колонки
     */
    renderCell?: RenderCell<TData>;
};
export type DataGridRowOptions<TData extends Record<string, CellValue>> = {
    /**
     * Если true, строка будет недоступна для взаимодействия
     */
    isDisabled?: boolean;
    /**
     * Если true, последняя ячейка не будет блокироваться при `isDisabled=true`
     * @default 'true'
     */
    isDisabledLastCell?: boolean;
    /**
     * Если true, строка не будет доступна для выбора
     */
    isNotSelectable?: boolean;
    /**
     * Причина блокировки строки
     */
    disabledReason?: string;
    /**
     * Настройка отображения колонок дочерних элементов
     */
    childrenColumns?: DataGridRowOptionColumns<TData>[];
    /**
     * Ссылка для перехода на другую страницу при клике на строку
     */
    href?: string;
    /**
     * Способ открытия ссылки
     */
    target?: Target;
};
export type DataGridRow = Record<string, CellValue>;
export type DataGridRowWithOptions<TData extends DataGridRow> = TData & {
    options?: DataGridRowOptions<TData>;
    children?: DataGridRowWithOptions<TData>[];
};
