"use strict";
Object.defineProperty(exports, "__esModule", {
    value: true
});
function _export(target, all) {
    for(var name in all)Object.defineProperty(target, name, {
        enumerable: true,
        get: Object.getOwnPropertyDescriptor(all, name).get
    });
}
_export(exports, {
    get align () {
        return align;
    },
    get checkSelectionConsistency () {
        return checkSelectionConsistency;
    },
    get getAlignmentClasses () {
        return getAlignmentClasses;
    },
    get getAlignmentComparatorByClass () {
        return getAlignmentComparatorByClass;
    },
    get getDocumentOffsetByElement () {
        return getDocumentOffsetByElement;
    },
    get markLabelAsSelected () {
        return markLabelAsSelected;
    },
    get prepareHorizontalAlignClass () {
        return prepareHorizontalAlignClass;
    },
    get prepareVerticalAlignClass () {
        return prepareVerticalAlignClass;
    }
});
const _array = require("../../helpers/array");
function prepareVerticalAlignClass(className, alignment) {
    if (className.indexOf(alignment) !== -1) {
        return className;
    }
    const replacedClassName = className.replace('htTop', '').replace('htMiddle', '').replace('htBottom', '').replace('  ', '');
    return `${replacedClassName} ${alignment}`;
}
function prepareHorizontalAlignClass(className, alignment) {
    if (className.indexOf(alignment) !== -1) {
        return className;
    }
    const replacedClassName = className.replace('htLeft', '').replace('htCenter', '').replace('htRight', '').replace('htJustify', '').replace('  ', '');
    return `${replacedClassName} ${alignment}`;
}
function getAlignmentClasses(ranges, callback) {
    const classes = {};
    (0, _array.arrayEach)(ranges, (range)=>{
        range.forAll((row, col)=>{
            // Alignment classes should only collected within cell ranges. We skip header coordinates.
            if (row >= 0 && col >= 0) {
                if (!classes[row]) {
                    classes[row] = [];
                }
                classes[row][col] = callback(row, col);
            }
        });
    });
    return classes;
}
function align(ranges, type, alignment, cellDescriptor, propertySetter) {
    (0, _array.arrayEach)(ranges, (range)=>{
        range.forAll((row, col)=>{
            // Alignment classes should only collected within cell ranges. We skip header coordinates.
            if (row >= 0 && col >= 0) {
                applyAlignClassName(row, col, type, alignment, cellDescriptor, propertySetter);
            }
        });
    });
}
/**
 * @param {number} row The visual row index.
 * @param {number} col The visual column index.
 * @param {string} type The type of the alignment axis ('horizontal' or 'vertical').
 * @param {string} alignment CSS class name to add.
 * @param {Function} cellDescriptor The function which fetches the cell meta object based in passed coordinates.
 * @param {Function} propertySetter The function which contains logic for added/removed alignment.
 */ function applyAlignClassName(row, col, type, alignment, cellDescriptor, propertySetter) {
    const cellMeta = cellDescriptor(row, col);
    let className = alignment;
    if (cellMeta.className) {
        if (type === 'vertical') {
            className = prepareVerticalAlignClass(cellMeta.className, alignment);
        } else {
            className = prepareHorizontalAlignClass(cellMeta.className, alignment);
        }
    }
    propertySetter(row, col, 'className', className);
}
function markLabelAsSelected(label) {
    // workaround for https://github.com/handsontable/handsontable/issues/1946
    return `<span class="selected">${String.fromCharCode(10003)}</span>${label}`;
}
function checkSelectionConsistency(ranges, comparator) {
    let result = false;
    if (Array.isArray(ranges)) {
        (0, _array.arrayEach)(ranges, (range)=>{
            range.forAll((row, col)=>{
                // Selection consistency should only check within cell ranges. We skip header coordinates.
                if (row >= 0 && col >= 0 && comparator(row, col)) {
                    result = true;
                    return false;
                }
            });
            return result;
        });
    }
    return result;
}
function getDocumentOffsetByElement(elementToCheck, baseDocument) {
    const offset = {
        top: 0,
        left: 0
    };
    if (baseDocument !== elementToCheck.ownerDocument) {
        const { frameElement } = baseDocument.defaultView;
        const { top, left } = frameElement.getBoundingClientRect();
        offset.top = top;
        offset.left = left;
    }
    return offset;
}
function getAlignmentComparatorByClass(htClassName) {
    return function(row, col) {
        const className = this.getCellMeta(row, col).className;
        return className && className.indexOf(htClassName) !== -1;
    };
}
