from typing import List, Optional
from sqlmodel import Session, select, func
from app.models.models import Topic, Quiz, Question


def get_all_topics(session: Session) -> List[Topic]:
    return session.exec(select(Topic)).all()


def get_quizzes_with_counts(session: Session, topic_id: str) -> List[dict]:
    stmt = (
        select(Quiz, func.count(Question.id).label("question_count"))
        .outerjoin(Question, Question.quiz_id == Quiz.id)
        .where(Quiz.topic_id == topic_id)
        .group_by(Quiz.id)
    )
    rows = session.exec(stmt).all()

    return [
        {
            "id": quiz.id,
            "name": quiz.name,
            "topic_id": quiz.topic_id,
            "question_count": q_count,
        }
        for quiz, q_count in rows
    ]


def get_quiz_by_id(session: Session, quiz_id: str) -> Optional[Quiz]:
    return session.get(Quiz, quiz_id)


def get_questions_by_quiz(session: Session, quiz_id: str) -> List[Question]:
    return session.exec(select(Question).where(Question.quiz_id == quiz_id)).all()


def get_all_questions(session: Session) -> List[Question]:
    return session.exec(select(Question)).all()


def get_topic_by_id(session: Session, topic_id: str) -> Optional[Topic]:
    return session.get(Topic, topic_id)
