"""SMS notifications via Notify Africa — customers and pickers get an SMS to
their registered phone number for the same events they're already emailed
about (order placed, status changes, new messages). Admin is email-only, no
SMS. Sending failures are logged and swallowed, never raised, matching the
existing email-notification fail-safe pattern in market/emailer.py."""

import logging

import requests
from django.conf import settings

from accounts.phone_utils import to_international

logger = logging.getLogger(__name__)

_SEND_ENDPOINT = '/api/v1/api/messages/send'
_TIMEOUT_SECONDS = 8


def send_sms(phone_number, message):
    if not settings.NOTIFY_API_TOKEN:
        return
    recipient = to_international(phone_number)
    if not recipient:
        return

    try:
        resp = requests.post(
            settings.NOTIFY_BASE_URL.rstrip('/') + _SEND_ENDPOINT,
            json={
                'phone_number': recipient,
                'message': message,
                'sender_id': settings.NOTIFY_SENDER_ID,
            },
            headers={
                'Authorization': f'Bearer {settings.NOTIFY_API_TOKEN}',
                'Content-Type': 'application/json',
            },
            timeout=_TIMEOUT_SECONDS,
        )
        if not resp.ok:
            logger.error('SMS to %s failed: %s %s', recipient, resp.status_code, resp.text[:300])
        return resp.ok
    except Exception:
        logger.exception('Failed to send SMS to %s', recipient)
        return False


def sms_lang(preferred_language):
    """SMS defaults to Swahili — only a user who has actually set their
    account language to English (via the site's language toggle) gets
    English SMS. Shared by every SMS sender so the rule lives in one place."""
    return 'en' if preferred_language == 'en' else 'sw'


def sms_text(lang, en_text, sw_text):
    return en_text if lang == 'en' else sw_text


def send_welcome_sms(phone_number, name, lang, role, needs_verification=True):
    """role: 'customer' or 'picker'. needs_verification=False for pickers the
    admin registers directly (B2B) — they're already approved, no email
    verification gate to mention."""
    name = name or ''
    if role == 'picker':
        if needs_verification:
            message = sms_text(
                lang,
                f"Welcome to PickkerMarket, {name}! Verify your email to activate your account. "
                "Your picker profile will then be reviewed before you start receiving deliveries.",
                f"Karibu PickkerMarket, {name}! Thibitisha barua pepe yako kuwezesha akaunti. "
                "Wasifu wako wa uchukuzi utapitiwa kabla ya kuanza kupokea oda.",
            )
        else:
            message = sms_text(
                lang,
                f"Welcome to PickkerMarket, {name}! Your picker account is ready — open the app to set your password and get started.",
                f"Karibu PickkerMarket, {name}! Akaunti yako ya mchukuzi iko tayari — fungua programu kuweka nenosiri lako na kuanza.",
            )
    else:
        message = sms_text(
            lang,
            f"Welcome to PickkerMarket, {name}! Verify your email to activate your account, then browse fresh produce anytime.",
            f"Karibu PickkerMarket, {name}! Thibitisha barua pepe yako kuwezesha akaunti, kisha angalia bidhaa za sokoni wakati wowote.",
        )
    send_sms(phone_number, message)
