import requests

from app.settings import (
    KEEPEDU_GESTOR_LOGIN_URL,
    KEEPEDU_IMPORTAR_TIMEOUT_SECONDS,
    KEEPEDU_LOGIN_SCHOOL,
    KEEPEDU_ORIGIN_URL,
    KEEPEDU_API_KEY,
    KEEPEDU_LOGIN_URL,
)


def _mensagem_resposta(resposta: requests.Response, prefixo: str) -> str:

    status_code = resposta.status_code

    try:
        dados = resposta.json()

        print("DADOS COMPLETOS:")
        print(dados)

    except ValueError:
        dados = {}

        texto = " ".join(str(resposta.text or "").split())

        if "<html" in texto.lower() or "<!doctype" in texto.lower():
            return f"{prefixo}: HTTP {status_code} retornou HTML em vez de JSON."

        if texto:
            return f"{prefixo}: HTTP {status_code} - {texto[:220]}"

        return f"{prefixo}: HTTP {status_code}."

    if isinstance(dados, dict):

        for chave in ("mensagem", "message", "error", "erro"):

            valor = dados.get(chave)

            if isinstance(valor, list):

                itens = [
                    str(item).strip()
                    for item in valor
                    if str(item).strip()
                ]

                if itens:
                    return " | ".join(itens[:3])

            elif valor:
                return str(valor).strip()

        if dados.get("success") is False:
            return f"{prefixo}: credenciais rejeitadas."

    return f"{prefixo}: HTTP {status_code}."


def autenticar_keepedu(
    email: str,
    senha: str
) -> tuple[bool, str, dict]:

    email = str(email or "").strip()
    senha = str(senha or "").strip()

    if not email or not senha:
        return False, "Informe e-mail e senha.", {}

    print("===================================")
    print("KEEPEDU_LOGIN_URL:", KEEPEDU_LOGIN_URL)
    print("===================================")

    if KEEPEDU_LOGIN_URL:

        payload = {
            "email": email,
            "senha": senha,
            "school": KEEPEDU_LOGIN_SCHOOL,
        }

        sessao = requests.Session()

        try:

            # abre página antes para simular navegador
            sessao.get(
                KEEPEDU_GESTOR_LOGIN_URL,
                headers={
                    "User-Agent": "Mozilla/5.0",
                    "Apikey": KEEPEDU_API_KEY
                }
            )

            print("===================================")
            print("LOGIN KEEPEDU")
            print("URL:", KEEPEDU_LOGIN_URL)
            print("PAYLOAD:", payload)
            print("===================================")

            resposta = sessao.post(
            KEEPEDU_LOGIN_URL,

            json=payload,

            headers={
                "Accept": "application/json",
                "Content-Type": "application/json",
                "User-Agent": "Mozilla/5.0",
                "Referer": KEEPEDU_GESTOR_LOGIN_URL,
                "Origin": KEEPEDU_ORIGIN_URL,

                # IMPORTANTE
                "Apikey": KEEPEDU_API_KEY,
            },

            allow_redirects=True,
            timeout=KEEPEDU_IMPORTAR_TIMEOUT_SECONDS,
        )

            print("===================================")
            print("STATUS:", resposta.status_code)
            print("URL FINAL:", resposta.url)
            print("COOKIES:", sessao.cookies.get_dict())
            print("BODY:", resposta.text[:1000])
            print("===================================")

        except requests.RequestException as exc:

            print("===================================")
            print("ERRO REQUEST:", str(exc))
            print("===================================")

            return False, (
                f"Não foi possível conectar ao login Keep: {exc}"
            ), {}

        # valida status
        if resposta.status_code not in [200, 201, 302]:

            return False, _mensagem_resposta(
                resposta,
                "Login Keep"
            ), {}

        # tenta ler json
        try:
            dados = resposta.json()

        except ValueError:
            dados = {}

        # API retornou erro
        if isinstance(dados, dict):

            if dados.get("success") is False:

                return False, (
                    dados.get("message")
                    or "Login inválido."
                ), {}
                
        user = dados.get("auth", {}).get("user", {})

        print("USER:")
        print(user)

        print("NOME:")
        print(user.get("name"))

        cookies = sessao.cookies.get_dict()

        print("===================================")
        print("LOGIN KEEPEDU REALIZADO")
        print("COOKIES:", cookies)
        print("===================================")

        user = dados.get("auth", {}).get("user", {})

        return True, "", {
            "id": user.get("id"),
            "name": user.get("name"),
            "email": user.get("email"),
            "origem": "keepedu",
        }

    return False, "Credenciais inválidas.", {}