import logging
import smtplib
from email.message import EmailMessage

from app.core.config import get_settings

logger = logging.getLogger(__name__)


def send_otp_email(email: str, otp: str) -> None:
    settings = get_settings()
    subject = "Password reset code"
    body = f"Your password reset code is: {otp}\n\nThis code expires in 10 minutes."

    if settings.smtp_host:
        message = EmailMessage()
        message["Subject"] = subject
        message["From"] = settings.smtp_from_email or settings.smtp_host
        message["To"] = email
        message.set_content(body)
        with smtplib.SMTP(settings.smtp_host, settings.smtp_port) as server:
            if settings.smtp_use_tls:
                server.starttls()
            if settings.smtp_username:
                server.login(settings.smtp_username, settings.smtp_password)
            server.send_message(message)
        logger.info("Password reset OTP emailed to %s", email)
    else:
        logger.info("SMTP not configured — password reset OTP for %s: %s", email, otp)


def send_otp_sms(mobile: str, otp: str) -> None:
    settings = get_settings()
    message = f"Your Agent Portal reset code is {otp}. Valid for 10 minutes."

    if settings.twilio_account_sid and settings.twilio_auth_token and settings.twilio_from_number:
        import httpx

        url = (
            f"https://api.twilio.com/2010-04-01/Accounts/{settings.twilio_account_sid}/Messages.json"
        )
        response = httpx.post(
            url,
            auth=(settings.twilio_account_sid, settings.twilio_auth_token),
            data={"To": mobile, "From": settings.twilio_from_number, "Body": message},
            timeout=15.0,
        )
        if response.status_code >= 400:
            logger.warning("Twilio SMS failed: %s", response.text[:200])
        else:
            logger.info("Password reset OTP SMS sent to %s", mobile)
    else:
        logger.info("Twilio not configured — password reset OTP SMS for %s: %s", mobile, otp)
