package com.crm.chat.data.repository

import com.crm.chat.data.api.ApiClient
import com.crm.chat.data.model.AuthResponse
import com.crm.chat.data.model.LoginRequest
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.withContext
import android.util.Log

class AuthRepository(private val apiClient: ApiClient) {

    suspend fun login(email: String, password: String): Result<AuthResponse> {
        return withContext(Dispatchers.IO) {
            try {
                Log.d("AuthRepository", "Начало авторизации для email: $email")
                
                val request = LoginRequest(email = email, password = password)
                Log.d("AuthRepository", "Отправка запроса на авторизацию")
                
                val response = apiClient.authApiService.loginExtension(request)
                
                Log.d("AuthRepository", "Получен ответ: код=${response.code()}, успешный=${response.isSuccessful}")
                
                if (response.isSuccessful) {
                    val authResponse = response.body()
                    Log.d("AuthRepository", "Тело ответа: $authResponse")
                    
                    if (authResponse != null) {
                        Log.d("AuthRepository", "Токен: ${authResponse.token}")
                        if (authResponse.token.isNotBlank()) {
                            Log.d("AuthRepository", "Авторизация успешна")
                            Result.success(authResponse)
                        } else {
                            Log.e("AuthRepository", "Сервер вернул пустой токен")
                            Result.failure(Exception("Сервер вернул пустой токен. Проверьте правильность email и пароля."))
                        }
                    } else {
                        Log.e("AuthRepository", "Сервер вернул null в теле ответа")
                        Result.failure(Exception("Сервер вернул пустой ответ. Проверьте подключение к серверу и правильность URL."))
                    }
                } else {
                    val errorBody = response.errorBody()?.string()
                    Log.e("AuthRepository", "Ошибка HTTP: код=${response.code()}, сообщение=${response.message()}, тело=${errorBody}")
                    
                    val errorMessage = when (response.code()) {
                        400 -> "Некорректный запрос (400). Проверьте введенные данные и формат email."
                        401 -> "Неверный email или пароль (401). Проверьте правильность введенных данных."
                        403 -> "Доступ запрещен (403). Проверьте API ключ и права доступа."
                        404 -> "Сервер не найден (404). Проверьте URL сервера и подключение к сети."
                        405 -> "Метод не разрешен (405). Эндпоинт не существует или недоступен."
                        422 -> "Некорректные данные (422). Проверьте формат email и пароля."
                        500 -> "Ошибка сервера (500). Сервер временно недоступен, попробуйте позже."
                        502, 503, 504 -> "Проблемы с сервером (${response.code()}). Проверьте подключение к серверу."
                        else -> "Ошибка входа: ${response.code()} ${response.message()}\nДетали: ${errorBody ?: "Нет дополнительной информации"}"
                    }
                    Result.failure(Exception(errorMessage))
                }
            } catch (e: Exception) {
                Log.e("AuthRepository", "Исключение при авторизации", e)
                val errorMessage = when (e) {
                    is java.net.UnknownHostException -> "Нет подключения к серверу. Проверьте интернет-соединение и правильность URL."
                    is java.net.SocketTimeoutException -> "Таймаут соединения. Проверьте подключение к серверу и попробуйте снова."
                    is java.io.IOException -> "Ошибка сети. Проверьте подключение к интернету."
                    else -> "Неожиданная ошибка: ${e.message}"
                }
                Result.failure(Exception(errorMessage))
            }
        }
    }

    suspend fun loginExtension(email: String, password: String): Result<AuthResponse> {
        return withContext(Dispatchers.IO) {
            try {
                val request = LoginRequest(email = email, password = password)
                val response = apiClient.authApiService.loginExtension(request)

                if (response.isSuccessful) {
                    val authResponse = response.body()
                    if (authResponse != null) {
                        Result.success(authResponse)
                    } else {
                        Result.failure(Exception("Empty response body"))
                    }
                } else {
                    val errorMessage = when (response.code()) {
                        401 -> "Неверный email или пароль"
                        403 -> "Доступ запрещен"
                        404 -> "Сервер не найден"
                        500 -> "Ошибка сервера"
                        else -> "Ошибка входа: ${response.code()} ${response.message()}"
                    }
                    Result.failure(Exception(errorMessage))
                }
            } catch (e: Exception) {
                Result.failure(e)
            }
        }
    }
}
