# The Okta software accompanied by this notice is provided pursuant to the following terms:
# Copyright © 2025-Present, Okta, Inc.
# Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the
# License.
# You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0.
# Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS
# IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and limitations under the License.
# coding: utf-8

"""
Okta Admin Management

Allows customers to easily access the Okta Management APIs

The version of the OpenAPI document: 5.1.0
Contact: devex-public@okta.com
Generated by OpenAPI Generator (https://openapi-generator.tech)

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

from __future__ import annotations

import json
import pprint
import re  # noqa: F401
from datetime import datetime
from typing import Any, ClassVar, Dict, List, Union
from typing import Optional
from typing import TYPE_CHECKING

from pydantic import BaseModel, ConfigDict, Field, StrictStr, field_validator

from okta.models.application_accessibility import ApplicationAccessibility
from okta.models.application_embedded import ApplicationEmbedded
from okta.models.application_express_configuration import (
    ApplicationExpressConfiguration,
)
from okta.models.application_licensing import ApplicationLicensing
from okta.models.application_lifecycle_status import ApplicationLifecycleStatus
from okta.models.application_links import ApplicationLinks
from okta.models.application_sign_on_mode import ApplicationSignOnMode
from okta.models.application_universal_logout import ApplicationUniversalLogout
from okta.models.application_visibility import ApplicationVisibility

if TYPE_CHECKING:
    from okta.models.auto_login_application import AutoLoginApplication
    from okta.models.basic_auth_application import BasicAuthApplication
    from okta.models.bookmark_application import BookmarkApplication
    from okta.models.browser_plugin_application import BrowserPluginApplication
    from okta.models.open_id_connect_application import OpenIdConnectApplication
    from okta.models.saml11_application import Saml11Application
    from okta.models.saml_application import SamlApplication
    from okta.models.secure_password_store_application import (
        SecurePasswordStoreApplication,
    )
    from okta.models.ws_federation_application import WsFederationApplication
    from okta.models.active_directory_application import ActiveDirectoryApplication


class Application(BaseModel):
    """
    Application
    """  # noqa: E501

    accessibility: Optional[ApplicationAccessibility] = None
    created: Optional[datetime] = Field(
        default=None, description="Timestamp when the application object was created"
    )
    express_configuration: Optional[ApplicationExpressConfiguration] = Field(
        default=None, alias="expressConfiguration"
    )
    features: Optional[List[StrictStr]] = Field(
        default=None,
        description="Enabled app features > **Note:** See [Application Features]("
        "/openapi/okta-management/management/tag/ApplicationFeatures/) for app provisioning features. ",
    )
    id: Optional[StrictStr] = Field(
        default=None, description="Unique ID for the app instance"
    )
    label: StrictStr = Field(description="User-defined display name for app")
    last_updated: Optional[datetime] = Field(
        default=None,
        description="Timestamp when the application object was last updated",
        alias="lastUpdated",
    )
    licensing: Optional[ApplicationLicensing] = None
    orn: Optional[StrictStr] = Field(
        default=None,
        description="The Okta resource name (ORN) for the current app instance",
    )
    profile: Optional[Dict[str, Any]] = Field(
        default=None,
        description="Contains any valid JSON schema for specifying properties that can be referenced from a request (only "
        "available to OAuth 2.0 client apps). For example, add an app manager contact email address or define an "
        "allowlist of groups that you can then reference using the Okta Expression Language `getFilteredGroups` "
        "function.  > **Notes:** > * `profile` isn't encrypted, so don't store sensitive data in it. > * "
        "`profile` doesn't limit the level of nesting in the JSON schema you created, but there is a practical "
        "size limit. Okta recommends a JSON schema size of 1 MB or less for best performance.",
    )
    sign_on_mode: Optional[ApplicationSignOnMode] = Field(
        default=None, alias="signOnMode"
    )
    status: Optional[ApplicationLifecycleStatus] = None
    universal_logout: Optional[ApplicationUniversalLogout] = Field(
        default=None, alias="universalLogout"
    )
    visibility: Optional[ApplicationVisibility] = None
    embedded: Optional[ApplicationEmbedded] = Field(default=None, alias="_embedded")
    links: Optional[ApplicationLinks] = Field(default=None, alias="_links")
    __properties: ClassVar[List[str]] = [
        "accessibility",
        "created",
        "expressConfiguration",
        "features",
        "id",
        "label",
        "lastUpdated",
        "licensing",
        "orn",
        "profile",
        "signOnMode",
        "status",
        "universalLogout",
        "visibility",
        "_embedded",
        "_links",
    ]

    @field_validator("features")
    def features_validate_enum(cls, value):
        """Validates the enum"""
        if value is None:
            return value

        for i in value:
            if i not in set(
                [
                    "GROUP_PUSH",
                    "IMPORT_NEW_USERS",
                    "IMPORT_PROFILE_UPDATES",
                    "IMPORT_USER_SCHEMA",
                    "PROFILE_MASTERING",
                    "PUSH_NEW_USERS",
                    "PUSH_PASSWORD_UPDATES",
                    "PUSH_PROFILE_UPDATES",
                    "PUSH_USER_DEACTIVATION",
                    "REACTIVATE_USERS",
                    "OUTBOUND_DEL_AUTH",
                    "DESKTOP_SSO",
                    "FEDERATED_PROFILE",
                    "SUPPRESS_ACTIVATION_EMAIL",
                    "PUSH_PENDING_USERS",
                    "MFA",
                    "UPDATE_EXISTING_USERNAME",
                    "EXCLUDE_USERNAME_UPDATE_ON_PROFILE_PUSH",
                    "EXCHANGE_ACTIVE_SYNC",
                    "IMPORT_SYNC",
                    "IMPORT_SYNC_CONTACTS",
                    "DEVICE_COMPLIANCE",
                    "VPN_CONFIG",
                    "IMPORT_SCHEMA_ENUM_VALUES",
                    "SCIM_PROVISIONING",
                    "DEVICE_FILTER_IN_SIGN_ON_RULES",
                    "PROFILE_TEMPLATE_UPGRADE",
                    "DEFAULT_PUSH_STATUS_TO_PUSH",
                    "REAL_TIME_SYNC",
                    "SSO",
                    "AUTHN_CONTEXT",
                    "JIT_PROVISIONING",
                    "GROUP_SYNC",
                    "OPP_SCIM_INCREMENTAL_IMPORTS",
                    "IN_MEMORY_APP_USER",
                    "LOG_STREAMING",
                    "OAUTH_INTEGRATION",
                    "IDP",
                    "PUSH_NEW_USERS_WITHOUT_PASSWORD",
                    "SKYHOOK_SERVICE",
                    "ENTITLEMENT_MANAGEMENT",
                    "PUSH_NEW_USERS_WITH_HASHED_PASSWORD",
                ]
            ):
                raise ValueError(
                    "each list item must be one of ('GROUP_PUSH', 'IMPORT_NEW_USERS', 'IMPORT_PROFILE_UPDATES', "
                    "'IMPORT_USER_SCHEMA', 'PROFILE_MASTERING', 'PUSH_NEW_USERS', 'PUSH_PASSWORD_UPDATES', "
                    "'PUSH_PROFILE_UPDATES', 'PUSH_USER_DEACTIVATION', 'REACTIVATE_USERS', 'OUTBOUND_DEL_AUTH', "
                    "'DESKTOP_SSO', 'FEDERATED_PROFILE', 'SUPPRESS_ACTIVATION_EMAIL', 'PUSH_PENDING_USERS', 'MFA', "
                    "'UPDATE_EXISTING_USERNAME', 'EXCLUDE_USERNAME_UPDATE_ON_PROFILE_PUSH', 'EXCHANGE_ACTIVE_SYNC', "
                    "'IMPORT_SYNC', 'IMPORT_SYNC_CONTACTS', 'DEVICE_COMPLIANCE', 'VPN_CONFIG', 'IMPORT_SCHEMA_ENUM_VALUES', "
                    "'SCIM_PROVISIONING', 'DEVICE_FILTER_IN_SIGN_ON_RULES', 'PROFILE_TEMPLATE_UPGRADE', "
                    "'DEFAULT_PUSH_STATUS_TO_PUSH', 'REAL_TIME_SYNC', 'SSO', 'AUTHN_CONTEXT', 'JIT_PROVISIONING', "
                    "'GROUP_SYNC', 'OPP_SCIM_INCREMENTAL_IMPORTS', 'IN_MEMORY_APP_USER', 'LOG_STREAMING', "
                    "'OAUTH_INTEGRATION', 'IDP', 'PUSH_NEW_USERS_WITHOUT_PASSWORD', 'SKYHOOK_SERVICE', "
                    "'ENTITLEMENT_MANAGEMENT', 'PUSH_NEW_USERS_WITH_HASHED_PASSWORD')"
                )
        return value

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

    # JSON field name that stores the object type
    __discriminator_property_name: ClassVar[str] = "signOnMode"

    # discriminator mappings
    __discriminator_value_class_map: ClassVar[Dict[str, str]] = {
        "AUTO_LOGIN": "AutoLoginApplication",
        "BASIC_AUTH": "BasicAuthApplication",
        "BOOKMARK": "BookmarkApplication",
        "BROWSER_PLUGIN": "BrowserPluginApplication",
        "OPENID_CONNECT": "OpenIdConnectApplication",
        "SAML_1_1": "Saml11Application",
        "SAML_2_0": "SamlApplication",
        "SECURE_PASSWORD_STORE": "SecurePasswordStoreApplication",
        "WS_FEDERATION": "WsFederationApplication",
        "ActiveDirectoryApplication": "ActiveDirectoryApplication",
    }

    @classmethod
    def get_discriminator_value(cls, obj: Dict[str, Any]) -> Optional[str]:
        """Returns the discriminator value (object type) of the data"""
        discriminator_value = obj.get(cls.__discriminator_property_name)
        if discriminator_value:
            return cls.__discriminator_value_class_map.get(discriminator_value)
        else:
            return None

    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[
        Union[
            AutoLoginApplication,
            BasicAuthApplication,
            BookmarkApplication,
            BrowserPluginApplication,
            OpenIdConnectApplication,
            Saml11Application,
            SamlApplication,
            SecurePasswordStoreApplication,
            WsFederationApplication,
            ActiveDirectoryApplication,
        ]
    ]:
        """Create an instance of Application 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.
        """
        from okta.models.application_json_converter import ApplicationJsonConverter

        return ApplicationJsonConverter.to_dict(self)

    @classmethod
    def from_dict(cls, obj: Dict[str, Any]) -> Optional[
        Union[
            AutoLoginApplication,
            BasicAuthApplication,
            BookmarkApplication,
            BrowserPluginApplication,
            OpenIdConnectApplication,
            Saml11Application,
            SamlApplication,
            SecurePasswordStoreApplication,
            WsFederationApplication,
            ActiveDirectoryApplication,
        ]
    ]:
        """Create an instance of Application from a dict"""
        from okta.models.application_json_converter import ApplicationJsonConverter

        return ApplicationJsonConverter.from_dict(obj)
