package com.sshproxy.vpn.util

import com.jcraft.jsch.JSchException
import com.sshproxy.vpn.service.TunnelService
import java.net.ConnectException
import java.net.SocketTimeoutException
import java.net.UnknownHostException

object ConnectionMessages {

    fun stateTitle(state: TunnelService.State): String = when (state) {
        TunnelService.State.CONNECTING -> "Подключение…"
        TunnelService.State.RECONNECTING -> "Переподключение…"
        TunnelService.State.CONNECTED -> "Подключено"
        TunnelService.State.DISCONNECTED -> "Отключено"
        TunnelService.State.ERROR -> "Ошибка"
        TunnelService.State.NEED_VPN_PERMISSION -> "Нужно разрешение VPN"
    }

    fun mapError(throwable: Throwable): String {
        val message = throwable.message?.trim().orEmpty()
        return when (throwable) {
            is UnknownHostException -> "Сервер не найден. Проверьте адрес SSH-хоста."
            is SocketTimeoutException -> "Таймаут подключения к SSH-серверу."
            is ConnectException -> when {
                message.contains("refused", ignoreCase = true) ->
                    "Сервер отклонил соединение. Проверьте хост, порт и доступность SSH."
                message.contains("unreachable", ignoreCase = true) ->
                    "Сеть недоступна. Проверьте интернет-соединение."
                else -> "Не удалось подключиться к серверу: ${message.ifBlank { "нет связи" }}"
            }
            is JSchException -> when {
                message.contains("Auth fail", ignoreCase = true) ||
                    message.contains("authentication", ignoreCase = true) ->
                    "Ошибка авторизации SSH. Проверьте ключ, passphrase, логин и пароль."
                message.contains("UnknownHostKey", ignoreCase = true) ||
                    message.contains("HostKey", ignoreCase = true) ->
                    "Неизвестный ключ сервера. Включите «Принимать неизвестный host key»."
                message.contains("Socket is not connected", ignoreCase = true) ->
                    "Сокет не подключён. Повторите попытку."
                message.isNotBlank() -> "Ошибка SSH: $message"
                else -> "Ошибка SSH-соединения."
            }
            is IllegalStateException, is IllegalArgumentException ->
                message.ifBlank { "Некорректное состояние подключения." }
            else -> message.ifBlank { "Неизвестная ошибка подключения." }
        }
    }
}
