"""
Pydantic schema for Inbox component.

AUTO-GENERATED FROM ui-manifest.json - DO NOT EDIT MANUALLY
Source: application/inbox/inbox.tsx
Component Path: application/inbox/inbox
"""

from typing import Any, Literal

from pydantic import Field

from lightwave.schema.pydantic.core.base import JSONFieldSchema

from ._types import InboxEmail


class RootProps(JSONFieldSchema):
    """Root container for the inbox"""

    size: Literal["md", "sm"] | None = Field(default=None)
    column_labels: Any = Field(alias="columnLabels")
    action_labels: Any = Field(alias="actionLabels")
    priority_labels: Any = Field(alias="priorityLabels")
    status_labels: Any = Field(alias="statusLabels")
    empty_state_labels: Any = Field(alias="emptyStateLabels")
    filter_labels: Any = Field(alias="filterLabels")
    callbacks: Any | None = Field(default=None)


class HeaderProps(JSONFieldSchema):
    """Header with title, badge, and actions"""

    title: str
    badge: str | int | float | None = Field(default=None)
    description: str | None = Field(default=None)


class ToolbarProps(JSONFieldSchema):
    """Toolbar with search and filters"""

    on_search: Any | None = Field(default=None, alias="onSearch")
    on_refresh: Any | None = Field(default=None, alias="onRefresh")
    filters: Any | None = Field(default=None)
    on_filter_change: Any | None = Field(default=None, alias="onFilterChange")


class BulkActionsProps(JSONFieldSchema):
    """Bulk actions bar (shown when emails are selected)"""

    selected_count: int | float = Field(alias="selectedCount")
    on_bulk_action: Any | None = Field(default=None, alias="onBulkAction")
    on_clear_selection: Any | None = Field(default=None, alias="onClearSelection")


class ListProps(JSONFieldSchema):
    """Email list table"""

    emails: list[InboxEmail]
    is_loading: bool | None = Field(default=None, alias="isLoading")


class StatsProps(JSONFieldSchema):
    """Stats sidebar showing inbox statistics"""

    stats: Any


class StatCardProps(JSONFieldSchema):
    """Props for StatCard component."""

    label: str
    value: int | float
    icon: str
    highlight: bool | None = Field(default=None)
