from datetime import datetime

from pydantic import BaseModel, EmailStr, Field

from app.domain.enums import CompanyUserStatus


class RolePermission(BaseModel):
    id: str | None = None
    module: str = Field(..., min_length=1, max_length=80)
    can_view: bool = False
    can_add: bool = False
    can_edit: bool = False
    can_delete: bool = False
    can_export: bool = False

    model_config = {"from_attributes": True}


class Role(BaseModel):
    id: str | None = None
    company_id: str
    name: str
    slug: str
    description: str | None = None
    permissions: list[RolePermission] = Field(default_factory=list)
    users_count: int = 0
    created_by: str | None = None
    created_at: datetime = Field(default_factory=datetime.utcnow)
    updated_at: datetime = Field(default_factory=datetime.utcnow)

    model_config = {"from_attributes": True}


class UsersRolesSummary(BaseModel):
    total_users: int = 0
    active_users: int = 0
    disabled_users: int = 0
    total_roles: int = 0


class CompanyUser(BaseModel):
    id: str | None = None
    company_id: str
    full_name: str
    username: str
    email: EmailStr | str
    phone: str | None = None
    employee_code: str | None = None
    password_hash: str | None = None
    role_id: str
    role_name: str | None = None
    role_slug: str | None = None
    department_id: str | None = None
    department_code: str | None = None
    department_name: str | None = None
    status: CompanyUserStatus = CompanyUserStatus.ACTIVE
    send_welcome_email: bool = False
    address: str | None = None
    notes: str | None = None
    last_login: datetime | None = None
    created_by: str | None = None
    created_at: datetime = Field(default_factory=datetime.utcnow)
    updated_at: datetime = Field(default_factory=datetime.utcnow)

    model_config = {"from_attributes": True}
