# coding: utf-8

"""
    Kestra EE

    All API operations, except for Superadmin-only endpoints, require a tenant identifier in the HTTP path.<br/> Endpoints designated as Superadmin-only are not tenant-scoped.

    Generated by OpenAPI Generator (https://openapi-generator.tech)

    Do not edit the class manually.
"""  # noqa: E501


from __future__ import annotations
import pprint
import regex as re
import json

from pydantic import BaseModel, ConfigDict, Field, StrictBool, StrictInt, StrictStr
from typing import Any, ClassVar, Dict, List, Optional
from kestrapy.models.concurrency import Concurrency
from kestrapy.models.input_object import InputObject
from kestrapy.models.label import Label
from kestrapy.models.output import Output
from kestrapy.models.sla import SLA
from kestrapy.models.worker_group import WorkerGroup
from typing import Optional, Set
from typing_extensions import Self

class FlowInterface(BaseModel):
    """
    FlowInterface
    """ # noqa: E501
    id: Optional[StrictStr] = None
    namespace: Optional[StrictStr] = None
    revision: Optional[StrictInt] = None
    tenant_id: Optional[StrictStr] = Field(default=None, alias="tenantId")
    deleted: Optional[StrictBool] = None
    description: Optional[StrictStr] = None
    disabled: Optional[StrictBool] = None
    labels: Optional[List[Label]] = None
    inputs: Optional[List[InputObject]] = None
    outputs: Optional[List[Output]] = None
    variables: Optional[Dict[str, Dict[str, Any]]] = None
    worker_group: Optional[WorkerGroup] = Field(default=None, alias="workerGroup")
    concurrency: Optional[Concurrency] = None
    sla: Optional[List[SLA]] = None
    source: Optional[StrictStr] = None
    additional_properties: Dict[str, Any] = {}
    __properties: ClassVar[List[str]] = ["id", "namespace", "revision", "tenantId", "deleted", "description", "disabled", "labels", "inputs", "outputs", "variables", "workerGroup", "concurrency", "sla", "source"]

    model_config = ConfigDict(
        populate_by_name=True,
        validate_assignment=True,
        protected_namespaces=(),
    )


    def to_str(self) -> str:
        """Returns the string representation of the model using alias"""
        return pprint.pformat(self.model_dump(by_alias=True))

    def to_json(self) -> str:
        """Returns the JSON representation of the model using alias"""
        # TODO: pydantic v2: use .model_dump_json(by_alias=True, exclude_unset=True) instead
        return json.dumps(self.to_dict())

    @classmethod
    def from_json(cls, json_str: str) -> Optional[Self]:
        """Create an instance of FlowInterface from a JSON string"""
        return cls.from_dict(json.loads(json_str))

    def to_dict(self) -> Dict[str, Any]:
        """Return the dictionary representation of the model using alias.

        This has the following differences from calling pydantic's
        `self.model_dump(by_alias=True)`:

        * `None` is only added to the output dict for nullable fields that
          were set at model initialization. Other fields with value `None`
          are ignored.
        * Fields in `self.additional_properties` are added to the output dict.
        """
        excluded_fields: Set[str] = set([
            "additional_properties",
        ])

        _dict = self.model_dump(
            by_alias=True,
            exclude=excluded_fields,
            exclude_none=True,
        )
        # override the default output from pydantic by calling `to_dict()` of each item in labels (list)
        _items = []
        if self.labels:
            for _item_labels in self.labels:
                if _item_labels:
                    _items.append(_item_labels.to_dict())
            _dict['labels'] = _items
        # override the default output from pydantic by calling `to_dict()` of each item in inputs (list)
        _items = []
        if self.inputs:
            for _item_inputs in self.inputs:
                if _item_inputs:
                    _items.append(_item_inputs.to_dict())
            _dict['inputs'] = _items
        # override the default output from pydantic by calling `to_dict()` of each item in outputs (list)
        _items = []
        if self.outputs:
            for _item_outputs in self.outputs:
                if _item_outputs:
                    _items.append(_item_outputs.to_dict())
            _dict['outputs'] = _items
        # override the default output from pydantic by calling `to_dict()` of worker_group
        if self.worker_group:
            _dict['workerGroup'] = self.worker_group.to_dict()
        # override the default output from pydantic by calling `to_dict()` of concurrency
        if self.concurrency:
            _dict['concurrency'] = self.concurrency.to_dict()
        # override the default output from pydantic by calling `to_dict()` of each item in sla (list)
        _items = []
        if self.sla:
            for _item_sla in self.sla:
                if _item_sla:
                    _items.append(_item_sla.to_dict())
            _dict['sla'] = _items
        # puts key-value pairs in additional_properties in the top level
        if self.additional_properties is not None:
            for _key, _value in self.additional_properties.items():
                _dict[_key] = _value

        return _dict

    @classmethod
    def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]:
        """Create an instance of FlowInterface from a dict"""
        if obj is None:
            return None

        if not isinstance(obj, dict):
            return cls.model_validate(obj)

        _obj = cls.model_validate({
            "id": obj.get("id"),
            "namespace": obj.get("namespace"),
            "revision": obj.get("revision"),
            "tenantId": obj.get("tenantId"),
            "deleted": obj.get("deleted"),
            "description": obj.get("description"),
            "disabled": obj.get("disabled"),
            "labels": [Label.from_dict(_item) for _item in obj["labels"]] if obj.get("labels") is not None else None,
            "inputs": [InputObject.from_dict(_item) for _item in obj["inputs"]] if obj.get("inputs") is not None else None,
            "outputs": [Output.from_dict(_item) for _item in obj["outputs"]] if obj.get("outputs") is not None else None,
            "variables": obj.get("variables"),
            "workerGroup": WorkerGroup.from_dict(obj["workerGroup"]) if obj.get("workerGroup") is not None else None,
            "concurrency": Concurrency.from_dict(obj["concurrency"]) if obj.get("concurrency") is not None else None,
            "sla": [SLA.from_dict(_item) for _item in obj["sla"]] if obj.get("sla") is not None else None,
            "source": obj.get("source")
        })
        # store additional fields in additional_properties
        for _key in obj.keys():
            if _key not in cls.__properties:
                _obj.additional_properties[_key] = obj.get(_key)

        return _obj


