/*
    Предрейсовые осмотры - мобильное приложение
    Универсальные валидаторы для форм (URL, числа и т.д.)
*/

//---------------------
//Подключение библиотек
//---------------------

//---------
//Константы
//---------

//Сообщения об ошибках валидации (единый источник для масштабирования)
const VALIDATION_MESSAGES = {
    SERVER_URL_EMPTY: 'Введите адрес сервера',
    SERVER_URL_PROTOCOL: 'Используйте http:// или https:// протокол',
    SERVER_URL_INVALID: 'Некорректный формат адреса сервера',
    SERVER_URL_INVALID_SHORT: 'Некорректный формат URL',
    IDLE_TIMEOUT_EMPTY: 'Введите время простоя',
    IDLE_TIMEOUT_MIN: 'Введите положительное число (минимум 1 минута)',
    IDLE_TIMEOUT_MAX: 'Максимальное значение: 1440 минут (24 часа)'
};

//-----------
//Тело модуля
//-----------

//Нормализация URL сервера для сравнения (без завершающих слэшей)
function normalizeServerUrl(url) {
    if (!url || typeof url !== 'string') {
        return '';
    }
    return url.trim().replace(/\/+$/, '') || '';
}

//Валидация URL сервера. Возвращает true при успехе, иначе строку с ошибкой
function validateServerUrl(url, options) {
    const opts = options || {};
    const emptyMessage = opts.emptyMessage || VALIDATION_MESSAGES.SERVER_URL_EMPTY;
    const invalidMessage = opts.invalidMessage || VALIDATION_MESSAGES.SERVER_URL_INVALID_SHORT;
    const allowEmpty = opts.allowEmpty === true;

    if (!url || !String(url).trim()) {
        if (allowEmpty) {
            return true;
        }
        return emptyMessage;
    }

    try {
        const parsedUrl = new URL(String(url).trim());
        if (!parsedUrl.protocol.startsWith('http')) {
            return VALIDATION_MESSAGES.SERVER_URL_PROTOCOL;
        }
        return true;
    } catch (e) {
        return invalidMessage;
    }
}

//Валидация URL сервера с допуском пустого значения
function validateServerUrlAllowEmpty(url) {
    return validateServerUrl(url, { allowEmpty: true });
}

//Валидация времени простоя (минуты). Возвращает true при успехе, иначе строку с ошибкой
function validateIdleTimeout(value, options) {
    const opts = options || {};
    const min = opts.min !== undefined ? opts.min : 1;
    const max = opts.max !== undefined ? opts.max : 1440;
    const emptyMessage = opts.emptyMessage || VALIDATION_MESSAGES.IDLE_TIMEOUT_EMPTY;
    const minMessage = opts.minMessage || VALIDATION_MESSAGES.IDLE_TIMEOUT_MIN;
    const maxMessage = opts.maxMessage || VALIDATION_MESSAGES.IDLE_TIMEOUT_MAX;

    if (!value || !String(value).trim()) {
        return emptyMessage;
    }

    const num = parseInt(String(value).trim(), 10);
    if (isNaN(num) || num < min) {
        return minMessage;
    }
    if (num > max) {
        return maxMessage;
    }
    return true;
}

//----------------
//Интерфейс модуля
//----------------

module.exports = {
    VALIDATION_MESSAGES,
    normalizeServerUrl,
    validateServerUrl,
    validateServerUrlAllowEmpty,
    validateIdleTimeout
};
