from __future__ import annotations

from pydantic import BaseModel, Field, field_validator


class RetrievalFilters(BaseModel):
    paths: list[str] = Field(
        default_factory=list,
        description="Glob patterns, e.g. src/**",
    )


class RetrievalSearchRequest(BaseModel):
    repo_ids: list[str] = Field(min_length=1)
    query: str = Field(min_length=1, max_length=4096)
    top_k: int = Field(default=20, ge=1, le=100)
    filters: RetrievalFilters = Field(default_factory=RetrievalFilters)

    @field_validator("repo_ids")
    @classmethod
    def unique_repo_ids(cls, value: list[str]) -> list[str]:
        seen: set[str] = set()
        unique: list[str] = []
        for repo_id in value:
            if repo_id not in seen:
                seen.add(repo_id)
                unique.append(repo_id)
        return unique


class RetrievalChunkResult(BaseModel):
    file_path: str
    start_line: int
    end_line: int
    score: float
    chunk_hash: str
    chunk_id: str
    snippet: str
    source_type: str


class RetrievalSearchResponse(BaseModel):
    results: list[RetrievalChunkResult] = Field(default_factory=list)
    request_id: str | None = None
