"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.getCachedTableStructure = getCachedTableStructure;
exports.getColumnIndex = getColumnIndex;
exports.checkRowMatch = checkRowMatch;
exports.resolveColumnIndexForVerify = resolveColumnIndexForVerify;
const logger_1 = require("../../../utils/logger");
const timeouts_1 = require("../../../timeouts");
/**
 * Кеширует структуру таблицы (заголовки и их индексы).
 * @param tableRoot - локатор контейнера таблицы или страница (для грида на всей странице)
 * @param textUtils - утилита нормализации текста
 * @returns Map с нормализованными названиями колонок и их индексами
 */
async function getCachedTableStructure(tableRoot, textUtils) {
    const headers = await tableRoot.getByRole('columnheader').allInnerTexts();
    const columnIndexes = new Map();
    headers.forEach((h, idx) => {
        const normalizedHeader = textUtils.normalizeText(h);
        if (normalizedHeader !== '') {
            columnIndexes.set(normalizedHeader, idx);
        }
    });
    return columnIndexes;
}
/**
 * Определяет индекс колонки по rowKey.
 * @returns индекс колонки, или undefined если колонка не найдена
 */
function getColumnIndex(columnIndexes, rowKey, textUtils) {
    const normalizedRowKey = textUtils.normalizeText(rowKey);
    const keyColumnIndex = columnIndexes.get(normalizedRowKey);
    if (keyColumnIndex !== undefined) {
        return keyColumnIndex;
    }
    return undefined;
}
/**
 * Проверяет строку на соответствие keyValue.
 * @param row - локатор строки
 * @param keyValue - нормализованное значение для поиска
 * @param keyColumnIndex - индекс колонки или -1 для поиска по всем колонкам
 * @param textUtils - утилита нормализации текста
 * @param loggerContext - опциональный контекст для логов
 */
async function checkRowMatch(row, keyValue, keyColumnIndex, textUtils, loggerContext) {
    if (keyColumnIndex === -1) {
        const cells = row.getByRole('cell');
        const cellCount = await cells.count();
        for (let i = 0; i < cellCount; i++) {
            const cell = cells.nth(i);
            try {
                await cell.waitFor({ state: 'visible', timeout: timeouts_1.TIMEOUTS.ACTION });
                const cellText = await cell.textContent();
                const normalizedCellText = textUtils.normalizeTextForComparison(cellText || '');
                if (normalizedCellText === keyValue) {
                    return true;
                }
            }
            catch {
                logger_1.logger.debug(`Ячейка ${i} не стала видимой, пропускаем`, loggerContext ?? 'TableRowUtils.checkRowMatch');
                continue;
            }
        }
    }
    else {
        const cell = row.getByRole('cell').nth(keyColumnIndex);
        try {
            await cell.waitFor({ state: 'visible', timeout: timeouts_1.TIMEOUTS.ACTION });
            const cellText = await cell.textContent();
            const normalizedCellText = textUtils.normalizeTextForComparison(cellText || '');
            if (normalizedCellText === keyValue) {
                return true;
            }
        }
        catch {
            logger_1.logger.debug(`Ячейка с индексом ${keyColumnIndex} не стала видимой`, loggerContext ?? 'TableRowUtils.checkRowMatch');
            return false;
        }
    }
    return false;
}
/**
 * Определяет индекс колонки для проверки ячейки по названию из columnIndexes.
 * @param columnIndexes - закешированная структура таблицы
 * @param columnName - название колонки
 * @param textUtils - утилита нормализации текста
 * @param loggerContext - опциональный контекст для логов
 */
async function resolveColumnIndexForVerify(columnIndexes, columnName, textUtils, _loggerContext) {
    const normalizedColumn = textUtils.normalizeText(columnName);
    const columnIndex = columnIndexes.get(normalizedColumn);
    return columnIndex;
}
