from typing import List, Literal, Optional
from pydantic import BaseModel, Field

Category = Literal[
    "Symptoms",
    "Ophthalmic Findings",
    "Diagnostic Tools",
    "Systemic Risk Factors",
    "Treatment Options",
    "Demographics/History",
]

class Evidence(BaseModel):
    quote: str = Field(..., description="Short exact quote from transcript")
    speaker: Optional[str] = Field(None, description="Speaker label if available (S1/S2 etc.)")

class EntityItem(BaseModel):
    name: str
    evidence: List[Evidence] = Field(default_factory=list)

class EntitiesByCategory(BaseModel):
    category: Category
    items: List[EntityItem] = Field(default_factory=list)

class PatientPerspective(BaseModel):
    occurrence: List[str] = Field(default_factory=list, description="Onset/timing/frequency/triggers")
    severity: List[str] = Field(default_factory=list, description="Severity + impact on life")
    concerns: List[str] = Field(default_factory=list, description="Fears/worries/cost/limitations")
    goals: List[str] = Field(default_factory=list, description="What patient hopes to achieve")

    occurrence_evidence: List[Evidence] = Field(default_factory=list)
    severity_evidence: List[Evidence] = Field(default_factory=list)
    concerns_evidence: List[Evidence] = Field(default_factory=list)
    goals_evidence: List[Evidence] = Field(default_factory=list)

Sentiment = Literal["positive", "neutral", "negative", "mixed", "unknown"]

class EntityPresenceSentiment(BaseModel):
    category: Category
    entity: str
    present: bool
    sentiment: Sentiment = "unknown"
    evidence: List[Evidence] = Field(default_factory=list)


class ConversationReport(BaseModel):
    conversation_id: str
    source_files: List[str]

    # (2) Questions
    questions_asked: List[str] = Field(default_factory=list, description="Distinct question templates asked by interviewer")

    # (3) Entities
    entities: List[EntitiesByCategory] = Field(default_factory=list)

    # (4) Patient perspective
    patient_perspective: PatientPerspective

    # (5) Predefined entity presence + sentiment (sir's requirement)
    entity_presence_sentiment: List[EntityPresenceSentiment] = Field(default_factory=list)


class BatchSummary(BaseModel):
    total_unique_conversations: int
    conversation_ids: List[str]
    global_distinct_questions: List[str]


