"""
Modelos de dados para usuários
"""
from dataclasses import dataclass, field
from datetime import datetime
from typing import Dict, List, Optional, Any
from enum import Enum


class UserTier(Enum):
    """Nível do usuário"""
    FREE = "free"
    BASIC = "basic"
    PREMIUM = "premium"
    ENTERPRISE = "enterprise"


class UserStatus(Enum):
    """Status do usuário"""
    ACTIVE = "active"
    INACTIVE = "inactive"
    SUSPENDED = "suspended"
    PENDING = "pending"


@dataclass
class UserPreferences:
    """Preferências do usuário"""
    language: str = "pt-BR"
    tone: str = "professional"
    notifications: bool = True
    email_updates: bool = False
    theme: str = "light"
    custom_settings: Dict[str, Any] = field(default_factory=dict)


@dataclass
class User:
    """Usuário do sistema"""
    id: str
    name: str
    email: str
    tier: UserTier = UserTier.FREE
    status: UserStatus = UserStatus.ACTIVE
    preferences: UserPreferences = field(default_factory=UserPreferences)
    created_at: datetime = field(default_factory=datetime.now)
    last_active: datetime = field(default_factory=datetime.now)
    total_conversations: int = 0
    total_messages: int = 0
    metadata: Dict[str, Any] = field(default_factory=dict)

    def is_active(self) -> bool:
        """Verifica se usuário está ativo"""
        return self.status == UserStatus.ACTIVE

    def can_use_feature(self, feature: str) -> bool:
        """Verifica se pode usar feature baseado no tier"""
        tier_features = {
            UserTier.FREE: ["chat_basic", "history_7d"],
            UserTier.BASIC: ["chat_basic", "history_30d", "export"],
            UserTier.PREMIUM: ["chat_basic", "history_unlimited", "export", "api_access", "custom_personality"],
            UserTier.ENTERPRISE: ["all"]
        }

        allowed = tier_features.get(self.tier, [])
        return feature in allowed or "all" in allowed

    def update_activity(self):
        """Atualiza última atividade"""
        self.last_active = datetime.now()

    def increment_conversation(self):
        """Incrementa contador de conversas"""
        self.total_conversations += 1

    def increment_messages(self, count: int = 1):
        """Incrementa contador de mensagens"""
        self.total_messages += count

    def to_dict(self) -> Dict[str, Any]:
        return {
            "id": self.id,
            "name": self.name,
            "email": self.email,
            "tier": self.tier.value,
            "status": self.status.value,
            "preferences": {
                "language": self.preferences.language,
                "tone": self.preferences.tone,
                "theme": self.preferences.theme
            },
            "created_at": self.created_at.isoformat(),
            "last_active": self.last_active.isoformat(),
            "total_conversations": self.total_conversations,
            "total_messages": self.total_messages
        }


@dataclass
class UserSession:
    """Sessão de usuário"""
    id: str
    user_id: str
    started_at: datetime = field(default_factory=datetime.now)
    last_activity: datetime = field(default_factory=datetime.now)
    ip_address: Optional[str] = None
    user_agent: Optional[str] = None
    is_active: bool = True

    def touch(self):
        """Atualiza última atividade"""
        self.last_activity = datetime.now()

    def is_expired(self, timeout_minutes: int = 30) -> bool:
        """Verifica se sessão expirou"""
        inactive_time = (datetime.now() - self.last_activity).total_seconds() / 60
        return inactive_time > timeout_minutes