from __future__ import annotations

import time
from typing import Sequence

from app.core.config import settings
from app.core.logger import logger
from app.qdrant.vector_store import VectorSearchHit, search_vectors
from app.retrieval.models import VectorHit, VectorSearchResult
from app.services.embedding_service import get_embedding_service


def _to_vector_hit(hit: VectorSearchHit) -> VectorHit:
    return VectorHit(
        record_id=hit.record_id,
        score=hit.score,
        source_type=hit.source_type,
        chunk_type=hit.chunk_type,
        graph_node_id=hit.graph_node_id,
        file_path=hit.file_path,
        doc_path=hit.doc_path,
        symbol_name=hit.symbol_name,
        section_title=hit.section_title,
        commit_sha=hit.commit_sha,
    )


async def search_by_query_text(
    query_text: str,
    *,
    repo_id: str,
    snapshot_id: str,
    source_types: Sequence[str] | None = None,
    top_k: int | None = None,
    score_threshold: float | None = None,
) -> VectorSearchResult:
    """
    Embed query text and search Qdrant for the given repo/snapshot scope.

    Raises EmbeddingError when the embedding provider fails.
    Raises QdrantVectorStoreError when vector search fails.
    """
    started = time.perf_counter()
    embedding_service = get_embedding_service()
    query_vector = await embedding_service.embed_text(query_text)
    hits = search_vectors(
        query_vector,
        repo_id=repo_id,
        snapshot_id=snapshot_id,
        source_types=source_types,
        top_k=top_k,
        score_threshold=score_threshold,
    )
    latency_ms = int((time.perf_counter() - started) * 1000)
    logger.info(
        "Vector search completed repo_id={repo_id} snapshot_id={snapshot_id} "
        "hits={hits} latency_ms={latency_ms}",
        repo_id=repo_id,
        snapshot_id=snapshot_id,
        hits=len(hits),
        latency_ms=latency_ms,
    )
    return VectorSearchResult(
        hits=[_to_vector_hit(hit) for hit in hits],
        embedding_model=settings.EMBEDDING_MODEL,
        embedding_dimension=settings.EMBEDDING_DIMENSION,
        vector_latency_ms=latency_ms,
    )
