from django.db import models
from django.utils import timezone


class NotificationEvent(models.Model):
    organization_id = models.IntegerField(null=True, blank=True)
    event = models.CharField(max_length=40, default="new_email")
    mailbox = models.CharField(max_length=190, blank=True)
    mailbox_id = models.IntegerField(null=True, blank=True)
    sender = models.CharField(max_length=320, blank=True)
    subject = models.CharField(max_length=500, blank=True)
    preview = models.CharField(max_length=200, blank=True)
    source_ref = models.CharField(max_length=64, blank=True)
    payload = models.JSONField(default=dict, blank=True)
    created_at = models.DateTimeField(default=timezone.now)

    class Meta:
        ordering = ("-created_at",)


class Device(models.Model):
    organization_id = models.IntegerField(null=True, blank=True)
    device_id = models.CharField(max_length=190, unique=True)
    label = models.CharField(max_length=120, blank=True)
    push_token = models.CharField(max_length=512, blank=True)
    platform = models.CharField(max_length=20, blank=True)
    is_sms_gateway = models.BooleanField(default=False)
    active = models.BooleanField(default=True)
    last_seen = models.DateTimeField(null=True, blank=True)
    created_at = models.DateTimeField(default=timezone.now)


class OutboundSms(models.Model):
    QUEUED = "queued"
    PICKED = "picked"
    SENT = "sent"
    FAILED = "failed"

    STATUS = [
        (QUEUED, "Queued"),
        (PICKED, "Picked"),
        (SENT, "Sent"),
        (FAILED, "Failed"),
    ]

    organization_id = models.IntegerField(null=True, blank=True)
    to_number = models.CharField(max_length=32)
    body = models.TextField()
    status = models.CharField(max_length=12, choices=STATUS, default=QUEUED)
    backend = models.CharField(max_length=20, blank=True)
    device = models.ForeignKey(Device, null=True, blank=True, on_delete=models.SET_NULL, related_name="sms_jobs")
    provider_sid = models.CharField(max_length=64, blank=True)
    error = models.TextField(blank=True)
    attempts = models.PositiveSmallIntegerField(default=0)
    event = models.ForeignKey(NotificationEvent, null=True, blank=True, on_delete=models.SET_NULL, related_name="sms")
    created_at = models.DateTimeField(default=timezone.now)
    sent_at = models.DateTimeField(null=True, blank=True)

    class Meta:
        ordering = ("-created_at",)
