"""
Gerenciamento de contexto do usuário e sessão
"""
from typing import Dict, Any, Optional
from datetime import datetime, timedelta
import json
import os


class ContextManager:
    """
    Mantém contexto de usuários entre interações
    Útil para: preferências, estado, dados temporários
    """
    
    def __init__(self, storage_path: str = "context_storage.json"):
        self.storage_path = storage_path
        self.contexts: Dict[str, Dict] = {}
        self._load_storage()
    
    def _load_storage(self):
        """Carrega contextos do disco"""
        if os.path.exists(self.storage_path):
            try:
                with open(self.storage_path, 'r') as f:
                    self.contexts = json.load(f)
            except:
                self.contexts = {}
    
    def _save_storage(self):
        """Salva contextos no disco"""
        with open(self.storage_path, 'w') as f:
            json.dump(self.contexts, f, default=str)
    
    def get_context(self, user_id: str) -> Dict[str, Any]:
        """Obtém contexto do usuário"""
        if user_id not in self.contexts:
            self.contexts[user_id] = {
                "created_at": datetime.now().isoformat(),
                "preferences": {},
                "state": {},
                "temp_data": {}
            }
        return self.contexts[user_id]
    
    def update_context(self, user_id: str, key: str, value: Any):
        """Atualiza um campo do contexto"""
        context = self.get_context(user_id)
        context[key] = value
        context["updated_at"] = datetime.now().isoformat()
        self._save_storage()
    
    def set_preference(self, user_id: str, key: str, value: Any):
        """Define preferência do usuário"""
        context = self.get_context(user_id)
        context["preferences"][key] = value
        self._save_storage()
    
    def get_preference(self, user_id: str, key: str, default: Any = None) -> Any:
        """Obtém preferência do usuário"""
        context = self.get_context(user_id)
        return context["preferences"].get(key, default)
    
    def set_state(self, user_id: str, state: str, data: Optional[Dict] = None):
        """
        Define estado atual do usuário
        Estados: idle, waiting_input, processing, error
        """
        context = self.get_context(user_id)
        context["state"] = {
            "current": state,
            "data": data or {},
            "since": datetime.now().isoformat()
        }
        self._save_storage()
    
    def get_state(self, user_id: str) -> Dict[str, Any]:
        """Obtém estado atual"""
        context = self.get_context(user_id)
        return context.get("state", {"current": "idle"})
    
    def set_temp_data(self, user_id: str, key: str, value: Any, ttl: int = 3600):
        """
        Armazena dados temporários com TTL (time to live)
        """
        context = self.get_context(user_id)
        expires = (datetime.now() + timedelta(seconds=ttl)).isoformat()
        context["temp_data"][key] = {
            "value": value,
            "expires": expires
        }
        self._save_storage()
    
    def get_temp_data(self, user_id: str, key: str) -> Optional[Any]:
        """Obtém dado temporário se não expirado"""
        context = self.get_context(user_id)
        data = context.get("temp_data", {}).get(key)
        
        if not data:
            return None
        
        expires = datetime.fromisoformat(data["expires"])
        if datetime.now() > expires:
            # Remover expirado
            del context["temp_data"][key]
            self._save_storage()
            return None
        
        return data["value"]
    
    def clear_context(self, user_id: str):
        """Limpa todo contexto do usuário"""
        if user_id in self.contexts:
            del self.contexts[user_id]
            self._save_storage()
    
    def get_user_profile(self, user_id: str) -> Dict[str, Any]:
        """Retorna perfil completo do usuário"""
        context = self.get_context(user_id)
        return {
            "user_id": user_id,
            "preferences": context.get("preferences", {}),
            "state": context.get("state", {}),
            "created_at": context.get("created_at"),
            "last_interaction": context.get("updated_at")
        }