from __future__ import annotations from datetime import datetime from sqlalchemy import DateTime, Float, Integer, JSON, String, func from sqlalchemy.orm import Mapped, mapped_column from app.core.database import Base from app.utils.ids import prefixed_id class ChapterPattern(Base): __tablename__ = "chapter_patterns" id: Mapped[str] = mapped_column( String(40), primary_key=True, default=lambda: prefixed_id("cpat"), ) user_id: Mapped[str] = mapped_column( String(40), index=True, nullable=False, ) board: Mapped[str] = mapped_column(String(120), nullable=False, default="") class_level: Mapped[str] = mapped_column(String(60), nullable=False, default="") subject: Mapped[str] = mapped_column(String(120), nullable=False, default="") chapter: Mapped[str] = mapped_column(String(180), nullable=False, default="") total_questions: Mapped[int] = mapped_column(Integer, default=0, nullable=False) total_marks: Mapped[int] = mapped_column(Integer, default=0, nullable=False) repeated_topics: Mapped[list[str]] = mapped_column(JSON, default=list, nullable=False) answer_type_distribution: Mapped[dict[str, int]] = mapped_column(JSON, default=dict, nullable=False) years_seen: Mapped[list[int]] = mapped_column(JSON, default=list, nullable=False) confidence: Mapped[float] = mapped_column(Float, default=0.0, nullable=False) created_at: Mapped[datetime] = mapped_column( DateTime(timezone=True), server_default=func.now(), nullable=False, ) updated_at: Mapped[datetime] = mapped_column( DateTime(timezone=True), server_default=func.now(), onupdate=func.now(), nullable=False, )