from app import db
from datetime import datetime

class Activity(db.Model):
    __tablename__ = 'activities'
    
    id = db.Column(db.Integer, primary_key=True)
    action = db.Column(db.String(50), nullable=False)
    user_id = db.Column(db.Integer, db.ForeignKey('users.id'), nullable=False)
    target_user_id = db.Column(db.Integer, db.ForeignKey('users.id'))
    details = db.Column(db.Text)
    created_at = db.Column(db.DateTime, default=datetime.utcnow)
    
    # Relationships
    user = db.relationship('User', foreign_keys=[user_id], backref='activities')
    target_user = db.relationship('User', foreign_keys=[target_user_id], backref='targeted_activities')
    
    # Action types
    ACTIONS = {
        'USER_APPROVED': 'User Approved',
        'USER_REJECTED': 'User Rejected',
        'TEACHER_ADDED': 'Teacher Added',
        'TEACHER_DELETED': 'Teacher Deleted',
        'TEACHER_UPDATED': 'Teacher Updated',
        'STUDENT_ADDED': 'Student Added',
        'STUDENT_UPDATED': 'Student Updated',
        'STUDENT_DELETED': 'Student Deleted',
        'TOPIC_CREATED': 'Topic Created',
        'TOPIC_UPDATED': 'Topic Updated',
        'TOPIC_DELETED': 'Topic Deleted',
        'STUDENT_ASSIGNED': 'Student Assigned',
        'STUDENT_REMOVED': 'Student Removed',
        'STUDENT_PROGRESS': 'Student Progress',  # Added for tracking student assessment progress
        'OUTLINE_DOWNLOAD': 'Course Outline Downloaded'  # Added for tracking outline downloads
    }
    
    @classmethod
    def log(cls, action, user, target_user=None, details=None):
        """
        Create a new activity log entry.
        
        Args:
            action (str): The type of action (use ACTIONS constants)
            user (User): The user performing the action
            target_user (User, optional): The user affected by the action
            details (str, optional): Additional details about the action
        """
        activity = cls(
            action=action,
            user_id=user.id,
            target_user_id=target_user.id if target_user else None,
            details=details
        )
        db.session.add(activity)
        db.session.commit()
        return activity
    
    def to_dict(self):
        return {
            'id': self.id,
            'action': self.action,
            'user': self.user.username,
            'target_user': self.target_user.username if self.target_user else None,
            'details': self.details,
            'created_at': self.created_at.strftime('%Y-%m-%d %H:%M:%S')
        }
    
    def __repr__(self):
        return f'<Activity {self.action}>'
