# generated by datamodel-codegen:
#   filename:  <stdin>
#   timestamp: 1985-10-26T08:21:00+00:00

from __future__ import annotations

from collections import defaultdict
from collections.abc import Callable, Mapping, Sequence
from typing import Any, Literal, TypeAlias

from datamodel_code_generator.enums import (
    ServerBodyMode,
    ServerHandlerMode,
    StrictTypes,
)
from datamodel_code_generator.validators import ModelValidators
from typing_extensions import NotRequired, TypedDict

AliasGenerator: TypeAlias = Literal['to_camel', 'to_pascal', 'to_snake']


AllExportsCollisionStrategy: TypeAlias = Literal[
    'error', 'minimal-prefix', 'full-prefix'
]


AllExportsScope: TypeAlias = Literal['children', 'recursive']


AllOfClassHierarchy: TypeAlias = Literal['if-no-conflict', 'always']


AllOfMergeMode: TypeAlias = Literal['constraints', 'all', 'none']


ClassNameAffixScope: TypeAlias = Literal['all', 'models', 'enums']


ClientAsyncAPIPerspective: TypeAlias = Literal['server', 'client']


ClientBodyArguments: TypeAlias = Literal['body', 'both']


ClientSignatureStyle: TypeAlias = Literal['explicit', 'unpack']


ClientType: TypeAlias = Literal['httpx2']


CollapseRootModelsNameStrategy: TypeAlias = Literal['child', 'parent']


ConstructorFieldOrder: TypeAlias = Literal['final-names', 'written-defaults']


CustomFileHeaderMode: TypeAlias = Literal['replace', 'prepend']


DataModelType: TypeAlias = Literal[
    'pydantic_v2.BaseModel',
    'pydantic_v2.dataclass',
    'dataclasses.dataclass',
    'typing.TypedDict',
    'msgspec.Struct',
]


class DataclassArguments(TypedDict, closed=True):
    init: NotRequired[bool]
    repr: NotRequired[bool]
    eq: NotRequired[bool]
    order: NotRequired[bool]
    unsafe_hash: NotRequired[bool]
    frozen: NotRequired[bool]
    match_args: NotRequired[bool]
    kw_only: NotRequired[bool]
    slots: NotRequired[bool]
    weakref_slot: NotRequired[bool]


DateClassType: TypeAlias = Literal['date', 'PastDate', 'FutureDate']


DatetimeClassType: TypeAlias = Literal[
    'datetime', 'AwareDatetime', 'NaiveDatetime', 'PastDatetime', 'FutureDatetime'
]


DefaultValueType: TypeAlias = Literal['decimal', 'enum']


FieldTypeCollisionStrategy: TypeAlias = Literal['rename-field', 'rename-type']


Formatter: TypeAlias = Literal['builtin', 'black', 'isort', 'ruff-check', 'ruff-format']


GraphQLScope: TypeAlias = Literal['schema']


HTTPBackend: TypeAlias = Literal['auto', 'httpx', 'httpx2']


InputFileType: TypeAlias = Literal[
    'auto',
    'openapi',
    'asyncapi',
    'jsonschema',
    'mcp-tools',
    'xmlschema',
    'protobuf',
    'avro',
    'json',
    'yaml',
    'dict',
    'csv',
    'graphql',
]


LiteralType: TypeAlias = Literal['all', 'one', 'none']


ModuleSplitMode: TypeAlias = Literal['single']


NamingStrategy: TypeAlias = Literal[
    'numbered',
    'parent-prefixed',
    'full-path',
    'primary-first',
    'definitions-first',
    'enclosing-model',
]


OpenAPIAsDefinitions: TypeAlias = Literal['paths-bodies', 'ref-components']


OpenAPIScope: TypeAlias = Literal[
    'schemas', 'paths', 'tags', 'parameters', 'webhooks', 'requestbodies', 'api'
]


PythonVersion: TypeAlias = Literal['3.10', '3.11', '3.12', '3.13', '3.14', '3.15']


ReadOnlyWriteOnlyModelType: TypeAlias = Literal['request-response', 'all']


ReuseScope: TypeAlias = Literal['module', 'tree']


SchemaValidatorType: TypeAlias = Literal['pydantic-v2']


ServerBodyModeModel: TypeAlias = Literal['typed', 'request']


ServerHandlerModeModel: TypeAlias = Literal['sync', 'async']


ServerLayout: TypeAlias = Literal['routers', 'single']


ServerType: TypeAlias = Literal['fastapi']


StrictTypesModel: TypeAlias = Literal['str', 'bytes', 'int', 'float', 'bool']


TargetPydanticVersion: TypeAlias = Literal['2', '2.11', '2.12', '2.14']


UnionMode: TypeAlias = Literal['smart', 'left_to_right']


ValidatorMode: TypeAlias = Literal['before', 'after', 'wrap', 'plain']


VersionMode: TypeAlias = Literal['lenient', 'strict']


class BaseGenerateConfig(TypedDict):
    input_file_type: NotRequired[InputFileType]
    output: NotRequired[str | None]
    emit_model_metadata: NotRequired[str | None]
    output_model_type: NotRequired[DataModelType]
    preset: NotRequired[str | None]
    target_python_version: NotRequired[PythonVersion]
    target_pydantic_version: NotRequired[TargetPydanticVersion | None]
    base_class: NotRequired[str]
    base_class_map: NotRequired[dict[str, str | list[str]] | None]
    model_name_map: NotRequired[dict[str, str] | None]
    additional_imports: NotRequired[list[str] | None]
    class_decorators: NotRequired[list[str] | None]
    custom_template_dir: NotRequired[str | None]
    schema_validator_type: NotRequired[SchemaValidatorType | None]
    generate_schema_validators: NotRequired[bool]
    check_pattern_maps_strictly: NotRequired[bool]
    schema_validator_base_class_name: NotRequired[str | None]
    validation: NotRequired[bool]
    field_constraints: NotRequired[bool]
    alias_generator: NotRequired[AliasGenerator | None]
    pin_aliases_with_alias_generator: NotRequired[bool]
    snake_case_field: NotRequired[bool]
    strip_default_none: NotRequired[bool]
    disable_timestamp: NotRequired[bool]
    enable_version_header: NotRequired[bool]
    enable_command_header: NotRequired[bool]
    enable_generated_header_marker: NotRequired[bool]
    allow_population_by_field_name: NotRequired[bool]
    allow_extra_fields: NotRequired[bool]
    extra_fields: NotRequired[str | None]
    use_generic_base_class: NotRequired[bool]
    class_name: NotRequired[str | None]
    allow_leading_underscore_class_name: NotRequired[bool]
    class_name_prefix: NotRequired[str | None]
    class_name_suffix: NotRequired[str | None]
    class_name_affix_scope: NotRequired[ClassNameAffixScope]
    use_standard_collections: NotRequired[bool]
    use_schema_description: NotRequired[bool]
    use_field_description: NotRequired[bool]
    use_field_description_example: NotRequired[bool]
    use_attribute_docstrings: NotRequired[bool]
    use_inline_field_description: NotRequired[bool]
    use_single_line_docstring: NotRequired[bool]
    use_default_kwarg: NotRequired[bool]
    apply_field_options_to_every_field: NotRequired[bool]
    deserialize_default_values: NotRequired[Sequence[DefaultValueType]]
    use_missing_sentinel: NotRequired[bool]
    reuse_model: NotRequired[bool]
    reuse_scope: NotRequired[ReuseScope]
    shared_module_name: NotRequired[str]
    encoding: NotRequired[str]
    enum_field_as_literal: NotRequired[LiteralType | None]
    enum_field_as_literal_map: NotRequired[dict[str, str] | None]
    ignore_enum_constraints: NotRequired[bool]
    use_one_literal_as_default: NotRequired[bool]
    use_enum_values_in_discriminator: NotRequired[bool]
    merge_shared_variant_tags: NotRequired[bool]
    read_schema_version_per_document: NotRequired[bool]
    read_escaped_ref_pointers: NotRequired[bool]
    read_dynamic_anchors_in_document_order: NotRequired[bool]
    ignore_ref_siblings_by_schema_version: NotRequired[bool]
    use_msgspec_tagged_unions: NotRequired[bool]
    tag_msgspec_by_payload_name: NotRequired[bool]
    use_msgspec_nullable_enum_alias: NotRequired[bool]
    use_msgspec_forbid_unknown_fields: NotRequired[bool]
    use_typed_nullable_map_values: NotRequired[bool]
    use_typed_map_values_beside_other_types: NotRequired[bool]
    use_single_dict_for_object_maps: NotRequired[bool]
    read_unevaluated_properties: NotRequired[bool]
    use_single_value_enum_as_const: NotRequired[bool]
    read_const_beside_enum: NotRequired[bool]
    filter_literal_values: NotRequired[bool]
    intersect_allof_keywords: NotRequired[bool]
    intersect_combined_schema_keywords: NotRequired[bool]
    distribute_allof_over_unions: NotRequired[bool]
    read_allof_parents_in_mro_order: NotRequired[bool]
    read_nullable_beside_type_list: NotRequired[bool]
    keep_field_defaults_off_branch_roots: NotRequired[bool]
    keep_enum_member_values: NotRequired[bool]
    set_default_enum_member: NotRequired[bool]
    use_subclass_enum: NotRequired[bool]
    use_specialized_enum: NotRequired[bool]
    strict_nullable: NotRequired[bool]
    omit_redundant_reference_null: NotRequired[bool]
    keep_reference_null_on_merged_models: NotRequired[bool]
    use_generic_container_types: NotRequired[bool]
    enable_faux_immutability: NotRequired[bool]
    disable_appending_item_suffix: NotRequired[bool]
    singularize_last_word_of_item_names: NotRequired[bool]
    empty_enum_field_name: NotRequired[str | None]
    field_extra_keys: NotRequired[set[str] | None]
    field_include_all_keys: NotRequired[bool]
    field_extra_keys_without_x_prefix: NotRequired[set[str] | None]
    model_extra_keys: NotRequired[set[str] | None]
    model_extra_keys_without_x_prefix: NotRequired[set[str] | None]
    include_path_parameters: NotRequired[bool]
    openapi_include_paths: NotRequired[list[str] | None]
    openapi_include_info_version: NotRequired[bool]
    openapi_as_definitions: NotRequired[Sequence[OpenAPIAsDefinitions]]
    graphql_no_typename: NotRequired[bool]
    wrap_string_literal: NotRequired[bool | None]
    use_title_as_name: NotRequired[bool]
    infer_union_variant_names: NotRequired[bool]
    use_tag_as_union_variant_name: NotRequired[bool]
    name_allof_union_members_after_branches: NotRequired[bool]
    use_operation_id_as_name: NotRequired[bool]
    use_unique_items_as_set: NotRequired[bool]
    use_unique_items_as_set_by_value: NotRequired[bool]
    use_tuple_for_fixed_items: NotRequired[bool]
    use_tuple_for_closed_arrays: NotRequired[bool]
    use_tuple_for_fixed_length_arrays: NotRequired[bool]
    use_total_false_for_typed_dict: NotRequired[bool]
    use_closed_typed_dict: NotRequired[bool]
    allof_merge_mode: NotRequired[AllOfMergeMode]
    allof_class_hierarchy: NotRequired[AllOfClassHierarchy]
    allow_remote_refs: NotRequired[bool | None]
    strict_refs: NotRequired[bool]
    untrusted_input: NotRequired[bool]
    allow_private_network: NotRequired[bool]
    http_backend: NotRequired[HTTPBackend]
    http_headers: NotRequired[Sequence[tuple[str, str]] | None]
    http_local_ref_path: NotRequired[str | None]
    http_ignore_tls: NotRequired[bool]
    http_timeout: NotRequired[float | None]
    lockfile: NotRequired[str | None]
    update_lock: NotRequired[bool]
    locked: NotRequired[bool]
    use_annotated: NotRequired[bool]
    use_serialize_as_any: NotRequired[bool]
    use_serialize_as_any_for_every_subclass: NotRequired[bool]
    use_non_positive_negative_number_constrained_types: NotRequired[bool]
    use_decimal_for_multiple_of: NotRequired[bool]
    use_decimal_in_field_forms: NotRequired[bool]
    use_encoded_str_for_constrained_base64: NotRequired[bool]
    use_strict_str_for_base64: NotRequired[bool]
    use_msgspec_meta_for_map_keys: NotRequired[bool]
    omit_redundant_constraints: NotRequired[bool]
    read_length_keywords_by_type: NotRequired[bool]
    read_msgspec_union_bounds_exactly: NotRequired[bool]
    read_input_model_dataclass_fields_by_alias: NotRequired[bool]
    reuse_every_reached_input_model_type: NotRequired[bool]
    use_site_models_for_constrained_refs: NotRequired[bool]
    use_one_model_per_ref_site: NotRequired[bool]
    original_field_name_delimiter: NotRequired[str | None]
    use_double_quotes: NotRequired[bool]
    use_union_operator: NotRequired[bool]
    collapse_root_models: NotRequired[bool]
    collapse_root_models_name_strategy: NotRequired[
        CollapseRootModelsNameStrategy | None
    ]
    collapse_shared_parent_wrappers: NotRequired[bool]
    keep_constrained_root_models_in_every_container: NotRequired[bool]
    keep_enum_literal_aliases: NotRequired[bool]
    keep_reference_null_on_collapsed_root_models: NotRequired[bool]
    keep_shared_members_on_collapsed_root_models: NotRequired[bool]
    collapse_constrained_root_models_as_annotated: NotRequired[bool]
    remove_unused_models_beside_type_overrides: NotRequired[bool]
    keep_self_referencing_array_items: NotRequired[bool]
    keep_defaults_of_inherited_required_fields: NotRequired[bool]
    omit_incomplete_model_defaults: NotRequired[bool]
    collapse_reuse_models: NotRequired[bool]
    skip_root_model: NotRequired[bool]
    use_root_model_sequence_interface: NotRequired[bool]
    use_type_alias: NotRequired[bool]
    use_type_alias_type: NotRequired[bool]
    use_root_model_type_alias: NotRequired[bool]
    use_plain_alias_for_recursive_models: NotRequired[bool]
    special_field_name_prefix: NotRequired[str | None]
    remove_special_field_name_prefix: NotRequired[bool]
    capitalise_enum_members: NotRequired[bool]
    capitalise_numbered_enum_members: NotRequired[bool]
    keep_model_order: NotRequired[bool]
    order_constructor_fields_by: NotRequired[Sequence[ConstructorFieldOrder]]
    custom_file_header: NotRequired[str | None]
    custom_file_header_path: NotRequired[str | None]
    custom_file_header_mode: NotRequired[CustomFileHeaderMode]
    custom_formatters: NotRequired[list[str] | None]
    use_pendulum: NotRequired[bool]
    use_standard_primitive_types: NotRequired[bool]
    use_object_type: NotRequired[bool]
    http_query_parameters: NotRequired[Sequence[tuple[str, str]] | None]
    treat_dot_as_module: NotRequired[bool | None]
    strict_dotted_module_names: NotRequired[bool]
    rename_submodules_hidden_by_classes: NotRequired[bool]
    use_exact_imports: NotRequired[bool]
    use_type_checking_imports: NotRequired[bool | None]
    union_mode: NotRequired[UnionMode | None]
    output_datetime_class: NotRequired[DatetimeClassType | None]
    output_date_class: NotRequired[DateClassType | None]
    keyword_only: NotRequired[bool]
    frozen_dataclasses: NotRequired[bool]
    no_alias: NotRequired[bool]
    use_serialization_alias: NotRequired[bool]
    use_frozen_field: NotRequired[bool]
    use_default_factory_for_optional_nested_models: NotRequired[bool]
    formatters: NotRequired[list[Formatter] | None]
    builtin_format_line_length: NotRequired[int | None]
    parent_scoped_naming: NotRequired[bool]
    naming_strategy: NotRequired[NamingStrategy | None]
    duplicate_name_suffix: NotRequired[dict[str, str] | None]
    use_duplicate_name_suffix_for_every_collision: NotRequired[bool]
    dataclass_arguments: NotRequired[DataclassArguments | None]
    keep_false_dataclass_arguments: NotRequired[bool]
    disable_future_imports: NotRequired[bool]
    import_overrides: NotRequired[dict[str, str] | None]
    type_mappings: NotRequired[list[str] | None]
    type_overrides: NotRequired[dict[str, str] | None]
    type_overrides_replace_whole_type: NotRequired[bool]
    use_x_python_type_as_written: NotRequired[bool]
    use_bytes_for_content_media_type: NotRequired[bool]
    use_bounds_for_float_const: NotRequired[bool]
    read_only_write_only_model_type: NotRequired[ReadOnlyWriteOnlyModelType | None]
    dedupe_request_response_variants: NotRequired[bool]
    dedupe_numbered_request_response_variants: NotRequired[bool]
    use_status_code_in_response_name: NotRequired[bool]
    keep_first_character_of_path_keys: NotRequired[bool]
    keep_content_parameter_refs: NotRequired[bool]
    skip_path_extension_keys: NotRequired[bool]
    use_enum_field_as_literal_in_operations: NotRequired[bool]
    name_converted_payloads_by_message: NotRequired[bool]
    merge_message_trait_headers: NotRequired[bool]
    all_exports_scope: NotRequired[AllExportsScope | None]
    all_exports_collision_strategy: NotRequired[AllExportsCollisionStrategy | None]
    field_type_collision_strategy: NotRequired[FieldTypeCollisionStrategy | None]
    module_split_mode: NotRequired[ModuleSplitMode | None]
    schema_version: NotRequired[str | None]
    schema_version_mode: NotRequired[VersionMode | None]
    external_ref_mapping: NotRequired[dict[str, str] | None]
    generate_server: NotRequired[ServerType | None]
    server_output: NotRequired[str | None]
    server_package: NotRequired[str | None]
    server_model_package: NotRequired[str | None]
    server_layout: NotRequired[ServerLayout | None]
    server_handler_mode: NotRequired[ServerHandlerModeModel | None]
    server_handler_modes: NotRequired[Mapping[str, ServerHandlerMode] | None]
    server_include_request: NotRequired[bool | None]
    server_body_mode: NotRequired[ServerBodyModeModel | None]
    server_body_modes: NotRequired[Mapping[str, ServerBodyMode] | None]
    server_primary_responses: NotRequired[Mapping[str, Any] | None]
    server_operation_names: NotRequired[Mapping[str, str] | None]
    server_router_names: NotRequired[Mapping[str, str] | None]
    server_parameter_names: NotRequired[Mapping[str, Mapping[str, str]] | None]
    generate_client: NotRequired[ClientType | None]
    client_output: NotRequired[str | None]
    client_package: NotRequired[str | None]
    client_model_package: NotRequired[str | None]
    client_signature_style: NotRequired[ClientSignatureStyle | None]
    client_body_arguments: NotRequired[ClientBodyArguments | None]
    client_resource_names: NotRequired[Mapping[str, str] | None]
    client_operations: NotRequired[Mapping[str, Mapping[str, Any]] | None]
    client_default_base_url: NotRequired[str | None]
    client_server_base_url: NotRequired[str | None]
    client_deep_object_brackets: NotRequired[bool | None]
    client_asyncapi_perspective: NotRequired[ClientAsyncAPIPerspective | None]
    client_protocols: NotRequired[Mapping[str, Any] | None]


class GenerateConfig(BaseGenerateConfig, closed=True):
    input_filename: NotRequired[str | None]
    extra_template_data: NotRequired[defaultdict[str, dict[str, Any]] | None]
    validators: NotRequired[Mapping[str, ModelValidators] | None]
    aliases: NotRequired[Mapping[str, str | list[str]] | None]
    serialization_aliases: NotRequired[Mapping[str, str] | None]
    command_line: NotRequired[str | None]
    apply_default_values_for_required_fields: NotRequired[bool]
    force_optional_for_required_fields: NotRequired[bool]
    strict_types: NotRequired[Sequence[StrictTypes] | None]
    custom_class_name_generator: NotRequired[Callable[[str], str] | None]
    openapi_scopes: NotRequired[list[OpenAPIScope] | None]
    graphql_scopes: NotRequired[list[GraphQLScope] | None]
    custom_formatters_kwargs: NotRequired[dict[str, Any] | None]
    settings_path: NotRequired[str | None]
    default_value_overrides: NotRequired[Mapping[str, Any] | None]


class ValidatorDefinition(TypedDict):
    field: NotRequired[str | None]
    fields: NotRequired[list[str] | None]
    function: str
    mode: NotRequired[ValidatorMode]


class ModelValidatorsModel(TypedDict):
    validators: list[ValidatorDefinition]
