from __future__ import annotations

import uuid
from collections import defaultdict
from typing import Dict, List, Literal, Optional

from app.models import ChatMessage, QueryIntent


class ConversationStore:
    """In-memory session state for iterative exploration."""

    def __init__(self) -> None:
        self._messages: Dict[str, List[ChatMessage]] = defaultdict(list)
        self._last_intent: Dict[str, QueryIntent] = {}

    def new_session(self) -> str:
        sid = str(uuid.uuid4())
        self._messages[sid] = []
        return sid

    def append(self, session_id: str, role: Literal["user", "assistant", "system"], content: str) -> None:
        self._messages[session_id].append(ChatMessage(role=role, content=content))

    def history(self, session_id: str, max_turns: int = 8) -> List[ChatMessage]:
        return self._messages.get(session_id, [])[-max_turns:]

    def set_last_intent(self, session_id: str, intent: QueryIntent) -> None:
        self._last_intent[session_id] = intent

    def get_last_intent(self, session_id: str) -> Optional[QueryIntent]:
        return self._last_intent.get(session_id)

    def has_session(self, session_id: str) -> bool:
        return session_id in self._messages
