from typing import Optional, List
from sqlmodel import Session, select
from datetime import datetime

from app.models.models import QuizHistory

def get_history_by_user_and_quiz(
    session: Session, user_id: int, quiz_id: str
) -> Optional[QuizHistory]:
    stmt = select(QuizHistory).where(
        QuizHistory.user_id == user_id,
        QuizHistory.quiz_id == quiz_id
    )
    return session.exec(stmt).one_or_none()

def upsert_quiz_history(
    session: Session, user_id: int, quiz_id: str, new_passed: List[int], new_failed: List[int]
) -> QuizHistory:
    history = get_history_by_user_and_quiz(session, user_id, quiz_id)

    if not history:
        history = QuizHistory(
            user_id=user_id,
            quiz_id=quiz_id,
            passed_questions=list(set(new_passed)),
            failed_questions=list(set(new_failed)),
            score=len(set(new_passed))
        )
        session.add(history)
    else:
        merged_passed = list(set(history.passed_questions + new_passed))
        merged_failed = list(set(history.failed_questions + new_failed))
        history.passed_questions = merged_passed
        history.failed_questions = merged_failed
        history.score = len(merged_passed)
        history.updated_at = datetime.utcnow()
        session.add(history)

    session.commit()
    session.refresh(history)
    return history
