"""Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT."""

from __future__ import annotations
from supertone.types import BaseModel
from supertone.utils import FieldMetadata, QueryParamMetadata
from typing import Optional
from typing_extensions import Annotated, NotRequired, TypedDict


class SearchVoicesRequestTypedDict(TypedDict):
    page_size: NotRequired[float]
    r"""Number of items per page (default: 20, min: 10, max: 100)"""
    next_page_token: NotRequired[str]
    r"""Token for pagination (obtained from the previous page's response)"""
    name: NotRequired[str]
    r"""Search across name. Space separated."""
    description: NotRequired[str]
    r"""Search across description. Space separated."""
    language: NotRequired[str]
    r"""Filter by language (comma-separated)"""
    gender: NotRequired[str]
    r"""Filter by gender (comma-separated)"""
    age: NotRequired[str]
    r"""Filter by age (comma-separated)"""
    use_case: NotRequired[str]
    r"""Filter by use case (comma-separated)"""
    use_cases: NotRequired[str]
    r"""Filter by use cases array (comma-separated for OR logic)"""
    style: NotRequired[str]
    r"""Filter by style (comma-separated for OR, semicolon-separated for AND). Mixing comma and semicolon is invalid and will result in 400. Note: AND semantics apply across styles on a single character; cloned voices have a single style and will only match AND when exactly one style is requested and equals the cloned voice style."""
    model: NotRequired[str]
    r"""Filter by model (comma-separated)"""


class SearchVoicesRequest(BaseModel):
    page_size: Annotated[
        Optional[float],
        FieldMetadata(query=QueryParamMetadata(style="form", explode=True)),
    ] = None
    r"""Number of items per page (default: 20, min: 10, max: 100)"""

    next_page_token: Annotated[
        Optional[str],
        FieldMetadata(query=QueryParamMetadata(style="form", explode=True)),
    ] = None
    r"""Token for pagination (obtained from the previous page's response)"""

    name: Annotated[
        Optional[str],
        FieldMetadata(query=QueryParamMetadata(style="form", explode=True)),
    ] = None
    r"""Search across name. Space separated."""

    description: Annotated[
        Optional[str],
        FieldMetadata(query=QueryParamMetadata(style="form", explode=True)),
    ] = None
    r"""Search across description. Space separated."""

    language: Annotated[
        Optional[str],
        FieldMetadata(query=QueryParamMetadata(style="form", explode=True)),
    ] = None
    r"""Filter by language (comma-separated)"""

    gender: Annotated[
        Optional[str],
        FieldMetadata(query=QueryParamMetadata(style="form", explode=True)),
    ] = None
    r"""Filter by gender (comma-separated)"""

    age: Annotated[
        Optional[str],
        FieldMetadata(query=QueryParamMetadata(style="form", explode=True)),
    ] = None
    r"""Filter by age (comma-separated)"""

    use_case: Annotated[
        Optional[str],
        FieldMetadata(query=QueryParamMetadata(style="form", explode=True)),
    ] = None
    r"""Filter by use case (comma-separated)"""

    use_cases: Annotated[
        Optional[str],
        FieldMetadata(query=QueryParamMetadata(style="form", explode=True)),
    ] = None
    r"""Filter by use cases array (comma-separated for OR logic)"""

    style: Annotated[
        Optional[str],
        FieldMetadata(query=QueryParamMetadata(style="form", explode=True)),
    ] = None
    r"""Filter by style (comma-separated for OR, semicolon-separated for AND). Mixing comma and semicolon is invalid and will result in 400. Note: AND semantics apply across styles on a single character; cloned voices have a single style and will only match AND when exactly one style is requested and equals the cloned voice style."""

    model: Annotated[
        Optional[str],
        FieldMetadata(query=QueryParamMetadata(style="form", explode=True)),
    ] = None
    r"""Filter by model (comma-separated)"""
