"""# Generated from swarm story V-K13: Call History and Transcript API
"""

from typing import Optional
from uuid import UUID
from fastapi import APIRouter, Query, status
from services.call_service import CallService
from schemas.call import (
    CallDetail, PaginatedResponse, SearchResponse, ErrorResponse
)
from api.deps import DbDep, UserDep

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


@router.get(
    "",
    response_model=PaginatedResponse,
    responses={400: {"model": ErrorResponse}, 401: {"model": ErrorResponse}}
)
async def list_calls(
    db: DbDep,
    user: UserDep,
    cursor: Optional[str] = Query(None, description="Pagination cursor"),
    limit: int = Query(20, ge=1, le=100, description="Items per page")
) -> PaginatedResponse:
    """
    Get paginated call history for authenticated user.
    Uses cursor-based pagination for performance with large datasets.
    """
    service = CallService(db)
    return await service.list_calls(user, cursor, limit)


@router.get(
    "/search",
    response_model=SearchResponse,
    responses={400: {"model": ErrorResponse}}
)
async def search_calls(
    db: DbDep,
    user: UserDep,
    q: str = Query(..., min_length=2, description="Search query"),
    cursor: Optional[str] = Query(None),
    limit: int = Query(20, ge=1, le=100)
) -> SearchResponse:
    """
    Full-text search across call transcripts.
    Uses PostgreSQL tsvector for efficient text search.
    """
    service = CallService(db)
    return await service.search_calls(user, q, cursor, limit)


@router.get(
    "/{call_id}",
    response_model=CallDetail,
    responses={404: {"model": ErrorResponse}}
)
async def get_call(
    db: DbDep,
    user: UserDep,
    call_id: UUID
) -> CallDetail:
    """
    Get detailed call information including full transcript with speaker labels.
    """
    service = CallService(db)
    return await service.get_call_detail(call_id, user)


@router.get(
    "/{call_id}/transcript",
    responses={404: {"model": ErrorResponse}}
)
async def get_transcript(
    db: DbDep,
    user: UserDep,
    call_id: UUID
) -> list:
    """
    Get raw transcript segments with timestamps and speaker labels.
    Format: [{"speaker": "user", "content": "...", "timestamp": "..."}]
    """
    service = CallService(db)
    return await service.get_transcript(call_id, user)


@router.delete(
    "/{call_id}",
    status_code=status.HTTP_204_NO_CONTENT,
    responses={404: {"model": ErrorResponse}}
)
async def delete_call(
    db: DbDep,
    user: UserDep,
    call_id: UUID
) -> None:
    """
    Delete call and associated data (transcripts, memories).
    GDPR compliant - permanently removes all personal data.
    """
    service = CallService(db)
    await service.delete_call(call_id, user)
