from app import db
from datetime import datetime
from app.models.progress import Progress
from app.models.course import ShortCourse, LearningCourse

class ComprehensionQuestion(db.Model):
    __tablename__ = 'comprehension_questions'
    
    id = db.Column(db.Integer, primary_key=True)
    text = db.Column(db.String(500), nullable=False)
    generated_at = db.Column(db.DateTime, default=datetime.utcnow)
    topic_id = db.Column(db.Integer, db.ForeignKey('topics.id'))
    
    def to_dict(self):
        return {
            'id': self.id,
            'text': self.text,
            'generated_at': self.generated_at.strftime('%Y-%m-%d %H:%M:%S')
        }

class SpeakingQuestion(db.Model):
    __tablename__ = 'speaking_questions'
    
    id = db.Column(db.Integer, primary_key=True)
    text = db.Column(db.String(500), nullable=False)
    expected_duration = db.Column(db.Integer, default=60)  # in seconds
    generated_at = db.Column(db.DateTime, default=datetime.utcnow)
    topic_id = db.Column(db.Integer, db.ForeignKey('topics.id'))
    
    def to_dict(self):
        return {
            'id': self.id,
            'text': self.text,
            'expected_duration': self.expected_duration,
            'generated_at': self.generated_at.strftime('%Y-%m-%d %H:%M:%S')
        }

class Topic(db.Model):
    __tablename__ = 'topics'
    
    id = db.Column(db.Integer, primary_key=True)
    title = db.Column(db.String(100), nullable=False)
    section_title = db.Column(db.String(100), nullable=True)  # Section title for course outlines
    category = db.Column(db.String(50), nullable=True)  # Set to nullable=True
    order = db.Column(db.Integer, default=0)  # Added to track topic order within category
    reading_content = db.Column(db.Text, nullable=True)  # Set to nullable=True for course outlines
    image_url = db.Column(db.String(500), nullable=True)  # URL or path to topic image
    writing_prompt = db.Column(db.Text)
    speaking_prompt = db.Column(db.Text)
    created_at = db.Column(db.DateTime, default=datetime.utcnow)
    teacher_id = db.Column(db.Integer, db.ForeignKey('users.id'), nullable=True)  # Set to nullable=True for flexibility
    course_id = db.Column(db.Integer, nullable=True)  # Links to either short_courses or learning_courses
    course_type = db.Column(db.String(20), nullable=True)  # 'short' or 'learning'
    
    # Relationships
    comprehension_questions = db.relationship('ComprehensionQuestion', 
                                           backref='topic',
                                           lazy='select',
                                           cascade='all, delete-orphan')
    speaking_questions = db.relationship('SpeakingQuestion',
                                      backref='topic',
                                      lazy='select',
                                      cascade='all, delete-orphan')
    
    @property
    def course(self):
        """Get the associated course object"""
        if not self.course_id or not self.course_type:
            return None
        
        if self.course_type == 'short':
            return ShortCourse.query.get(self.course_id)
        elif self.course_type == 'learning':
            return LearningCourse.query.get(self.course_id)
        return None
    progress_records = db.relationship('Progress',
                                    backref='topic',
                                    lazy='dynamic',
                                    cascade='all, delete-orphan')
    
    def add_comprehension_questions(self, questions):
        """Add AI-generated comprehension questions"""
        # Clear existing questions
        for q in self.comprehension_questions:
            db.session.delete(q)
        
        # Add only 3 questions
        for question in questions[:3]:
            self.comprehension_questions.append(question)
    
    def to_dict(self):
        return {
            'id': self.id,
            'title': self.title,
            'category': self.category,
            'reading_content': self.reading_content,
            'writing_prompt': self.writing_prompt,
            'speaking_prompt': self.speaking_prompt,
            'created_at': self.created_at.strftime('%Y-%m-%d %H:%M:%S'),
            'teacher_id': self.teacher_id,
            'comprehension_questions': [q.to_dict() for q in self.comprehension_questions],
            'speaking_questions': [q.to_dict() for q in self.speaking_questions]
        }
    
    @property
    def stage(self):
        """Get the current stage of the topic"""
        if not self.reading_content:
            return None
        if not self.writing_prompt:
            return 'reading'
        if not self.speaking_prompt:
            return 'writing'
        return 'speaking'

    def get_progress_stats(self):
        """Get progress statistics for this topic"""
        total_students = Progress.query.filter_by(topic_id=self.id).count()
        completed_students = Progress.query.filter(
            Progress.topic_id == self.id,
            Progress.completed_at.isnot(None)
        ).count()
        progress_percentage = (completed_students / total_students * 100) if total_students > 0 else 0
        
        return {
            'total_students': total_students,
            'completed_students': completed_students,
            'progress_percentage': progress_percentage
        }

    def __repr__(self):
        return f'<Topic {self.title}>'
