"""Search API endpoints."""
from __future__ import annotations

import uuid
from datetime import datetime

from fastapi import APIRouter, Depends, Query
from sqlalchemy.ext.asyncio import AsyncSession

from app.dependencies import get_current_user, get_db_session, get_ai_service
from app.services.search import SearchService, SearchResult
from app.schemas.search import SearchResponse, SearchResultItem

router = APIRouter(prefix="/search", tags=["search"])


@router.get("", response_model=SearchResponse)
async def search(
    q: str = Query(..., min_length=1, max_length=500),
    mode: str = Query(default="hybrid", pattern="^(semantic|keyword|hybrid)$"),
    type: str = Query(default="all", pattern="^(all|media|link)$"),
    platform: str | None = Query(default=None),
    tag: str | None = Query(default=None),
    from_date: datetime | None = Query(default=None),
    to_date: datetime | None = Query(default=None),
    limit: int = Query(default=20, ge=1, le=50),
    offset: int = Query(default=0, ge=0),
    db: AsyncSession = Depends(get_db_session),
    current_user=Depends(get_current_user),
    ai=Depends(get_ai_service),
) -> SearchResponse:
    service = SearchService(session=db, ai=ai)
    results = await service.search(
        query=q,
        user_id=current_user.id,
        mode=mode,
        entity_type=type,
        limit=limit,
        offset=offset,
        tag=tag,
        platform=platform,
        from_date=from_date,
        to_date=to_date,
    )
    return SearchResponse(
        query=q,
        total=len(results),
        items=[_to_item(r) for r in results],
    )


def _to_item(r: SearchResult) -> SearchResultItem:
    return SearchResultItem(
        entity_id=r.entity_id,
        entity_type=r.entity_type,
        title=r.title,
        url=r.url,
        domain=r.domain,
        summary=r.summary,
        tags=r.tags,
        similarity=round(r.similarity, 4),
        created_at=r.created_at,
    )
