from django.db import models


class SchoolLanguage(models.Model):
    """
    Languages available for this school — stored in the school's own DB.
    Rows are synced from the master Language catalog; the school admin
    toggles is_enabled. The default language (English) is always enabled.
    """

    code = models.CharField(max_length=10, unique=True)
    name = models.CharField(max_length=100)
    native_name = models.CharField(max_length=100, blank=True, null=True)
    is_default = models.BooleanField(default=False)
    is_enabled = models.BooleanField(default=False)
    order = models.PositiveIntegerField(default=0)
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)

    class Meta:
        ordering = ['order', 'name']

    def __str__(self):
        status = 'enabled' if self.is_enabled else 'disabled'
        return f"{self.name} ({self.code}) - {status}"


class SchoolPermission(models.Model):
    CATEGORY_CHOICES = [
        ('students', 'Students'),
        ('parents', 'Parents'),
        ('teachers', 'Teachers'),
        ('enrollments', 'Enrollments'),
        ('academics', 'Academics'),
        ('fee', 'Fee Management'),
        ('announcements', 'Announcements'),
        ('attendance', 'Attendance'),
        ('timetable', 'Timetable'),
        ('tasks', 'Tasks'),
        ('exams', 'Exams'),
        ('transport', 'Transport'),
        ('payslips', 'Payslips'),
        ('reports', 'Reports'),
    ]

    codename = models.CharField(max_length=100, unique=True)
    name = models.CharField(max_length=255)
    category = models.CharField(max_length=50, choices=CATEGORY_CHOICES)
    description = models.TextField(blank=True)

    class Meta:
        ordering = ['category', 'codename']

    def __str__(self):
        return f"{self.name} ({self.codename})"


class SchoolRole(models.Model):
    name = models.CharField(max_length=150, unique=True)
    description = models.TextField(blank=True)
    permissions = models.ManyToManyField(
        SchoolPermission,
        through='SchoolRolePermission',
        related_name='roles',
        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:
        ordering = ['name']

    def __str__(self):
        return self.name


class SchoolRolePermission(models.Model):
    role = models.ForeignKey(
        SchoolRole, on_delete=models.CASCADE, related_name='role_permissions'
    )
    permission = models.ForeignKey(SchoolPermission, on_delete=models.CASCADE)
    granted_at = models.DateTimeField(auto_now_add=True)

    class Meta:
        unique_together = ('role', 'permission')


class UserSchoolDirectPermission(models.Model):
    """Permission assigned directly to a user (not via a role)."""
    user_id = models.IntegerField(
        db_index=True,
        help_text="User ID from master database",
    )
    permission = models.ForeignKey(SchoolPermission, on_delete=models.CASCADE)
    granted_at = models.DateTimeField(auto_now_add=True)
    granted_by_id = models.IntegerField(null=True, blank=True)

    class Meta:
        unique_together = ('user_id', 'permission')
        ordering = ['user_id']

    def __str__(self):
        return f"User {self.user_id} → {self.permission.codename} (direct)"


class UserSchoolRole(models.Model):
    """Maps a master-DB user (by integer ID) to a school role."""
    user_id = models.IntegerField(
        db_index=True,
        help_text="User ID from master database",
    )
    role = models.ForeignKey(
        SchoolRole, on_delete=models.CASCADE, related_name='user_assignments'
    )
    assigned_at = models.DateTimeField(auto_now_add=True)
    assigned_by_id = models.IntegerField(
        null=True, blank=True, help_text="User ID of the assigner (master DB)"
    )

    class Meta:
        unique_together = ('user_id', 'role')
        ordering = ['user_id']

    def __str__(self):
        return f"User {self.user_id} → {self.role.name}"
