"""Pydantic schemas for API requests and responses.""" from datetime import datetime from typing import Optional from pydantic import BaseModel, Field class BibTeXVerifyRequest(BaseModel): """Request model for BibTeX verification.""" bibtex_content: str = Field( ..., description="BibTeX content to verify", min_length=1, examples=[ """@article{example2023, title={Example Paper Title}, author={Smith, John and Doe, Jane}, journal={Example Journal}, year={2023} }""" ], ) class EntryComparisonResponse(BaseModel): """Response model for a single entry comparison.""" key: str = Field(..., description="BibTeX entry key") status: str = Field(..., description="Verification status: verified, warning, or error") is_match: bool = Field(..., description="Whether entry matches a database record") has_issues: bool = Field(..., description="Whether entry has metadata issues") source: Optional[str] = Field(None, description="Data source that verified the entry") confidence: float = Field(..., description="Confidence score (0-1)") title_match: bool = Field(..., description="Whether title matches") author_match: bool = Field(..., description="Whether authors match") year_match: bool = Field(..., description="Whether year matches") venue_match: Optional[bool] = Field(None, description="Whether venue matches") fetched_title: Optional[str] = Field(None, description="Title from database") fetched_authors: Optional[list[str]] = Field(None, description="Authors from database") fetched_year: Optional[str] = Field(None, description="Year from database") fetched_doi: Optional[str] = Field(None, description="DOI from database") fetched_url: Optional[str] = Field(None, description="URL from database") original_bibtex: str = Field(..., description="Original BibTeX entry") class DuplicateGroupResponse(BaseModel): """Response model for duplicate entry groups.""" entry_keys: list[str] = Field(..., description="Keys of duplicate entries") reason: str = Field(..., description="Reason for duplicate detection") class BibTeXVerifyResponse(BaseModel): """Response model for BibTeX verification.""" success: bool = Field(..., description="Whether verification completed successfully") message: str = Field(..., description="Status message") total_count: int = Field(..., description="Total number of entries") verified_count: int = Field(..., description="Number of verified entries") warning_count: int = Field(..., description="Number of entries with warnings") error_count: int = Field(..., description="Number of entries with errors") success_rate: float = Field(..., description="Success rate percentage") entries: list[EntryComparisonResponse] = Field(..., description="Verification results for each entry") duplicate_groups: list[DuplicateGroupResponse] = Field( default_factory=list, description="Groups of duplicate entries" ) timestamp: datetime = Field(default_factory=datetime.utcnow, description="Verification timestamp") class HealthResponse(BaseModel): """Response model for health check.""" status: str = Field(..., description="Service status") version: str = Field(..., description="Application version") environment: str = Field(..., description="Runtime environment") timestamp: datetime = Field(default_factory=datetime.utcnow, description="Current timestamp") class StatsResponse(BaseModel): """Response model for statistics.""" cache_enabled: bool = Field(..., description="Whether cache is enabled") cache_size: int = Field(..., description="Current cache size") cache_max_size: int = Field(..., description="Maximum cache size") cache_ttl: int = Field(..., description="Cache TTL in seconds") class ErrorResponse(BaseModel): """Response model for errors.""" error: str = Field(..., description="Error type") message: str = Field(..., description="Error message") details: Optional[dict] = Field(None, description="Additional error details") timestamp: datetime = Field(default_factory=datetime.utcnow, description="Error timestamp")