from django.conf import settings as django_settings
from django.db import models


class ScheduledReportRecipient(models.Model):
    class Frequency(models.TextChoices):
        DAILY = 'DAILY', 'Daily'
        WEEKLY = 'WEEKLY', 'Weekly'
        MONTHLY = 'MONTHLY', 'Monthly'

    email = models.EmailField()
    name = models.CharField(max_length=150, blank=True)
    frequency = models.CharField(max_length=10, choices=Frequency.choices, default=Frequency.DAILY)
    send_hour = models.PositiveSmallIntegerField(
        default=7, help_text='Hour of day (0-23) to send at, in the configured email time zone.',
    )
    send_minute = models.PositiveSmallIntegerField(default=0, help_text='Minute (0-59) within send_hour.')
    weekly_weekday = models.PositiveSmallIntegerField(
        default=0, help_text='0=Monday .. 6=Sunday. Only used when frequency is WEEKLY.',
    )
    max_emails_per_day = models.PositiveSmallIntegerField(default=1)
    enabled = models.BooleanField(default=True)
    created_at = models.DateTimeField(auto_now_add=True)

    class Meta:
        ordering = ['email']
        unique_together = ('email', 'frequency')

    def __str__(self):
        return f'{self.email} ({self.frequency})'


class ScheduledReportLog(models.Model):
    recipient = models.ForeignKey(ScheduledReportRecipient, on_delete=models.CASCADE, related_name='logs')
    sent_at = models.DateTimeField(auto_now_add=True)
    success = models.BooleanField(default=True)
    detail = models.CharField(max_length=255, blank=True)

    class Meta:
        ordering = ['-sent_at']

    def __str__(self):
        return f'{self.recipient.email} @ {self.sent_at:%Y-%m-%d %H:%M}'


class EmailSettings(models.Model):
    """Single-row, manager-editable Resend configuration. Values here override the environment."""

    resend_api_key = models.CharField(max_length=255, blank=True)
    from_email = models.CharField(max_length=255, blank=True)
    time_zone = models.CharField(max_length=64, default='UTC')
    updated_at = models.DateTimeField(auto_now=True)
    updated_by = models.ForeignKey(
        django_settings.AUTH_USER_MODEL, null=True, blank=True, on_delete=models.SET_NULL, related_name='+',
    )

    class Meta:
        verbose_name_plural = 'email settings'

    def __str__(self):
        return 'Email settings'

    @classmethod
    def load(cls):
        obj, _ = cls.objects.get_or_create(pk=1)
        return obj
