import httpx
import asyncio
from app.core import config
from app.core.database import add_session, logout, get_session
from app.core.localizer import localizer
from app.core.http_client import get_client, authorized_get


async def login(login, password):
    """
    Логин пользователя по логину и паролю.

    :param login: Логин пользователя
    :param password: Пароль пользователя
    :return: tuple (ok: bool, message: str)
    """
    url = f"{config.BASE_URL}/v1/auth/login"
    try:
        response = await get_client().post(url, json={"login": login, "password": password})

        if response.status_code == 200:
            data = response.json()
            if data.get("status") == "fine":
                token_data = data["data"]
                add_session(
                    login=login,
                    access_token=token_data["access_token"],
                    refresh_token=token_data["refresh_token"],
                    user_id=token_data.get("user_id"),
                )
                return True, localizer.translate("Вход выполнен успешно")
            return False, data.get("detail", localizer.translate("Неизвестная ошибка"))

        if response.status_code == 401:
            return False, localizer.translate("Неверный логин или пароль")
        return False, f"{localizer.translate('Ошибка сервера')}: {response.status_code}"

    except httpx.RequestError as e:
        return False, f"{localizer.translate('Сетевая ошибка')}: {e}"
    except Exception as e:
        return False, f"{localizer.translate('Произошла ошибка')}: {e}"


async def register(login, password, invite=None):
    """
    Регистрация нового пользователя.

    :param login: Логин
    :param password: Пароль
    :param invite: Инвайт-код (опционально)
    :return: tuple (ok: bool, message: str)
    """
    url = f"{config.BASE_URL}/v1/auth/register"
    payload = {"login": login, "password": password}
    if invite:
        payload["invite"] = invite

    try:
        response = await get_client().post(url, json=payload)

        if response.status_code == 201:
            return True, localizer.translate("Регистрация прошла успешно!")

        error_data = response.json()
        error_message = error_data.get("detail", localizer.translate("Произошла ошибка"))

        if response.status_code == 409:
            return False, localizer.translate("Пользователь уже существует.")
        if response.status_code == 400:
            return False, localizer.translate("Некорректный запрос.")
        if response.status_code == 403:
            return False, localizer.translate("Регистрация по приглашению отключена.")
        if response.status_code == 422:
            return False, localizer.translate("Некорректные входные данные. Проверьте логин и пароль.")

        return False, f"{localizer.translate('Ошибка сервера')} ({response.status_code}): {error_message}"

    except httpx.RequestError as e:
        return False, f"{localizer.translate('Сетевая ошибка')}: {e}"
    except Exception as e:
        return False, f"{localizer.translate('Произошла ошибка')}: {e}"


async def refresh_token(access_token: str, refresh_token: str):
    """
    Обновление пары токенов по refresh_token.

    :param access_token: Текущий access token
    :param refresh_token: Refresh token
    :return: tuple (ok: bool, data: dict | str)
    """
    url = f"{config.BASE_URL}/v1/auth/token/refresh"
    payload = {"access_token": access_token, "refresh_token": refresh_token}
    print("payload", payload)

    try:
        response = await get_client().post(url, json=payload)

        if response.status_code == 200:
            data = response.json()
            if data.get("status") == "fine":
                token_data = data["data"]
                add_session(
                    old_access_token=access_token,
                    old_refresh_token=refresh_token,
                    access_token=token_data["access_token"],
                    refresh_token=token_data["refresh_token"],
                    update_existing=True,
                )
                return True, token_data
            return False, data.get("detail", localizer.translate("Неизвестная ошибка"))

        if response.status_code == 401:
            print("response.status_code", response.json())
            return False, localizer.translate("Токен недействителен или истек")
        return False, f"{localizer.translate('Ошибка сервера')}: {response.status_code}"

    except httpx.RequestError as e:
        return False, f"{localizer.translate('Сетевая ошибка')}: {e}"
    except Exception as e:
        return False, f"{localizer.translate('Произошла ошибка')}: {e}"


async def get_user_role(access_token: str, login: str):
    """
    Получение роли пользователя. При 401 выполняется автообновление токена внутри authorized_get.
    """
    url = f"{config.BASE_URL}/v1/user/role"
    headers = {"Authorization": f"Bearer {access_token}"}

    try:
        response = await authorized_get(url, login=login, access_token=access_token, headers=headers)

        if response.status_code == 200:
            data = response.json()
            return (True, data['data']) if data.get("status") == "fine" else (False, data.get("detail", localizer.translate("Неизвестная ошибка")))

        if response.status_code == 401:
            return False, localizer.translate("?? ???????????")
        return False, f"{localizer.translate('Ошибка сервера')}: {response.status_code}"

    except httpx.RequestError as e:
        return False, f"{localizer.translate('Сетевая ошибка')}: {e}"
    except Exception as e:
        return False, f"{localizer.translate('Произошла ошибка')}: {e}"


