from __future__ import annotations

from enum import Enum
from typing import List, Optional, Union

from pydantic import BaseModel, Field, RootModel


class Pet1(BaseModel):
    name: Optional[str] = None
    age: Optional[int] = None


class Pet(RootModel[Union[List[Pet1], Pet1]]):
    root: Union[List[Pet1], Pet1] = Field(..., title='Pet')


class CombinedEnum1(Enum):
    green = 'green'
    red = 'red'


class CombinedEnumField(Enum):
    green = 'green'
    red = 'red'


class CombinedObjectField1(BaseModel):
    color: Optional[str] = None


class CombinedSelf1(BaseModel):
    color: Optional[str] = None


class CombinedSelf(RootModel[Union[List[CombinedSelf1], CombinedSelf1]]):
    root: Union[List[CombinedSelf1], CombinedSelf1]


class CombinedSelfEnum1(BaseModel):
    color: Optional[str] = None


class CombinedSelfEnum2(Enum):
    green = 'green'
    red = 'red'


class CombinedSelfEnum(
    RootModel[Union[List[Union[CombinedSelfEnum1, CombinedSelfEnum2]], CombinedSelfEnum1, CombinedSelfEnum2]]
):
    root: Union[List[Union[CombinedSelfEnum1, CombinedSelfEnum2]], CombinedSelfEnum1, CombinedSelfEnum2]


class CombinedSelfAllOf2(Enum):
    green = 'green'
    red = 'red'


class Kind(BaseModel):
    description: Optional[str] = None


class Id(BaseModel):
    id: Optional[int] = None


class CustomRootModel(RootModel[str]):
    root: str


class CombinedEnum(RootModel[Union[List[Kind], CombinedEnum1]]):
    root: Union[List[Kind], CombinedEnum1]


class CombinedAllOf1(Kind, Id):
    pass


class CombinedAllOf(RootModel[Union[List[Kind], CombinedAllOf1]]):
    root: Union[List[Kind], CombinedAllOf1]


class CombinedAllOfField(Kind, Id):
    pass


class CombinedAllOfObjectField(Kind, Id):
    color: Optional[str] = None


class CombinedObjectField(BaseModel):
    CombinedEnumField_1: Optional[Union[List[Kind], CombinedEnumField]] = Field(None, alias='CombinedEnumField')
    CombinedAllOfField_1: Optional[Union[List[Kind], CombinedAllOfField]] = Field(None, alias='CombinedAllOfField')
    CombinedObjectField: Optional[Union[List[Kind], CombinedObjectField1]] = None
    CombinedAllOfObjectField_1: Optional[Union[List[Kind], CombinedAllOfObjectField]] = Field(
        None, alias='CombinedAllOfObjectField'
    )


class CombinedSelfAllOf1(Kind, Id):
    color: Optional[str] = None


class CombinedSelfAllOf(
    RootModel[Union[List[Union[CombinedSelfAllOf1, CombinedSelfAllOf2]], CombinedSelfAllOf1, CombinedSelfAllOf2]]
):
    root: Union[List[Union[CombinedSelfAllOf1, CombinedSelfAllOf2]], CombinedSelfAllOf1, CombinedSelfAllOf2]
