from django.db import models
from academics.models import AcademicClass


# ============================================================
# ANNOUNCEMENT TYPES TABLE
# ============================================================

class AnnouncementType(models.Model):
    name = models.CharField(max_length=100)
    code = models.CharField(max_length=50, unique=True)
    description = models.TextField(null=True, blank=True)

    is_active = models.BooleanField(default=True)

    created_at = models.DateTimeField(auto_now_add=True)

    class Meta:
        db_table = "announcement_types"
        ordering = ['name']

    def __str__(self):
        return self.name


# ============================================================
# CLASS ANNOUNCEMENTS
# ============================================================

class ClassAnnouncement(models.Model):

    PRIORITY_CHOICES = [
        ('low', 'Low'),
        ('medium', 'Medium'),
        ('high', 'High'),
    ]

    announcement_type = models.ForeignKey(
        AnnouncementType,
        on_delete=models.SET_NULL,
        null=True,
        related_name="class_announcements"
    )

    title = models.CharField(max_length=255)
    message = models.TextField()

    academic_class = models.ForeignKey(
        AcademicClass,
        on_delete=models.CASCADE,
        related_name="class_announcements"
    )

    expire_on = models.DateField(null=True, blank=True)

    priority = models.CharField(
        max_length=20,
        choices=PRIORITY_CHOICES,
        default='medium'
    )

    created_by_external_user_id = models.IntegerField(null=True, blank=True)
    from_role = models.CharField(max_length=100, null=True, blank=True)

    is_active = models.BooleanField(default=True)

    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)

    class Meta:
        db_table = "class_announcements"
        ordering = ['-created_at']

    def __str__(self):
        return self.title


# ============================================================
# STUDENT ANNOUNCEMENTS
# ============================================================

class StudentAnnouncement(models.Model):

    SECTION_CHOICES = [
        ('nursery', 'Nursery'),
        ('primary', 'Primary'),
        ('higher_secondary', 'Higher Secondary'),
    ]

    PRIORITY_CHOICES = [
        ('low', 'Low'),
        ('medium', 'Medium'),
        ('high', 'High'),
    ]

    announcement_type = models.ForeignKey(
        AnnouncementType,
        on_delete=models.SET_NULL,
        null=True,
        related_name="student_announcements"
    )

    title = models.CharField(max_length=255)
    message = models.TextField()

    section = models.CharField(
        max_length=20,
        choices=SECTION_CHOICES,
        null=True,
        blank=True
    )

    academic_class = models.ForeignKey(
        AcademicClass,
        on_delete=models.SET_NULL,
        null=True,
        blank=True,
        related_name="student_announcements"
    )

    is_for_all_students = models.BooleanField(default=False)

    expire_on = models.DateField(null=True, blank=True)

    priority = models.CharField(
        max_length=20,
        choices=PRIORITY_CHOICES,
        default='medium'
    )

    created_by_external_user_id = models.IntegerField(null=True, blank=True)
    from_role = models.CharField(max_length=100, null=True, blank=True)

    is_active = models.BooleanField(default=True)

    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)

    class Meta:
        db_table = "student_announcements"
        ordering = ['-created_at']

    def __str__(self):
        return self.title


# ============================================================
# TEACHER ANNOUNCEMENTS
# ============================================================

class TeacherAnnouncement(models.Model):

    PRIORITY_CHOICES = [
        ('low', 'Low'),
        ('medium', 'Medium'),
        ('high', 'High'),
    ]

    announcement_type = models.ForeignKey(
        AnnouncementType,
        on_delete=models.SET_NULL,
        null=True,
        related_name="teacher_announcements"
    )

    title = models.CharField(max_length=255)
    message = models.TextField()

    department = models.CharField(max_length=100, null=True, blank=True)

    is_for_all_teachers = models.BooleanField(default=True)

    expire_on = models.DateField(null=True, blank=True)

    priority = models.CharField(
        max_length=20,
        choices=PRIORITY_CHOICES,
        default='medium'
    )

    created_by_external_user_id = models.IntegerField(null=True, blank=True)
    from_role = models.CharField(max_length=100, null=True, blank=True)

    is_active = models.BooleanField(default=True)

    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)

    class Meta:
        db_table = "teacher_announcements"
        ordering = ['-created_at']

    def __str__(self):
        return self.title


# ============================================================
# COMMON ANNOUNCEMENTS (FOR ENTIRE SCHOOL)
# ============================================================

class CommonAnnouncement(models.Model):

    PRIORITY_CHOICES = [
        ('low', 'Low'),
        ('medium', 'Medium'),
        ('high', 'High'),
    ]

    announcement_type = models.ForeignKey(
        AnnouncementType,
        on_delete=models.SET_NULL,
        null=True,
        related_name="common_announcements"
    )

    title = models.CharField(max_length=255)
    message = models.TextField()

    expire_on = models.DateField(null=True, blank=True)

    priority = models.CharField(
        max_length=20,
        choices=PRIORITY_CHOICES,
        default='medium'
    )

    created_by_external_user_id = models.IntegerField(null=True, blank=True)
    from_role = models.CharField(max_length=100, null=True, blank=True)

    is_active = models.BooleanField(default=True)

    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)

    class Meta:
        db_table = "common_announcements"
        ordering = ['-created_at']

    def __str__(self):
        return self.title