"""
models.py
----------
Lightweight in-memory data structures for a screening session. In the full
application these map to the "Chat sessions" / "Messages" / "Questionnaire
responses" database tables — this module intentionally has no DB dependency
so the conversation/risk logic can be unit tested and reused independently
of storage choice.
"""

from dataclasses import dataclass, field
from datetime import datetime, timezone
from enum import Enum
from typing import Dict, List, Optional


class Speaker(str, Enum):
    BOT = "bot"
    USER = "user"


@dataclass
class Message:
    speaker: Speaker
    text: str
    timestamp: datetime = field(default_factory=lambda: datetime.now(timezone.utc))
    # Populated for USER messages once analyzed:
    nlp_features: Optional[Dict] = None


class SessionStage(str, Enum):
    INTRO_CONSENT = "intro_consent"
    RAPPORT_BUILDING = "rapport_building"
    PHQ9 = "phq9"
    GAD7 = "gad7"
    PSS10 = "pss10"
    OPEN_REFLECTION = "open_reflection"
    COMPLETE = "complete"
    SAFETY_PAUSED = "safety_paused"


@dataclass
class SessionState:
    session_id: str
    participant_id: str
    stage: SessionStage = SessionStage.INTRO_CONSENT
    consent_given: bool = False

    phq9_responses: List[int] = field(default_factory=list)
    gad7_responses: List[int] = field(default_factory=list)
    pss10_responses: List[int] = field(default_factory=list)

    current_item_index: int = 0
    messages: List[Message] = field(default_factory=list)
    safety_paused: bool = False
    started_at: datetime = field(default_factory=lambda: datetime.now(timezone.utc))
    completed_at: Optional[datetime] = None

    def add_message(self, speaker: Speaker, text: str, nlp_features: Optional[Dict] = None) -> None:
        self.messages.append(Message(speaker=speaker, text=text, nlp_features=nlp_features))

    def total_items_answered(self) -> int:
        return len(self.phq9_responses) + len(self.gad7_responses) + len(self.pss10_responses)

    def total_items_expected(self) -> int:
        return 9 + 7 + 10  # PHQ-9 + GAD-7 + PSS-10
