from sqlalchemy import Column, Integer, String, Text, Boolean, DateTime, ForeignKey from sqlalchemy.ext.declarative import declarative_base from sqlalchemy.orm import relationship from sqlalchemy.sql import func Base = declarative_base() class Theme(Base): __tablename__ = "themes" id = Column(Integer, primary_key=True, autoincrement=True) name = Column(String(100), nullable=False, unique=True) description = Column(Text) created_at = Column(DateTime, server_default=func.now()) questions = relationship("Question", back_populates="theme") class Question(Base): __tablename__ = "questions" id = Column(Integer, primary_key=True, autoincrement=True) theme_id = Column(Integer, ForeignKey("themes.id"), nullable=False) question_text = Column(Text, nullable=False) correct_answer = Column(Text, nullable=False) hint = Column(Text) difficulty_level = Column(Integer, default=1) created_at = Column(DateTime, server_default=func.now()) updated_at = Column(DateTime, server_default=func.now(), onupdate=func.now()) theme = relationship("Theme", back_populates="questions") game_answers = relationship("GameAnswer", back_populates="question") class Player(Base): __tablename__ = "players" id = Column(Integer, primary_key=True, autoincrement=True) name = Column(String(50), nullable=False) email = Column(String(100)) created_at = Column(DateTime, server_default=func.now()) game_sessions = relationship("GameSession", back_populates="player") class GameSession(Base): __tablename__ = "game_sessions" id = Column(Integer, primary_key=True, autoincrement=True) player_id = Column(Integer, ForeignKey("players.id"), nullable=False) started_at = Column(DateTime, server_default=func.now()) ended_at = Column(DateTime) total_score = Column(Integer, default=0) questions_answered = Column(Integer, default=0) session_duration = Column(Integer, default=0) # in seconds player = relationship("Player", back_populates="game_sessions") game_answers = relationship("GameAnswer", back_populates="session") class GameAnswer(Base): __tablename__ = "game_answers" id = Column(Integer, primary_key=True, autoincrement=True) session_id = Column(Integer, ForeignKey("game_sessions.id"), nullable=False) question_id = Column(Integer, ForeignKey("questions.id"), nullable=False) attempt_number = Column(Integer, nullable=False) # 1, 2, or 3 user_answer = Column(Text) is_correct = Column(Boolean, default=False) hint_used = Column(Boolean, default=False) points_earned = Column(Integer, default=0) answered_at = Column(DateTime, server_default=func.now()) session = relationship("GameSession", back_populates="game_answers") question = relationship("Question", back_populates="game_answers")