from __future__ import annotations
from pydantic import Field

from app.models.enums import Role
from app.schemas.common import ORMModel

FUNCTIONALITY_KEYS = {"dashboard", "requisitions", "procurement", "tendering", "reports"}


class UserBase(ORMModel):
    username: str
    full_name: str
    email: str | None = None
    role: Role = Role.viewer
    is_active: bool = True
    functionality_access: list[str] | None = None


class UserCreate(UserBase):
    password: str = Field(min_length=8)


class UserUpdate(ORMModel):
    username: str | None = Field(default=None, min_length=1, max_length=80)
    full_name: str | None = None
    email: str | None = None
    role: Role | None = None
    is_active: bool | None = None
    functionality_access: list[str] | None = None
    password: str | None = Field(default=None, min_length=8)


class ProfileUpdate(ORMModel):
    full_name: str = Field(min_length=1, max_length=160)
    email: str | None = None


class PasswordChange(ORMModel):
    current_password: str
    new_password: str = Field(min_length=8)


class UserRead(UserBase):
    id: int


class Token(ORMModel):
    access_token: str
    token_type: str = "bearer"
    expires_in: int
    user: UserRead
