package ru.forbion.f7cloud.core.auth

import java.net.ConnectException
import java.net.SocketTimeoutException
import java.net.UnknownHostException
import java.security.cert.CertPathValidatorException
import javax.net.ssl.SSLException
import javax.net.ssl.SSLHandshakeException
import javax.net.ssl.SSLPeerUnverifiedException

fun Throwable.toLoginErrorMessage(): String {
    val msg = message.orEmpty()
    if (this is SSLPeerUnverifiedException ||
        this is SSLHandshakeException ||
        this is CertPathValidatorException ||
        this is SSLException ||
        msg.contains("not verified", ignoreCase = true) ||
        msg.contains("CertificateException", ignoreCase = true) ||
        msg.contains("Trust anchor", ignoreCase = true)
    ) {
        return "Ошибка HTTPS: сертификат не совпадает с адресом сервера. " +
            "Проверьте URL (https://ваш-домен). " +
            "Для внутреннего dev-сервера без Let's Encrypt включите «Доверять сертификату»."
    }
    if (this is UnknownHostException) {
        return "Сервер не найден. Проверьте адрес (например https://cloud.ваш-домен.ru)."
    }
    if (this is ConnectException) {
        return "Не удалось подключиться к серверу. Проверьте интернет и адрес."
    }
    if (this is SocketTimeoutException) {
        return "Сервер не отвечает (таймаут)."
    }
    if (msg.contains("401", ignoreCase = true) ||
        msg.contains("Unauthorised", ignoreCase = true) ||
        msg.contains("997", ignoreCase = true)
    ) {
        return "Неверный логин или пароль. " +
            "Проверьте учётные данные. При включённой 2FA нужен пароль приложения из настроек безопасности."
    }
    if (msg.startsWith("Auth failed:")) {
        return msg.removePrefix("Auth failed: ").ifBlank { "Ошибка авторизации" }
    }
    return msg.ifBlank { "Ошибка входа" }
}

fun normalizeServerUrl(raw: String): String {
    val trimmed = raw.trim().trimEnd('/')
    if (trimmed.isEmpty()) return trimmed
    return when {
        trimmed.startsWith("http://", ignoreCase = true) -> trimmed
        trimmed.startsWith("https://", ignoreCase = true) -> trimmed
        else -> "https://$trimmed"
    }
}
