# generated by datamodel-codegen:
#   filename:  interface_mro.graphql
#   timestamp: 2019-07-26T00:00:00+00:00

from __future__ import annotations

from typing import Annotated, Literal

from pydantic import BaseModel, Field
from typing_extensions import TypeAliasType

Boolean = TypeAliasType("Boolean", bool)
"""
The `Boolean` scalar type represents `true` or `false`.
"""


ID = TypeAliasType("ID", str)
"""
The `ID` scalar type represents a unique identifier, often used to refetch an object or as key for a cache. The ID type appears in a JSON response as a String; however, it is not intended to be human-readable. When expected as an input type, any string (such as `"4"`) or integer (such as `4`) input value will be accepted as an ID.
"""


String = TypeAliasType("String", str)
"""
The `String` scalar type represents textual data, represented as UTF-8 character sequences. The String type is most often used by GraphQL to represent free-form human-readable text.
"""


class BaseInterface(BaseModel):
    base_field: Annotated[String | None, Field(alias='baseField')] = None
    typename__: Annotated[
        Literal['BaseInterface'] | None, Field(alias='__typename')
    ] = 'BaseInterface'


class Entity(BaseModel):
    id: ID
    typename__: Annotated[Literal['Entity'] | None, Field(alias='__typename')] = (
        'Entity'
    )


class GrandParent(BaseModel):
    grand_field: Annotated[String | None, Field(alias='grandField')] = None
    typename__: Annotated[Literal['GrandParent'] | None, Field(alias='__typename')] = (
        'GrandParent'
    )


class LeftBranch(BaseInterface):
    base_field: Annotated[String | None, Field(alias='baseField')] = None
    left_field: Annotated[String | None, Field(alias='leftField')] = None
    typename__: Annotated[Literal['LeftBranch'] | None, Field(alias='__typename')] = (
        'LeftBranch'
    )


class Node(BaseModel):
    id: ID
    typename__: Annotated[Literal['Node'] | None, Field(alias='__typename')] = 'Node'


class Notification(Node):
    id: ID
    read_at: Annotated[String | None, Field(alias='readAt')] = None
    typename__: Annotated[Literal['Notification'] | None, Field(alias='__typename')] = (
        'Notification'
    )


class Parent(GrandParent):
    grand_field: Annotated[String | None, Field(alias='grandField')] = None
    parent_field: Annotated[String | None, Field(alias='parentField')] = None
    typename__: Annotated[Literal['Parent'] | None, Field(alias='__typename')] = (
        'Parent'
    )


class RightBranch(BaseInterface):
    base_field: Annotated[String | None, Field(alias='baseField')] = None
    right_field: Annotated[String | None, Field(alias='rightField')] = None
    typename__: Annotated[Literal['RightBranch'] | None, Field(alias='__typename')] = (
        'RightBranch'
    )


class CustomerNeedNotification(Entity, Notification, Node):
    customer: String | None = None
    id: ID
    read_at: Annotated[String | None, Field(alias='readAt')] = None
    typename__: Annotated[
        Literal['CustomerNeedNotification'] | None, Field(alias='__typename')
    ] = 'CustomerNeedNotification'


class DiamondType(LeftBranch, RightBranch, BaseInterface):
    base_field: Annotated[String | None, Field(alias='baseField')] = None
    diamond_field: Annotated[String | None, Field(alias='diamondField')] = None
    left_field: Annotated[String | None, Field(alias='leftField')] = None
    right_field: Annotated[String | None, Field(alias='rightField')] = None
    typename__: Annotated[Literal['DiamondType'] | None, Field(alias='__typename')] = (
        'DiamondType'
    )


class Child(Parent, GrandParent):
    child_field: Annotated[String | None, Field(alias='childField')] = None
    grand_field: Annotated[String | None, Field(alias='grandField')] = None
    parent_field: Annotated[String | None, Field(alias='parentField')] = None
    typename__: Annotated[Literal['Child'] | None, Field(alias='__typename')] = 'Child'


class LeafType(Child, Parent, GrandParent):
    child_field: Annotated[String | None, Field(alias='childField')] = None
    grand_field: Annotated[String | None, Field(alias='grandField')] = None
    leaf_field: Annotated[String | None, Field(alias='leafField')] = None
    parent_field: Annotated[String | None, Field(alias='parentField')] = None
    typename__: Annotated[Literal['LeafType'] | None, Field(alias='__typename')] = (
        'LeafType'
    )
