import { Page, Locator } from '@playwright/test';
import { BasePage } from '../BasePage/BasePage';
import type { RowActionsConfiguration } from '../common/RowActions.types';
import type { FormFieldsLocators, FormFieldsData, FormFieldsValues } from '../common/FormFields.types';
import { Role } from '../../utils/test-role-utils';
import { GridRowActionsService } from './services';
import { GridPageConfiguration } from './BaseGridPage.types';
import { ModalWindowConfiguration } from '../common/Modal.types';
import { TableRowService } from '../shared/table/TableRowService';
import { FormFlowService } from '../shared/form/FormFlowService';
/** Общий testId кнопки меню действий строки грида (используется по умолчанию для страниц с type: 'menu'). */
export declare const DEFAULT_GRID_ROW_MENU_ACTION_TEST_IDS: Record<string, string>;
export declare abstract class BaseGridPage extends BasePage {
    abstract GridButtons: Record<string, Locator>;
    /** Локаторы фильтров грида (text / combobox / daData — ключи из конфигурации). */
    abstract GridFilters: Record<string, Locator>;
    /**
     * Локаторы для пунктов меню действий строки
     * Пункты меню находятся в открывшемся меню на странице
     * Пример: { 'MenuItemEdit': page.getByRole('menuitem', { name: 'Редактировать' }), 'MenuItemDelete': page.getByRole('menuitem', { name: 'Удалить' }) }
     */
    GridRowActionMenuItems?: Record<string, Locator>;
    protected readonly tableRowService: TableRowService;
    protected readonly formFlowService: FormFlowService;
    protected gridRowActionsService: GridRowActionsService;
    constructor(page: Page);
    private createFormFlowService;
    /**
     * Создает сервис для работы с действиями над строками грида.
     * @returns GridRowActionsService
     */
    private createGridRowActionsService;
    /**
     * Абстрактный метод для получения конфигурации элементов страницы с гридом в зависимости от роли
     * Должен быть реализован в наследниках с учетом специфики каждой страницы с гридом
     */
    protected abstract getGridPageConfiguration(role: Role): GridPageConfiguration;
    /**
    * Метод для получения конфигурации модальных окон в зависимости от роли
    * Должен быть переопределен в наследниках, если страница имеет модальные окна
    * По умолчанию возвращает пустой массив
    * @param role - роль пользователя
    * @returns Массив конфигураций модальных окон (может быть пустым, если модальных окон нет)
    */
    protected getModalWindowConfigurations(_role: Role): ModalWindowConfiguration[];
    /**
     * Метод для получения конфигурации действий строки в зависимости от роли
     * Должен быть переопределен в наследниках, если страница имеет действия строки
     * По умолчанию возвращает null
     * @param role - роль пользователя
     * @returns Конфигурация действий строки или null, если действия не настроены
     */
    protected getGridRowActionsConfiguration(_role: Role): RowActionsConfiguration | null;
    /**
    * Метод для получения Record кнопок модального окна
    * Должен быть переопределен в наследниках, если страница имеет модальные окна
    * По умолчанию возвращает null
    * @param modalWindowKey - ключ модального окна
    */
    protected getModalWindowButtons(_modalWindowKey: string): Record<string, Locator> | null;
    /**
    * Метод для получения Record полей ввода модального окна
    * Должен быть переопределен в наследниках, если страница имеет модальные окна
    * По умолчанию возвращает null
    * @param _modalWindowKey - ключ модального окна
    */
    protected getModalWindowTextFields(_modalWindowKey: string): Record<string, Locator> | null;
    /**
    * Метод для получения Record radiobutton модального окна
    * Должен быть переопределен в наследниках, если модальное окно имеет вариативное содержание
    * По умолчанию возвращает null
    * @param _modalWindowKey - ключ модального окна
    */
    protected getModalWindowRadioButtons(_modalWindowKey: string): Record<string, Locator> | null;
    /**
    * Метод для получения Record чекбоксов модального окна
    * Должен быть переопределен в наследниках, если модальное окно имеет чекбоксы
    * По умолчанию возвращает null
    * @param _modalWindowKey - ключ модального окна
    */
    protected getModalWindowCheckboxes(_modalWindowKey: string): Record<string, Locator> | null;
    /**
    * Метод для получения Record слайдеров модального окна
    * Должен быть переопределен в наследниках, если модальное окно имеет слайдеры
    * По умолчанию возвращает null
    * @param _modalWindowKey - ключ модального окна
    */
    protected getModalWindowSliders(_modalWindowKey: string): Record<string, Locator> | null;
    /**
    * Метод для получения Record кнопок Toggle модального окна
    * Должен быть переопределен в наследниках, если модальное окно имеет кнопки Toggle
    * По умолчанию возвращает null
    * @param _modalWindowKey - ключ модального окна
    */
    protected getModalWindowToggleButtons(_modalWindowKey: string): Record<string, Locator> | null;
    /**
    * Метод для получения Record combobox полей модального окна
    * Должен быть переопределен в наследниках, если модальное окно имеет поля combobox
    * По умолчанию возвращает null
    * @param _modalWindowKey - ключ модального окна
    */
    protected getModalWindowComboboxFields(_modalWindowKey: string): Record<string, Locator> | null;
    /**
    * Метод для получения Record полей DaData модального окна
    * Должен быть переопределен в наследниках, если модальное окно имеет поля DaData
    * По умолчанию возвращает null
    * @param _modalWindowKey - ключ модального окна
    */
    protected getModalWindowDaDataFields(_modalWindowKey: string): Record<string, Locator> | null;
    /**
    * Метод для получения Record полей multiCombobox модального окна
    * Должен быть переопределен в наследниках, если модальное окно имеет поля multiCombobox
    * По умолчанию возвращает null
    * @param _modalWindowKey - ключ модального окна
    */
    protected getModalWindowMultiComboboxFields(_modalWindowKey: string): Record<string, Locator> | null;
    /**
    * Метод для получения Record полей для загрузки файлов модального окна
    * Должен быть переопределен в наследниках, если модальное окно имеет поля для загрузки файлов
    * По умолчанию возвращает null
    * @param _modalWindowKey - ключ модального окна
    */
    protected getModalWindowFileFields(_modalWindowKey: string): Record<string, Locator> | null;
    /**
    * Возвращает Record testId → ключ для кнопок действий строки.
    * Переопределите в наследнике и верните объект из локаторов, чтобы использовать стандартную реализацию getGridRowActionButtons.
    * По умолчанию возвращает кнопку меню (RowMenuButton: 'actionMenu') для страниц с действиями через меню.
    */
    protected getGridRowActionTestIds(): Record<string, string> | null;
    /**
     * Получает Record локаторов кнопок действий строки для конкретной строки.
     * Стандартная реализация строит локаторы по getGridRowActionTestIds(). Можно переопределить в наследниках при другой разметке.
     * @param rowLocator - локатор строки, для которой нужно получить кнопки
     * @returns Record с локаторами кнопок действий строки или null
     */
    protected getGridRowActionButtons(rowLocator: Locator): Record<string, Locator> | null;
    /**
     * Собирает все локаторы полей формы модального окна
     * @param modalWindowKey - ключ модального окна
     * @returns объект локаторов для formHelper.fillFormFields
     */
    protected getModalWindowFormLocators(modalWindowKey: string): FormFieldsLocators;
    /**
    * Проверяет видимость всех кнопок грида согласно конфигурации для текущей роли
    * @throws {Error} Если какая-либо кнопка не соответствует ожидаемому состоянию видимости
    */
    checkGridButtons(): Promise<void>;
    /**
     * Проверяет видимость полей фильтрации грида (text / combobox / daData).
     * Локаторы берутся из {@link GridFilters}.
     * @throws {Error} Если в конфигурации не задана ни одна группа фильтров
     */
    checkGridFilters(): Promise<void>;
    /**
     * Проверяет наличие необходимых колонок в таблице по их названиям.
     * @param columnNames - массив названий колонок для проверки (например, ['Фамилия', 'Имя', 'Email'])
     */
    verifyRequiredColumns(columnNames: string[]): Promise<void>;
    /**
    * Поиск строки по ключевому полю
    * @param rowKey - название ключевого поля (колонки) для поиска (например, 'email', 'id')
    * @param keyValue - значение ключевого поля для поиска строки
    * @param isNewlyAdded - если true, проверяет только что добавленную строку (использует меньший таймаут)
    * @param customTimeout - кастомные настройки таймаута и интервалов проверки (необязательно)
    * @returns Locator строки или null, если строка не найдена
    * @throws {Error} При ошибках в процессе поиска
    */
    findTableRow(rowKey: string, keyValue: string, isNewlyAdded?: boolean, customTimeout?: {
        timeout: number;
        intervals: number[];
    }): Promise<Locator>;
    /**
    * Кликает по первой ссылке в найденной строке таблицы
    * @param key - объект с ключом и значением для поиска строки
    * @param itemToClick - кликабельный текст в строке таблицы
    * @param keyValue - значение ключевого поля для поиска строки
    * @param isNewlyAdded - если true, ищет среди только что добавленных строк
    * @throws {Error} Если строка не найдена или в строке нет ссылок для клика
    */
    clickInTableRow(key: {
        rowKey: string;
        keyValue: string;
    }, itemToClick: string, isNewlyAdded: boolean): Promise<void>;
    /**
     * Ищет строку в таблице без выброса ошибки (для проверки отсутствия строки)
     * @param rowKey - ключевое поле строки
     * @param keyValue - Значение в ключевом поле строки
     * @returns Locator строки или null, если строка не найдена
     */
    findTableRowSilent(rowKey: string, keyValue: string): Promise<Locator | null>;
    /**
    * Проверяет строку в таблице на соответствие ожидаемым данным
    * @param rowKey - ключевое поле строки (уникальный идентификатор)
    * @param rowData - объект с ожидаемыми данными строки, где ключ - название колонки, значение - ожидаемый текст
    * @param isNewlyAdded - если true, проверяет только что добавленную строку
    * @param onRowFound - колбэк, вызываемый после нахождения строки (даже при ошибках проверки)
    * @throws {Error} Если строка не найдена или данные не соответствуют ожидаемым
    */
    verifyTableRow(rowKey: string, rowData: Record<string, string>, isNewlyAdded: boolean, onRowFound?: (row: Locator) => void): Promise<void>;
    waitForTableRowWithRefresh(rowKey: string, rowData: Record<string, string>, isNewlyAdded: boolean, options: {
        totalTimeout: number;
        refreshIntervals: number[];
        onEachRefresh?: () => Promise<void>;
    }): Promise<void>;
    /**
    * Открывает модальное окно ,заполняет форму и сохраняет.
    * @param modalWindowKey - ключ конфигурации модального окна
    * @param formFields - данные для заполнения полей формы
    * @throws {Error} Если не удается заполнить форму или сохранить
    */
    fillModalForm(modalWindowKey: string, formFields: FormFieldsData): Promise<void>;
    /**
     * Заполняет поля уже открытой модальной формы (без open/save).
     */
    fillModalFormFields(modalWindowKey: string, formFields: FormFieldsData): Promise<void>;
    /**
     * Проверяет все элементы грида (кнопки и поля)
     */
    checkAllGridElements(): Promise<void>;
    /**
    * Открывает модальное окно по кнопке-триггеру
    * @param modalWindowKey - Ключ модального окна из конфигурации
    * @throws {Error} Если модальное окно не открылось
    */
    openModalWindow(modalWindowKey: string): Promise<void>;
    /**
     * Открывает подразделы модального окна с полями
     * @param name - Наименование подраздел(а/ов)
     */
    openModalCategories(name: string[] | string): Promise<void>;
    /**
     * Находит конфигурацию модального окна по ключу.
     * @param role - роль пользователя
     * @param modalWindowKey - ключ модального окна
     * @returns найденная конфигурация
     */
    protected findModalWindowConfig(modalWindowKey: string): ModalWindowConfiguration;
    /**
     * Проверяет, доступно ли действие для текущей роли.
     * @param actionKey - ключ действия
     * @returns true если действие доступно
     */
    isRowActionAvailable(actionKey: string): boolean;
    /**
     * Открывает меню действий над строкой.
     * @param rowLocator - локатор строки
     */
    openRowActionsMenu(rowLocator: Locator): Promise<void>;
    /**
     * Закрывает меню действий над строкой
     */
    closeRowActionsMenu(): Promise<void>;
    /**
     * Универсальный метод для выполнения действия со строкой.
     * @param rowLocator - локатор строки
     * @param actionKey - ключ действия (например, 'MenuItemEdit' или 'RowEditButton')
     */
    clickRowAction(rowLocator: Locator, actionKey: string): Promise<void>;
    /**
     * Проверяет видимость кнопок действий строки.
     * @param rowLocator - локатор строки
     */
    checkGridRowActions(rowLocator: Locator): Promise<void>;
    /**
     * Открывает строку на редактирование.
     * @param rowLocator - локатор строки
     * @returns true если модальное окно успешно открыто
     */
    editRow(rowLocator: Locator): Promise<boolean>;
    /**
     * Открывает строку на просмотр (readonly).
     * @param rowLocator - локатор строки
     * @returns true если модальное окно успешно открыто
     */
    viewRow(rowLocator: Locator): Promise<boolean>;
    /**
     * Удаляет строку (с подтверждением, если требуется).
     * @param rowLocator - локатор строки
     * @param confirmDelete - нужно ли подтверждение удаления (по умолчанию true)
     * @returns true если удаление успешно
     */
    deleteRow(rowLocator: Locator, confirmDelete?: boolean): Promise<boolean>;
    /**
    * Редактирует строку с заполнением формы, сохранением и проверкой результата.
    * @param modalWindowKey - ключ модального окна (из конфигурации страницы)
    * @param rowLocator - локатор строки для редактирования
    * @param expectedRowData - ожидаемые данные после сохранения, где ключ - название колонки, значение - ожидаемый текст
    * @param formFields - объект с полями для заполнения в форме редактирования
    * @param onRowVerified - колбэк, вызываемый после нахождения строки (даже при ошибках проверки)
    * @throws {Error} Если не удалось открыть форму, заполнить, сохранить или данные не совпадают
    */
    editRowAndVerify(modalWindowKey: string, rowLocator: Locator, expectedRowData: Record<string, string>, formFields: FormFieldsData, onRowVerified?: (row: Locator) => void): Promise<void>;
    /**
     * Просматривает строку и проверяет данные.
     * @param rowLocator - локатор строки
     * @param expectedValues - ожидаемые значения полей
     */
    viewRowAndVerify(modalWindowKey: string, rowLocator: Locator, expectedValues: FormFieldsValues): Promise<void>;
    /**
     * Удаляет строку и проверяет, что она исчезла.
     * @param rowKey - ключевое поле строки
     * @param rowData - данные строки для поиска
     * @param confirmDelete - нужно ли подтверждение
     */
    deleteRowAndVerify(rowKey: string, rowData: Record<string, string>, confirmDelete?: boolean): Promise<void>;
    /**
     * Реализация метода активации/деактивации для гридов.
     */
    protected toggleActivationForGrid(rowLocator: Locator, action: 'activate' | 'deactivate', actionType?: 'menu' | 'button', requireConfirmation?: boolean): Promise<void>;
    /**
    * Активирует или деактивирует строку в гриде.
    * @param rowLocator - локатор строки
    * @param action - действие: 'activate' или 'deactivate'
    * @param actionType - тип действия: 'menu' или 'button' (опционально)
    * @param requireConfirmation - требуется ли подтверждение (опционально)
    */
    toggleActivation(rowLocator: Locator, action: 'activate' | 'deactivate', actionType?: 'menu' | 'button', requireConfirmation?: boolean): Promise<void>;
    deleteGridTrashAfterFail(rowLocator: Locator, confirmDelete: boolean): Promise<void>;
}
