"""
User & Organization Pydantic Schemas

Validation schemas for Gitea user and organization operations.
"""

from datetime import datetime

from pydantic import BaseModel, ConfigDict, Field


class User(BaseModel):
    """Gitea user model"""

    model_config = ConfigDict(extra="allow")

    id: int
    login: str
    full_name: str | None = None
    email: str | None = None
    avatar_url: str
    language: str | None = None
    is_admin: bool = False
    last_login: datetime | None = None
    created: datetime
    restricted: bool = False
    active: bool = True
    prohibit_login: bool = False
    location: str | None = None
    website: str | None = None
    description: str | None = None
    visibility: str | None = None
    followers_count: int = 0
    following_count: int = 0
    starred_repos_count: int = 0
    username: str | None = None  # Alias for login


class Organization(BaseModel):
    """Gitea organization model"""

    model_config = ConfigDict(extra="allow")

    id: int
    name: str  # org username
    full_name: str | None = None
    avatar_url: str
    description: str | None = None
    website: str | None = None
    location: str | None = None
    visibility: str  # "public", "limited", "private"
    repo_admin_change_team_access: bool = False
    username: str | None = None  # Alias for name


class Team(BaseModel):
    """Organization team model"""

    model_config = ConfigDict(extra="allow")

    id: int
    name: str
    description: str | None = None
    organization: Organization | None = None
    permission: str  # "none", "read", "write", "admin", "owner"
    can_create_org_repo: bool = False
    includes_all_repositories: bool = False
    units: list[str] | None = None
    units_map: dict | None = None


class TeamMember(BaseModel):
    """Team member model"""

    model_config = ConfigDict(extra="allow")

    user: User
    role: str | None = None  # Role in team


class Email(BaseModel):
    """User email model"""

    model_config = ConfigDict(extra="allow")

    email: str
    verified: bool
    primary: bool


class SearchUsersRequest(BaseModel):
    """Request to search users"""

    model_config = ConfigDict(extra="forbid")

    q: str | None = Field(None, description="Search query")
    uid: int | None = Field(None, description="User ID")


class SearchOrgsRequest(BaseModel):
    """Request to search organizations"""

    model_config = ConfigDict(extra="forbid")

    q: str | None = Field(None, description="Search query")
