"""
Academy Domain Models

SQLAlchemy ORM models for the academy module including:
- Course: Main course entity
- Section: Course sections for organizing lessons
- Lesson: Individual lessons within courses
- Enrollment: User course enrollments
- Progress: User lesson progress tracking
"""

from sqlalchemy import Column, Integer, String, Text, ForeignKey, DateTime
from sqlalchemy.orm import relationship
from datetime import datetime
from .base import Base


class Course(Base):
    """Academy course model"""
    __tablename__ = 'academy_courses'
    
    id = Column(Integer, primary_key=True, autoincrement=True)
    title = Column(String, nullable=False)
    description = Column(Text)
    thumbnail = Column(String)
    status = Column(String, nullable=False, default='draft')
    created_by = Column(Integer, ForeignKey('users.id', ondelete='CASCADE'), nullable=False)
    created_at = Column(String, nullable=False, default=lambda: datetime.now().strftime('%Y-%m-%dT%H:%M:%S'))
    updated_at = Column(String, nullable=False, default=lambda: datetime.now().strftime('%Y-%m-%dT%H:%M:%S'))
    order_index = Column(Integer, nullable=False, default=0)
    resource_url = Column(String)
    resource_name = Column(String)
    
    # Relationships
    sections = relationship("Section", back_populates="course", cascade="all, delete-orphan", lazy="selectin")
    lessons = relationship("Lesson", back_populates="course", cascade="all, delete-orphan", lazy="select")
    enrollments = relationship("Enrollment", back_populates="course", cascade="all, delete-orphan", lazy="select")
    
    def __repr__(self):
        return f"<Course(id={self.id}, title='{self.title}', status='{self.status}')>"


class Section(Base):
    """Course section model for organizing lessons"""
    __tablename__ = 'academy_sections'
    
    id = Column(Integer, primary_key=True, autoincrement=True)
    course_id = Column(Integer, ForeignKey('academy_courses.id', ondelete='CASCADE'), nullable=False)
    title = Column(String, nullable=False)
    description = Column(Text)
    order_index = Column(Integer, nullable=False, default=0)
    created_at = Column(String, nullable=False, default=lambda: datetime.now().strftime('%Y-%m-%dT%H:%M:%S'))
    updated_at = Column(String, nullable=False, default=lambda: datetime.now().strftime('%Y-%m-%dT%H:%M:%S'))
    
    # Relationships
    course = relationship("Course", back_populates="sections")
    lessons = relationship("Lesson", back_populates="section", cascade="all, delete-orphan", lazy="selectin")
    
    def __repr__(self):
        return f"<Section(id={self.id}, title='{self.title}', course_id={self.course_id})>"


class Lesson(Base):
    """Individual lesson model"""
    __tablename__ = 'academy_lessons'
    
    id = Column(Integer, primary_key=True, autoincrement=True)
    course_id = Column(Integer, ForeignKey('academy_courses.id', ondelete='CASCADE'), nullable=False)
    section_id = Column(Integer, ForeignKey('academy_sections.id', ondelete='SET NULL'))
    title = Column(String, nullable=False)
    description = Column(Text)
    content_type = Column(String, nullable=False)  # video, text, file, url
    content_data = Column(Text)  # JSON string
    duration_minutes = Column(Integer)
    order_index = Column(Integer, nullable=False, default=0)
    status = Column(String, nullable=False, default='draft')
    created_at = Column(String, nullable=False, default=lambda: datetime.now().strftime('%Y-%m-%dT%H:%M:%S'))
    updated_at = Column(String, nullable=False, default=lambda: datetime.now().strftime('%Y-%m-%dT%H:%M:%S'))
    attachment_url = Column(String)
    attachment_name = Column(String)
    
    # Relationships
    course = relationship("Course", back_populates="lessons")
    section = relationship("Section", back_populates="lessons")
    progress_records = relationship("Progress", back_populates="lesson", cascade="all, delete-orphan", lazy="select")
    
    def __repr__(self):
        return f"<Lesson(id={self.id}, title='{self.title}', type='{self.content_type}')>"


class Enrollment(Base):
    """User course enrollment model"""
    __tablename__ = 'academy_enrollments'
    
    id = Column(Integer, primary_key=True, autoincrement=True)
    user_id = Column(Integer, ForeignKey('users.id', ondelete='CASCADE'), nullable=False)
    course_id = Column(Integer, ForeignKey('academy_courses.id', ondelete='CASCADE'), nullable=False)
    enrolled_at = Column(String, nullable=False, default=lambda: datetime.now().strftime('%Y-%m-%dT%H:%M:%S'))
    completed_at = Column(String)
    
    # Relationships
    course = relationship("Course", back_populates="enrollments")
    # user relationship will be added in user.py
    
    def __repr__(self):
        return f"<Enrollment(id={self.id}, user_id={self.user_id}, course_id={self.course_id})>"


class Progress(Base):
    """User lesson progress tracking model"""
    __tablename__ = 'academy_progress'
    
    id = Column(Integer, primary_key=True, autoincrement=True)
    user_id = Column(Integer, ForeignKey('users.id', ondelete='CASCADE'), nullable=False)
    lesson_id = Column(Integer, ForeignKey('academy_lessons.id', ondelete='CASCADE'), nullable=False)
    completed = Column(Integer, nullable=False, default=0)  # 0 or 1 (boolean)
    completed_at = Column(String)
    last_accessed_at = Column(String, nullable=False, default=lambda: datetime.now().strftime('%Y-%m-%dT%H:%M:%S'))
    
    # Relationships
    lesson = relationship("Lesson", back_populates="progress_records")
    # user relationship will be added in user.py
    
    def __repr__(self):
        return f"<Progress(id={self.id}, user_id={self.user_id}, lesson_id={self.lesson_id}, completed={bool(self.completed)})>"
