from __future__ import annotations

from datetime import datetime

from pydantic import BaseModel, EmailStr, Field

from app.domain.enums import CompanyUserStatus


class RolePermissionSchema(BaseModel):
    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


class RoleCreate(BaseModel):
    name: str = Field(..., min_length=1, max_length=200)
    slug: str = Field(..., min_length=1, max_length=100)
    description: str | None = Field(None, max_length=500)
    permissions: list[RolePermissionSchema] = Field(default_factory=list)


class RoleUpdate(BaseModel):
    name: str | None = Field(None, min_length=1, max_length=200)
    slug: str | None = Field(None, min_length=1, max_length=100)
    description: str | None = Field(None, max_length=500)
    permissions: list[RolePermissionSchema] | None = None


class RolePermissionResponse(BaseModel):
    id: str | None = None
    module: str
    can_view: bool
    can_add: bool
    can_edit: bool
    can_delete: bool
    can_export: bool

    model_config = {"from_attributes": True}


class RoleResponse(BaseModel):
    id: str
    company_id: str
    name: str
    slug: str
    description: str | None = None
    permissions: list[RolePermissionResponse] = Field(default_factory=list)
    users_count: int = 0
    created_by: str | None = None
    created_at: datetime
    updated_at: datetime

    model_config = {"from_attributes": True}


class CompanyUserCreate(BaseModel):
    full_name: str = Field(..., min_length=1, max_length=200)
    username: str = Field(..., min_length=3, max_length=30)
    email: EmailStr
    phone: str | None = Field(None, max_length=50)
    employee_code: str | None = Field(None, max_length=50)
    password: str = Field(..., min_length=6)
    confirm_password: str = Field(..., min_length=6)
    role_id: str = Field(..., min_length=1)
    department_id: str | None = None
    status: CompanyUserStatus = CompanyUserStatus.ACTIVE
    send_welcome_email: bool = False
    address: str | None = None
    notes: str | None = None


class CompanyUserUpdate(BaseModel):
    full_name: str | None = Field(None, min_length=1, max_length=200)
    username: str | None = Field(None, min_length=3, max_length=30)
    email: EmailStr | None = None
    phone: str | None = Field(None, max_length=50)
    employee_code: str | None = Field(None, max_length=50)
    password: str | None = Field(None, min_length=6)
    confirm_password: str | None = Field(None, min_length=6)
    role_id: str | None = None
    department_id: str | None = None
    status: CompanyUserStatus | None = None
    send_welcome_email: bool | None = None
    address: str | None = None
    notes: str | None = None
    last_login: datetime | None = None


class CompanyUserResponse(BaseModel):
    id: str
    company_id: str
    full_name: str
    username: str
    email: str
    phone: str | None = None
    employee_code: 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
    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
    updated_at: datetime

    model_config = {"from_attributes": True}


class UsersRolesSummaryResponse(BaseModel):
    total_users: int
    active_users: int
    disabled_users: int
    total_roles: int


class UsersImportResponse(BaseModel):
    created: int
    failed: int
    errors: list[dict] = Field(default_factory=list)


class PermissionModuleMeta(BaseModel):
    key: str
    label: str
    children: list["PermissionModuleMeta"] = Field(default_factory=list)
