"""
whatsapp_sender.py — Wrapper Evolution API pra enviar mensagens WhatsApp.

Stack stdlib-only (urllib, json) — sem dependências externas.

Variáveis de ambiente:
  EVOLUTION_BASE_URL       → URL base da Evolution API (ex: https://evo10169.hostoo.net.br)
  EVOLUTION_API_KEY        → API key do header `apikey`
  EVOLUTION_INSTANCE       → nome da instância (default: Dalton-Pessoal)
  BETA_MODE                → "true" ativa política beta: redireciona TODOS envios pra Caue
  BETA_WHATSAPP_TARGET     → número Caue (default: +5511947452497)
  EVOLUTION_TIMEOUT_SEC    → timeout HTTP (default: 15)

Política beta (cerebro/wiki/conceitos/beta-whatsapp-politica.md):
  Em modo beta, TODOS envios vão pro Caue independente do destinatário real.
  A mensagem original é prefixada com `[BETA · destinatário real: <email/phone>]`.
"""

from __future__ import annotations

import json
import os
import urllib.error
import urllib.request
from typing import Tuple

EVOLUTION_BASE_URL = os.environ.get("EVOLUTION_BASE_URL", "https://evo10169.hostoo.net.br").rstrip("/")
EVOLUTION_API_KEY = os.environ.get("EVOLUTION_API_KEY", "")
EVOLUTION_INSTANCE = os.environ.get("EVOLUTION_INSTANCE", "Dalton-Pessoal")
EVOLUTION_TIMEOUT_SEC = int(os.environ.get("EVOLUTION_TIMEOUT_SEC", "15"))

BETA_MODE = os.environ.get("BETA_MODE", "true").lower() in ("true", "1", "yes")
BETA_WHATSAPP_TARGET = os.environ.get("BETA_WHATSAPP_TARGET", "+5511947452497")


def _normalize_phone(phone: str) -> str:
    """Normaliza pra formato Evolution: sem +, sem espaços, só dígitos."""
    return "".join(c for c in phone if c.isdigit())


def is_configured() -> bool:
    """Retorna True se Evolution API está configurada (BASE_URL + API_KEY)."""
    return bool(EVOLUTION_BASE_URL and EVOLUTION_API_KEY)


def send_whatsapp(phone: str, message: str, real_recipient: str = "") -> Tuple[bool, str]:
    """
    Envia mensagem via Evolution API.

    Args:
        phone: número destinatário (com ou sem +, vai ser normalizado)
        message: corpo da mensagem (texto, suporta markdown WhatsApp)
        real_recipient: identificador do destinatário real (email/phone) — usado
                        em modo beta no prefixo pra Caue saber pra quem era

    Returns:
        (success, message_id_or_error)
    """
    if not is_configured():
        # Modo mock: printa no stdout (sem enviar)
        print(f"[MOCK WHATSAPP] Para: {phone}")
        print(f"[MOCK WHATSAPP] Real recipient: {real_recipient}")
        print(f"[MOCK WHATSAPP] Mensagem:\n{message}")
        return True, "mock-no-evolution"

    # Política beta: redireciona pra Caue
    if BETA_MODE:
        original_phone = phone
        phone = BETA_WHATSAPP_TARGET
        beta_prefix = (
            f"⚠️ *[BETA · Six Hype]*\n"
            f"_Destinatário real: {real_recipient or original_phone}_\n"
            f"━━━━━━━━━━━━━━━\n\n"
        )
        message = beta_prefix + message

    phone_normalized = _normalize_phone(phone)

    url = f"{EVOLUTION_BASE_URL}/message/sendText/{EVOLUTION_INSTANCE}"
    payload = json.dumps({
        "number": phone_normalized,
        "text": message,
    }).encode("utf-8")

    req = urllib.request.Request(
        url,
        data=payload,
        headers={
            "Content-Type": "application/json",
            "apikey": EVOLUTION_API_KEY,
        },
        method="POST",
    )

    try:
        with urllib.request.urlopen(req, timeout=EVOLUTION_TIMEOUT_SEC) as resp:
            body = resp.read().decode("utf-8")
            data = json.loads(body) if body else {}
            msg_id = (
                data.get("key", {}).get("id")
                or data.get("messageId")
                or data.get("id")
                or "unknown"
            )
            return True, str(msg_id)
    except urllib.error.HTTPError as e:
        err_body = ""
        try:
            err_body = e.read().decode("utf-8", errors="ignore")[:300]
        except Exception:
            pass
        return False, f"HTTP {e.code}: {err_body}"
    except urllib.error.URLError as e:
        return False, f"URLError: {e.reason}"
    except Exception as e:
        return False, f"Error: {type(e).__name__}: {e}"


def build_magic_link_message(magic_link_url: str, expires_minutes: int = 15) -> str:
    """Template canônico de magic link em PT-BR."""
    return (
        "🔐 *Six Hype*\n\n"
        "Seu link de acesso:\n"
        f"{magic_link_url}\n\n"
        f"_Válido por {expires_minutes} minutos. Não foi você? Ignore essa mensagem._"
    )


if __name__ == "__main__":
    # Smoke test: python whatsapp_sender.py
    print(f"is_configured: {is_configured()}")
    print(f"BETA_MODE: {BETA_MODE}")
    print(f"BETA_WHATSAPP_TARGET: {BETA_WHATSAPP_TARGET}")
    print(f"EVOLUTION_BASE_URL: {EVOLUTION_BASE_URL}")
    print(f"EVOLUTION_INSTANCE: {EVOLUTION_INSTANCE}")
    print()
    test_msg = build_magic_link_message("https://hype.sixaesthetic.com.br/?token=TEST123", 15)
    ok, info = send_whatsapp("+5599999999", test_msg, real_recipient="teste@example.com")
    print(f"Result: ok={ok}, info={info}")
