from __future__ import annotations

from typing import List, Optional

from app.core.database import get_commit_analyses_db
from app.models.upstream.commit_analysis import CommitAnalysisDocument


def _serialize(doc: dict) -> dict:
    if doc and "_id" in doc:
        doc = dict(doc)
        doc.pop("_id", None)
    return doc


async def get_by_analysis_id(analysis_id: str) -> Optional[CommitAnalysisDocument]:
    db = get_commit_analyses_db()
    doc = await db.commit_analyses.find_one({"analysis_id": analysis_id})
    if doc:
        return CommitAnalysisDocument.from_mongo(doc)

    doc = await db.commit_analyses.find_one({"_id": analysis_id})
    if doc:
        return CommitAnalysisDocument.from_mongo(doc)
    return None


async def list_by_repo(repo_id: str, *, limit: int = 500) -> List[CommitAnalysisDocument]:
    db = get_commit_analyses_db()
    cursor = db.commit_analyses.find({"repo_id": repo_id}).limit(limit)
    return [CommitAnalysisDocument.from_mongo(doc) async for doc in cursor]


async def get_by_analysis_ids(analysis_ids: list[str]) -> dict[str, CommitAnalysisDocument]:
    """Batch-load commit analyses keyed by analysis_id."""
    if not analysis_ids:
        return {}

    db = get_commit_analyses_db()
    unique_ids = list(dict.fromkeys(analysis_ids))
    cursor = db.commit_analyses.find({"analysis_id": {"$in": unique_ids}})
    analyses: dict[str, CommitAnalysisDocument] = {}
    async for doc in cursor:
        analysis = CommitAnalysisDocument.from_mongo(doc)
        analyses[analysis.analysis_id] = analysis
    return analyses
