from datetime import datetime
from enum import Enum

from pydantic import BaseModel, EmailStr, field_serializer, field_validator


class UserRole(str, Enum):
    PLATFORM_ADMIN = "platform_admin"
    PLATFORM_USER = "platform_user"
    CUSTOMER_ADMIN = "customer_admin"
    CUSTOMER_USER = "customer_user"


class UserRegister(BaseModel):
    email: EmailStr
    password: str
    name: str

    @field_validator("password")
    @classmethod
    def validate_password(cls, v: str) -> str:
        from app.core.security import validate_password_strength

        is_valid, error_msg = validate_password_strength(v)
        if not is_valid:
            raise ValueError(error_msg)
        return v


class UserLogin(BaseModel):
    email: EmailStr
    password: str


class EmailVerification(BaseModel):
    token: str


class ResendVerification(BaseModel):
    email: EmailStr


class UserCreate(BaseModel):
    email: EmailStr
    password: str
    name: str
    role: str = "customer_user"
    tenant_id: int | None = None

    @field_validator("password")
    @classmethod
    def validate_password(cls, v: str) -> str:
        from app.core.security import validate_password_strength

        is_valid, error_msg = validate_password_strength(v)
        if not is_valid:
            raise ValueError(error_msg)
        return v


class UserUpdate(BaseModel):
    name: str | None = None
    email: EmailStr | None = None
    role: str | None = None
    tenant_id: int | None = None
    is_verified: bool | None = None
    role_ids: list[int] | None = None
    role_ids: list[int] | None = None


class UserResponse(BaseModel):
    id: int
    email: str
    name: str
    role: str
    roles: list[str] = []
    tenant_id: int | None = None
    company_name: str | None = None
    role_display: str | None = None
    is_verified: bool
    last_login: datetime | None = None
    created_at: datetime

    @field_serializer("last_login", "created_at")
    def serialize_datetime(self, dt: datetime | None, _info):
        if dt is None:
            return None
        return dt.isoformat()

    class Config:
        from_attributes = True


class DashboardStats(BaseModel):
    total_users: int
    online_users: int
    verified_users: int
    admin_users: int
    popular_models: list[dict] = []
    popular_agents: list[dict] = []
    recent_activities: list[dict] = []
