import logging
from celery import shared_task
from django.conf import settings
from django.utils import timezone
from apps.calls.services import get_twilio_client
from apps.appointments.models import OutboundMessage

logger = logging.getLogger(__name__)


@shared_task(
    bind=True,
    max_retries=3,
    default_retry_delay=10,
    name="apps.calls.tasks.send_sms_task",
)
def send_sms_task(self, to_number: str, message: str):
    """
    Celery task to send SMS asynchronously using Twilio.
    Retries automatically on failure.
    """

    delivery = OutboundMessage.objects.create(
        channel="sms",
        to=to_number,
        message_payload={
            "body": message,
            "from": settings.TWILIO_FROM_NUMBER,
        },
        status="pending",
    )

    try:
        if not to_number:
            logger.error("Celery SMS task failed: no destination number provided.")
            return False

        twilio_client = get_twilio_client()

        sms = twilio_client.messages.create(
            body=message,
            from_=settings.TWILIO_FROM_NUMBER,
            to=to_number
        )

        delivery.status = "sent"
        delivery.provider_message_id = sms.sid
        delivery.sent_at = timezone.now()
        delivery.save(update_fields=["status", "provider_message_id", "sent_at"])
        logger.info(f"[CELERY] SMS sent to {to_number}, SID={sms.sid}")
        return True

    except Exception as exc:
        delivery.status = "failed"
        delivery.error_message = str(exc)
        delivery.save(update_fields=["status", "error_message"])
        logger.exception(f"[CELERY] Twilio SMS send failed, will retry. Error: {exc}")
        raise self.retry(exc=exc)
