from django.conf import settings
from django.db import models


class Reminder(models.Model):
    class Frequency(models.TextChoices):
        DAILY = "daily", "Daily"
        WEEKDAYS = "weekdays", "Weekdays"
        WEEKLY = "weekly", "Weekly"
        CUSTOM = "custom", "Custom days"

    class Category(models.TextChoices):
        PRAYER = "prayer", "Prayer"
        BIBLE_STUDY = "bible_study", "Bible Study"
        ACADEMIC_STUDY = "academic_study", "Academic Study"
        MEDITATION = "meditation", "Meditation"
        PERSONAL_DEVOTION = "personal_devotion", "Personal Devotion"

    user = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE, related_name="reminders")
    title = models.CharField(max_length=160)
    category = models.CharField(max_length=32, choices=Category.choices)
    preferred_time = models.TimeField()
    frequency = models.CharField(max_length=16, choices=Frequency.choices, default=Frequency.DAILY)
    custom_days = models.JSONField(default=list, blank=True)
    duration_minutes = models.PositiveIntegerField(default=25)
    priority = models.CharField(max_length=16, default="medium")
    push_enabled = models.BooleanField(default=True)
    email_enabled = models.BooleanField(default=False)
    sms_enabled = models.BooleanField(default=False)
    is_active = models.BooleanField(default=True)
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)

    class Meta:
        ordering = ("preferred_time", "title")

    def __str__(self):
        return self.title


class ReminderSchedule(models.Model):
    reminder = models.OneToOneField(Reminder, on_delete=models.CASCADE, related_name="schedule")
    timezone = models.CharField(max_length=64, default="Africa/Lagos")
    next_occurrence = models.DateTimeField(null=True, blank=True)
    last_triggered_at = models.DateTimeField(null=True, blank=True)
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)

    def __str__(self):
        return f"{self.reminder.title} schedule"
