package com.crm.chat.ui.auth

import androidx.lifecycle.LiveData
import androidx.lifecycle.MutableLiveData
import androidx.lifecycle.ViewModel
import androidx.lifecycle.viewModelScope
import com.crm.chat.data.AppConstants
import com.crm.chat.data.api.ApiClient
import com.crm.chat.data.model.AuthResponse
import com.crm.chat.data.repository.AuthRepository
import kotlinx.coroutines.launch

class AuthViewModel : ViewModel() {

    private val _loginState = MutableLiveData<LoginState>()
    val loginState: LiveData<LoginState> = _loginState

    private val apiClient = ApiClient("") // Will be updated with server URL
    private val authRepository = AuthRepository(apiClient)

    fun login(email: String?, password: String?) {
        // Валидация входных данных
        val validationError = validateInput(email, password)
        if (validationError != null) {
            _loginState.value = LoginState.Error(validationError)
            return
        }

        _loginState.value = LoginState.Loading

        viewModelScope.launch {
            try {
                // Используем константы из AppConstants
                val updatedApiClient = ApiClient(AppConstants.SERVER_URL, AppConstants.API_KEY)
                val updatedRepository = AuthRepository(updatedApiClient)

                val result = updatedRepository.login(email!!, password!!)
                result.fold(
                    onSuccess = { authResponse ->
                        if (!authResponse.token.isNullOrBlank()) {
                            _loginState.value = LoginState.Success(authResponse, AppConstants.SERVER_URL)
                        } else {
                            _loginState.value = LoginState.Error("Сервер вернул пустой токен. Проверьте правильность email и пароля.")
                        }
                    },
                    onFailure = { exception ->
                        _loginState.value = LoginState.Error(exception.message ?: "Ошибка входа. Проверьте подключение к серверу и правильность введенных данных.")
                    }
                )
            } catch (e: Exception) {
                _loginState.value = LoginState.Error("Неожиданная ошибка: ${e.message}. Попробуйте перезапустить приложение.")
            }
        }
    }

    // Старый метод для совместимости (если понадобится)
    fun loginWithCustomServer(serverUrl: String?, apiKey: String?, email: String?, password: String?) {
        // Валидация входных данных
        val validationError = validateInput(serverUrl, apiKey, email, password)
        if (validationError != null) {
            _loginState.value = LoginState.Error(validationError)
            return
        }

        _loginState.value = LoginState.Loading

        viewModelScope.launch {
            try {
                // Update API client with server URL and API key
                val updatedApiClient = ApiClient(serverUrl!!, apiKey!!)
                val updatedRepository = AuthRepository(updatedApiClient)

                val result = updatedRepository.login(email!!, password!!)
                result.fold(
                    onSuccess = { authResponse ->
                        if (!authResponse.token.isNullOrBlank()) {
                            _loginState.value = LoginState.Success(authResponse, serverUrl)
                        } else {
                            _loginState.value = LoginState.Error("Сервер вернул пустой токен. Проверьте правильность email и пароля.")
                        }
                    },
                    onFailure = { exception ->
                        _loginState.value = LoginState.Error(exception.message ?: "Ошибка входа. Проверьте подключение к серверу и правильность введенных данных.")
                    }
                )
            } catch (e: Exception) {
                _loginState.value = LoginState.Error("Неожиданная ошибка: ${e.message}. Попробуйте перезапустить приложение.")
            }
        }
    }

    private fun validateInput(email: String?, password: String?): String? {
        return when {
            email.isNullOrBlank() -> "Электронная почта обязательна для авторизации"
            password.isNullOrBlank() -> "Пароль обязателен для авторизации"
            else -> null
        }
    }

    private fun validateInput(serverUrl: String?, apiKey: String?, email: String?, password: String?): String? {
        return when {
            apiKey.isNullOrBlank() -> "API ключ обязателен для подключения к серверу"
            email.isNullOrBlank() -> "Электронная почта обязательна для авторизации"
            password.isNullOrBlank() -> "Пароль обязателен для авторизации"
            serverUrl.isNullOrBlank() -> "URL сервера обязателен для подключения"
            !serverUrl.startsWith("http://") && !serverUrl.startsWith("https://") -> "URL сервера должен начинаться с http:// или https://"
            else -> null
        }
    }

    sealed class LoginState {
        object Loading : LoginState()
        data class Success(val authResponse: AuthResponse, val serverUrl: String) : LoginState()
        data class Error(val message: String) : LoginState()
    }
}
