# coding: utf-8

"""
    Endpoint Agents API

    Manage ThousandEyes Endpoint Agents using this API.

    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 typing import Any, ClassVar, Dict, List, Optional
from pydantic import BaseModel, StrictStr
from pydantic import Field
from agents_api.models.platform import Platform
try:
    from typing import Self
except ImportError:
    from typing_extensions import Self

class AgentSearchRequestSearchFilters(BaseModel):
    """
    AgentSearchRequestSearchFilters
    """ # noqa: E501
    agent_name: Optional[List[StrictStr]] = Field(default=None, description="Returns only agents with the given name.  This is an exact match only. ", alias="agentName")
    computer_name: Optional[List[StrictStr]] = Field(default=None, description="Returns only agents with the given computer name. This is an exact match only. ", alias="computerName")
    username: Optional[List[StrictStr]] = Field(default=None, description="Returns only agents that have at least one user with a name. starting with the provided string. This is a case-insensitive prefix match. ")
    platform: Optional[List[Platform]] = Field(default=None, description="Filter on the platform on which the agent is running. ")
    os_version: Optional[List[StrictStr]] = Field(default=None, description="Case-insensitive prefix filter on the OS version.", alias="osVersion")
    location_country_iso: Optional[List[StrictStr]] = Field(default=None, description="Filter using the ISO country code of the location. ", alias="locationCountryISO")
    location_subdivision1_code: Optional[List[StrictStr]] = Field(default=None, description="Filter using the code for the first level administrative division within  the country. In US/Canada this is the State, in UK it's the country e.g. `ENG` ", alias="locationSubdivision1Code")
    location_city: Optional[List[StrictStr]] = Field(default=None, description="This is a prefix match on the city name field. The endpoint expects this to contain the  name of the city in English. e.g. 'Paris' or '' ", alias="locationCity")
    __properties: ClassVar[List[str]] = ["agentName", "computerName", "username", "platform", "osVersion", "locationCountryISO", "locationSubdivision1Code", "locationCity"]

    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 AgentSearchRequestSearchFilters 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.
        """
        _dict = self.model_dump(
            by_alias=True,
            exclude={
            },
            exclude_none=True,
        )
        return _dict

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

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

        _obj = cls.model_validate({
            "agentName": obj.get("agentName"),
            "computerName": obj.get("computerName"),
            "username": obj.get("username"),
            "platform": obj.get("platform"),
            "osVersion": obj.get("osVersion"),
            "locationCountryISO": obj.get("locationCountryISO"),
            "locationSubdivision1Code": obj.get("locationSubdivision1Code"),
            "locationCity": obj.get("locationCity")
        })
        return _obj


