from django.db import models
from people.models import Teacher, Student


class TeacherActivity(models.Model):
    ACTION_CHOICES = [
        # Chat
        ('CREATE_CLASS_GROUP', 'Created Class Group'),
        ('CREATE_SUBJECT_GROUP', 'Created Subject Group'),
        ('DELETE_GROUP', 'Deleted Group'),
        ('CREATE_DIRECT_CHAT', 'Created Direct Chat'),
        ('SEND_MESSAGE', 'Sent Message'),
        # Tasks / Homework
        ('CREATE_TASK', 'Created Task'),
        ('PUBLISH_TASK', 'Published Task'),
        ('DELETE_TASK', 'Deleted Task'),
        ('GRADE_SUBMISSION', 'Graded Submission'),
        # Attendance
        ('START_ATTENDANCE', 'Started Attendance'),
        ('MARK_ATTENDANCE', 'Marked Attendance'),
        ('SUBMIT_ATTENDANCE', 'Submitted Attendance'),
        # Marks
        ('ENTER_MARKS', 'Entered Marks'),
        ('SUBMIT_MARKS', 'Submitted Marks'),
        # Leaves
        ('APPROVE_LEAVE', 'Approved Leave'),
        ('REJECT_LEAVE', 'Rejected Leave'),
    ]

    teacher = models.ForeignKey(
        Teacher,
        on_delete=models.CASCADE,
        related_name='activities',
    )
    action = models.CharField(max_length=50, choices=ACTION_CHOICES)
    description = models.TextField()
    metadata = models.JSONField(default=dict, blank=True)
    created_at = models.DateTimeField(auto_now_add=True)

    class Meta:
        db_table = 'teacher_activities'
        ordering = ['-created_at']
        verbose_name = 'Teacher Activity'
        verbose_name_plural = 'Teacher Activities'
        indexes = [
            models.Index(fields=['teacher', '-created_at'], name='ta_teacher_created_idx'),
            models.Index(fields=['action'], name='ta_action_idx'),
        ]

    def __str__(self):
        return f'{self.teacher.full_name} — {self.get_action_display()} at {self.created_at:%Y-%m-%d %H:%M}'


class StudentActivity(models.Model):
    ACTION_CHOICES = [
        # Chat
        ('SEND_MESSAGE', 'Sent Message'),
        # Tasks / Homework
        ('SUBMIT_TASK', 'Submitted Task'),
        ('VIEW_TASK', 'Viewed Task'),
        # Attendance
        ('MARK_ATTENDANCE', 'Attendance Marked'),
        # Marks
        ('VIEW_MARKS', 'Viewed Marks'),
        # Leave
        ('APPLY_LEAVE', 'Applied for Leave'),
        # Login
        ('LOGIN', 'Logged In'),
        ('LOGOUT', 'Logged Out'),
    ]

    student = models.ForeignKey(
        Student,
        on_delete=models.CASCADE,
        related_name='activities',
    )
    action = models.CharField(max_length=50, choices=ACTION_CHOICES)
    description = models.TextField()
    metadata = models.JSONField(default=dict, blank=True)
    created_at = models.DateTimeField(auto_now_add=True)

    class Meta:
        db_table = 'student_activities'
        ordering = ['-created_at']
        verbose_name = 'Student Activity'
        verbose_name_plural = 'Student Activities'
        indexes = [
            models.Index(fields=['student', '-created_at'], name='sa_student_created_idx'),
            models.Index(fields=['action'], name='sa_action_idx'),
        ]

    def __str__(self):
        return f'{self.student.full_name} — {self.get_action_display()} at {self.created_at:%Y-%m-%d %H:%M}'
