# coding: utf-8
# Copyright (c) 2016, 2024, Oracle and/or its affiliates.  All rights reserved.
# This software is dual-licensed to you under the Universal Permissive License (UPL) 1.0 as shown at https://oss.oracle.com/licenses/upl or Apache License 2.0 as shown at http://www.apache.org/licenses/LICENSE-2.0. You may choose either license.

# NOTE: This class is auto generated by OracleSDKGenerator. DO NOT EDIT. API Version: 20210330


from oci.util import formatted_flat_dict, NONE_SENTINEL, value_allowed_none_or_none_sentinel  # noqa: F401
from oci.decorators import init_model_state_from_kwargs


@init_model_state_from_kwargs
class UpdateAndPropagateTagsDetails(object):
    """
    The information about monitored resource tags. Request will fail if at least one of
    freeformTags or definedTags are not specified.
    Provided tags will be added or updated in the existing list of tags for the affected resources.
    Resources to be updated are identified based on association types specified.
    If association types are not specified, then tags will be updated only for the current resource.
    """

    def __init__(self, **kwargs):
        """
        Initializes a new UpdateAndPropagateTagsDetails object with values from keyword arguments.
        The following keyword arguments are supported (corresponding to the getters/setters of this class):

        :param freeform_tags:
            The value to assign to the freeform_tags property of this UpdateAndPropagateTagsDetails.
        :type freeform_tags: dict(str, str)

        :param defined_tags:
            The value to assign to the defined_tags property of this UpdateAndPropagateTagsDetails.
        :type defined_tags: dict(str, dict(str, object))

        :param association_types:
            The value to assign to the association_types property of this UpdateAndPropagateTagsDetails.
        :type association_types: list[str]

        """
        self.swagger_types = {
            'freeform_tags': 'dict(str, str)',
            'defined_tags': 'dict(str, dict(str, object))',
            'association_types': 'list[str]'
        }

        self.attribute_map = {
            'freeform_tags': 'freeformTags',
            'defined_tags': 'definedTags',
            'association_types': 'associationTypes'
        }

        self._freeform_tags = None
        self._defined_tags = None
        self._association_types = None

    @property
    def freeform_tags(self):
        """
        Gets the freeform_tags of this UpdateAndPropagateTagsDetails.
        Simple key-value pair that is applied without any predefined name, type or scope. Exists for cross-compatibility only.
        Example: `{\"bar-key\": \"value\"}`


        :return: The freeform_tags of this UpdateAndPropagateTagsDetails.
        :rtype: dict(str, str)
        """
        return self._freeform_tags

    @freeform_tags.setter
    def freeform_tags(self, freeform_tags):
        """
        Sets the freeform_tags of this UpdateAndPropagateTagsDetails.
        Simple key-value pair that is applied without any predefined name, type or scope. Exists for cross-compatibility only.
        Example: `{\"bar-key\": \"value\"}`


        :param freeform_tags: The freeform_tags of this UpdateAndPropagateTagsDetails.
        :type: dict(str, str)
        """
        self._freeform_tags = freeform_tags

    @property
    def defined_tags(self):
        """
        Gets the defined_tags of this UpdateAndPropagateTagsDetails.
        Defined tags for this resource. Each key is predefined and scoped to a namespace.
        Example: `{\"foo-namespace\": {\"bar-key\": \"value\"}}`


        :return: The defined_tags of this UpdateAndPropagateTagsDetails.
        :rtype: dict(str, dict(str, object))
        """
        return self._defined_tags

    @defined_tags.setter
    def defined_tags(self, defined_tags):
        """
        Sets the defined_tags of this UpdateAndPropagateTagsDetails.
        Defined tags for this resource. Each key is predefined and scoped to a namespace.
        Example: `{\"foo-namespace\": {\"bar-key\": \"value\"}}`


        :param defined_tags: The defined_tags of this UpdateAndPropagateTagsDetails.
        :type: dict(str, dict(str, object))
        """
        self._defined_tags = defined_tags

    @property
    def association_types(self):
        """
        Gets the association_types of this UpdateAndPropagateTagsDetails.
        Association types that will be traversed recursively starting from the current resource,
        to identify resources for which the tags will be updated.
        If no association type is specified, only current resource will be updated.
        Default is empty list, which means no related resources will be updated.


        :return: The association_types of this UpdateAndPropagateTagsDetails.
        :rtype: list[str]
        """
        return self._association_types

    @association_types.setter
    def association_types(self, association_types):
        """
        Sets the association_types of this UpdateAndPropagateTagsDetails.
        Association types that will be traversed recursively starting from the current resource,
        to identify resources for which the tags will be updated.
        If no association type is specified, only current resource will be updated.
        Default is empty list, which means no related resources will be updated.


        :param association_types: The association_types of this UpdateAndPropagateTagsDetails.
        :type: list[str]
        """
        self._association_types = association_types

    def __repr__(self):
        return formatted_flat_dict(self)

    def __eq__(self, other):
        if other is None:
            return False

        return self.__dict__ == other.__dict__

    def __ne__(self, other):
        return not self == other
