# generated by datamodel-codegen:
#   filename:  <stdin>
#   timestamp: 2023-02-17T08:35:33+00:00

from __future__ import annotations

import uuid
import datetime
from enum import Enum
from typing import Any, Literal

from pydantic import BaseModel, Extra, Field, conint, constr


class Status(Enum):
    running = 'running'
    stopped = 'stopped'


class Operation(Enum):
    async_ = 'async'
    sync = 'sync'
    intersect = 'intersect'


class Method(Enum):
    POST = 'POST'
    GET = 'GET'
    DELETE = 'DELETE'
    PUT = 'PUT'
    HEAD = 'HEAD'
    PATCH = 'PATCH'


class InputItem(BaseModel):
    class Config:
        extra = Extra.forbid

    method: Method
    url: str
    query: list[str] | None = None
    body: Any | None = None


class OutputItem(BaseModel):
    class Config:
        extra = Extra.forbid

    code: int | None = None
    body: Any | None = None
    headers: Any | None = None
    timestamp: datetime.datetime | None = None


class Action(Enum):
    stop = 'stop'
    restart = 'restart'


class Assigned(Enum):
    unassigned = 'unassigned'
    admin = 'admin'




class WarningItem(BaseModel):
    message: str | None = None
    data: dict[str, Any] | None = None
    code: int | None = None


class Meta(BaseModel):
    class Config:
        extra = Extra.forbid

    id: uuid.UUID | None = None
    type: str | None = None
    version: constr(regex=r'(\d+)\.(\d+)') | None = None
    manufacturer: uuid.UUID | Assigned | None = None
    owner: uuid.UUID | Assigned | None = None
    created: datetime.datetime | Literal['not_available'] | None = None
    updated: datetime.datetime | Literal['not_available'] | None = None
    changed: datetime.datetime | Literal['not_available'] | None = None
    application: uuid.UUID | None = None
    revision: int | None = None
    trace: str | None = None
    oem: str | None = None
    deprecated: bool | None = None
    redirect: constr(regex=r'^[0-9a-zA-Z_-]+$', min_length=1, max_length=200) | None = None
    size: int | None = None
    path: str | None = None
    parent: uuid.UUID | None = None
    error: dict[str, Any] | None = None
    icon: str | None = None
    tag: list[constr(min_length=2, max_length=20)] | None = None
    tag_by_user: list[constr(min_length=2, max_length=20)] | None = None
    name_by_user: constr(max_length=100) | None = None
    warning: list[WarningItem] | None = None
    parent_name: dict[str, Any] | None = None
    read_only: bool | None = None
    original_id: uuid.UUID | None = None
    alert: list[uuid.UUID] | None = None
    contract: list[uuid.UUID] | None = None


class Repeat(BaseModel):
    class Config:
        extra = Extra.forbid

    name: str | None = None
    interval: conint(ge=0)
    tentative: conint(ge=1, le=1000)
    last_call: datetime.datetime | None = None
    success: int
    failed: int
    status: Status
    operation: Operation
    input: list[InputItem]
    output: list[OutputItem] | None = None
    action: Action | None = None
    meta: Meta = Field(..., title='meta-2.1')
