# coding: utf-8

"""
    Test Results API

    Get test result metrics for Cloud and Enterprise Agent tests.

    The version of the OpenAPI document: 7.0.0
    Generated by OpenAPI Generator (https://openapi-generator.tech)

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


from __future__ import annotations
import pprint
import re  # noqa: F401
import json

from datetime import datetime
from typing import Any, ClassVar, Dict, List, Optional, Union
from pydantic import BaseModel, StrictFloat, StrictInt, StrictStr
from pydantic import Field
from test_results_api.models.agent import Agent
from test_results_api.models.test_direction import TestDirection
try:
    from typing import Self
except ImportError:
    from typing_extensions import Self

class NetworkTestResult(BaseModel):
    """
    NetworkTestResult
    """ # noqa: E501
    var_date: Optional[datetime] = Field(default=None, description="Data point date in UTC (ISO date-time format).", alias="date")
    round_id: Optional[StrictInt] = Field(default=None, description="Epoch time (seconds) indicating the start time of the round", alias="roundId")
    links: Optional[Union[str, Any]] = Field(default=None, alias="_links")
    start_time: Optional[StrictInt] = Field(default=None, description="Epoch time (seconds) indicating the start time of the round", alias="startTime")
    end_time: Optional[StrictInt] = Field(default=None, description="Epoch time (seconds) indicating the end time of the round", alias="endTime")
    available_bandwidth: Optional[Union[StrictFloat, StrictInt]] = Field(default=None, alias="availableBandwidth")
    avg_latency: Optional[Union[StrictFloat, StrictInt]] = Field(default=None, description="Average RTT for packets sent to destination", alias="avgLatency")
    bandwidth: Optional[Union[StrictFloat, StrictInt]] = None
    capacity: Optional[Union[StrictFloat, StrictInt]] = None
    jitter: Optional[Union[StrictFloat, StrictInt]] = Field(default=None, description="Standard deviation of latency")
    loss: Optional[Union[StrictFloat, StrictInt]] = Field(default=None, description="Percentage of packets not reaching destination")
    max_latency: Optional[Union[StrictFloat, StrictInt]] = Field(default=None, description="Maximum RTT for packets sent to destination", alias="maxLatency")
    min_latency: Optional[Union[StrictFloat, StrictInt]] = Field(default=None, description="Minimum RTT for packets sent to destination", alias="minLatency")
    agent: Optional[Agent] = None
    server_ip: Optional[StrictStr] = Field(default=None, description="IP of target server", alias="serverIp")
    server: Optional[StrictStr] = Field(default=None, description="Target server, including port (if method used is TCP)")
    direction: Optional[TestDirection] = None
    __properties: ClassVar[List[str]] = ["date", "roundId", "_links", "startTime", "endTime", "availableBandwidth", "avgLatency", "bandwidth", "capacity", "jitter", "loss", "maxLatency", "minLatency", "agent", "serverIp", "server", "direction"]

    model_config = {
        "populate_by_name": True,
        "validate_assignment": True
    }


    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) -> Self:
        """Create an instance of NetworkTestResult 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.
        * OpenAPI `readOnly` fields are excluded.
        * OpenAPI `readOnly` fields are excluded.
        * OpenAPI `readOnly` fields are excluded.
        * OpenAPI `readOnly` fields are excluded.
        * OpenAPI `readOnly` fields are excluded.
        * OpenAPI `readOnly` fields are excluded.
        * OpenAPI `readOnly` fields are excluded.
        * OpenAPI `readOnly` fields are excluded.
        * OpenAPI `readOnly` fields are excluded.
        * OpenAPI `readOnly` fields are excluded.
        * OpenAPI `readOnly` fields are excluded.
        * OpenAPI `readOnly` fields are excluded.
        * OpenAPI `readOnly` fields are excluded.
        * OpenAPI `readOnly` fields are excluded.
        """
        _dict = self.model_dump(
            by_alias=True,
            exclude={
                "var_date",
                "round_id",
                "start_time",
                "end_time",
                "available_bandwidth",
                "avg_latency",
                "bandwidth",
                "capacity",
                "jitter",
                "loss",
                "max_latency",
                "min_latency",
                "server_ip",
                "server",
            },
            exclude_none=True,
        )
        # override the default output from pydantic by calling `to_dict()` of agent
        if self.agent:
            _dict['agent'] = self.agent.to_dict()
        return _dict

    @classmethod
    def from_dict(cls, obj: Dict) -> Self:
        """Create an instance of NetworkTestResult from a dict"""
        if obj is None:
            return None

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

        _obj = cls.model_validate({
            "date": obj.get("date"),
            "roundId": obj.get("roundId"),
            "_links": obj.get("_links"),
            "startTime": obj.get("startTime"),
            "endTime": obj.get("endTime"),
            "availableBandwidth": obj.get("availableBandwidth"),
            "avgLatency": obj.get("avgLatency"),
            "bandwidth": obj.get("bandwidth"),
            "capacity": obj.get("capacity"),
            "jitter": obj.get("jitter"),
            "loss": obj.get("loss"),
            "maxLatency": obj.get("maxLatency"),
            "minLatency": obj.get("minLatency"),
            "agent": Agent.from_dict(obj.get("agent")) if obj.get("agent") is not None else None,
            "serverIp": obj.get("serverIp"),
            "server": obj.get("server"),
            "direction": obj.get("direction")
        })
        return _obj


