import logging
from fastapi import APIRouter, HTTPException, Request, status
from app.config import settings
from app.security.rate_limit import limiter
from app.security.turnstile import verify_turnstile
from app.schemas.api import ContactRequest
from app.services.email import send_email

router = APIRouter(tags=["contact"])
logger = logging.getLogger(__name__)


@router.post("/contact", status_code=status.HTTP_204_NO_CONTENT)
@limiter.limit("5/minute")
def send_contact(request: Request, body: ContactRequest):
    if body.website:
        # honeypot: los bots suelen rellenar todos los campos, incluido este oculto
        return

    ip = request.client.host if request.client else None
    if not verify_turnstile(body.turnstile_token, ip):
        raise HTTPException(
            status_code=status.HTTP_400_BAD_REQUEST,
            detail="No se pudo verificar que eres humano. Intenta de nuevo.",
        )

    if not settings.SMTP_HOST or not settings.CONTACT_TO_EMAIL:
        raise HTTPException(
            status_code=status.HTTP_503_SERVICE_UNAVAILABLE,
            detail="El formulario de contacto no está configurado",
        )

    body_text = (
        f"Nombre: {body.name}\n"
        f"Correo: {body.email}\n"
        f"Empresa: {body.company or '-'}\n\n"
        f"Mensaje:\n{body.message}\n"
    )

    try:
        send_email(
            to=settings.CONTACT_TO_EMAIL,
            subject=f"MT2MX — solicitud de acceso de {body.name}",
            body=body_text,
            reply_to=body.email,
        )
    except Exception as e:
        logger.error(f"Fallo al enviar correo de contacto: {e}", exc_info=True)
        raise HTTPException(
            status_code=status.HTTP_502_BAD_GATEWAY,
            detail="No se pudo enviar el mensaje, intenta de nuevo más tarde",
        )
