from typing import Optional
from pydantic import BaseModel, EmailStr, field_validator

from src.core.constants import UserRole

ALLOWED_TENANT_ROLES = {
    UserRole.ADMINISTRATOR.value,
    UserRole.MANAGER.value,
    UserRole.STAFF.value,
    UserRole.VIEW_ONLY.value,
}


class InviteUserRequest(BaseModel):
    name: str
    email: EmailStr
    role: str = UserRole.STAFF.value

    @field_validator("name")
    @classmethod
    def validate_name(cls, v: str) -> str:
        v = v.strip()
        if len(v) < 2:
            raise ValueError("Name must be at least 2 characters")
        if len(v) > 80:
            raise ValueError("Name must be at most 80 characters")
        return v

    @field_validator("role")
    @classmethod
    def validate_role(cls, v: str) -> str:
        if v not in ALLOWED_TENANT_ROLES:
            raise ValueError(f"Role must be one of: {', '.join(sorted(ALLOWED_TENANT_ROLES))}")
        return v


class UpdateUserRequest(BaseModel):
    first_name: Optional[str] = None
    last_name: Optional[str] = None
    role: Optional[str] = None
    status: Optional[str] = None


class UpdateRoleRequest(BaseModel):
    role: str

    @field_validator("role")
    @classmethod
    def validate_role(cls, v: str) -> str:
        if v not in ALLOWED_TENANT_ROLES:
            raise ValueError(f"Role must be one of: {', '.join(sorted(ALLOWED_TENANT_ROLES))}")
        return v
