from plotly.basedatatypes import BaseTraceHierarchyType
import copy


class Cumulative(BaseTraceHierarchyType):

    # currentbin
    # ----------
    @property
    def currentbin(self):
        """
        Only applies if cumulative is enabled. Sets whether the current
        bin is included, excluded, or has half of its value included in
        the current cumulative value. "include" is the default for
        compatibility with various other tools, however it introduces a
        half-bin bias to the results. "exclude" makes the opposite
        half-bin bias, and "half" removes it.
    
        The 'currentbin' property is an enumeration that may be specified as:
          - One of the following enumeration values:
                ['include', 'exclude', 'half']

        Returns
        -------
        Any
        """
        return self['currentbin']

    @currentbin.setter
    def currentbin(self, val):
        self['currentbin'] = val

    # direction
    # ---------
    @property
    def direction(self):
        """
        Only applies if cumulative is enabled. If "increasing"
        (default) we sum all prior bins, so the result increases from
        left to right. If "decreasing" we sum later bins so the result
        decreases from left to right.
    
        The 'direction' property is an enumeration that may be specified as:
          - One of the following enumeration values:
                ['increasing', 'decreasing']

        Returns
        -------
        Any
        """
        return self['direction']

    @direction.setter
    def direction(self, val):
        self['direction'] = val

    # enabled
    # -------
    @property
    def enabled(self):
        """
        If true, display the cumulative distribution by summing the
        binned values. Use the `direction` and `centralbin` attributes
        to tune the accumulation method. Note: in this mode, the
        "density" `histnorm` settings behave the same as their
        equivalents without "density": ** and "density" both rise to
        the number of data points, and "probability" and *probability
        density* both rise to the number of sample points.
    
        The 'enabled' property must be specified as a bool
        (either True, or False)

        Returns
        -------
        bool
        """
        return self['enabled']

    @enabled.setter
    def enabled(self, val):
        self['enabled'] = val

    # property parent name
    # --------------------
    @property
    def _parent_path_str(self):
        return 'histogram'

    # Self properties description
    # ---------------------------
    @property
    def _prop_descriptions(self):
        return """\
        currentbin
            Only applies if cumulative is enabled. Sets whether the
            current bin is included, excluded, or has half of its
            value included in the current cumulative value.
            "include" is the default for compatibility with various
            other tools, however it introduces a half-bin bias to
            the results. "exclude" makes the opposite half-bin
            bias, and "half" removes it.
        direction
            Only applies if cumulative is enabled. If "increasing"
            (default) we sum all prior bins, so the result
            increases from left to right. If "decreasing" we sum
            later bins so the result decreases from left to right.
        enabled
            If true, display the cumulative distribution by summing
            the binned values. Use the `direction` and `centralbin`
            attributes to tune the accumulation method. Note: in
            this mode, the "density" `histnorm` settings behave the
            same as their equivalents without "density": ** and
            "density" both rise to the number of data points, and
            "probability" and *probability density* both rise to
            the number of sample points.
        """

    def __init__(
        self,
        arg=None,
        currentbin=None,
        direction=None,
        enabled=None,
        **kwargs
    ):
        """
        Construct a new Cumulative object
        
        Parameters
        ----------
        arg
            dict of properties compatible with this constructor or
            an instance of plotly.graph_objs.histogram.Cumulative
        currentbin
            Only applies if cumulative is enabled. Sets whether the
            current bin is included, excluded, or has half of its
            value included in the current cumulative value.
            "include" is the default for compatibility with various
            other tools, however it introduces a half-bin bias to
            the results. "exclude" makes the opposite half-bin
            bias, and "half" removes it.
        direction
            Only applies if cumulative is enabled. If "increasing"
            (default) we sum all prior bins, so the result
            increases from left to right. If "decreasing" we sum
            later bins so the result decreases from left to right.
        enabled
            If true, display the cumulative distribution by summing
            the binned values. Use the `direction` and `centralbin`
            attributes to tune the accumulation method. Note: in
            this mode, the "density" `histnorm` settings behave the
            same as their equivalents without "density": ** and
            "density" both rise to the number of data points, and
            "probability" and *probability density* both rise to
            the number of sample points.

        Returns
        -------
        Cumulative
        """
        super(Cumulative, self).__init__('cumulative')

        # Validate arg
        # ------------
        if arg is None:
            arg = {}
        elif isinstance(arg, self.__class__):
            arg = arg.to_plotly_json()
        elif isinstance(arg, dict):
            arg = copy.copy(arg)
        else:
            raise ValueError(
                """\
The first argument to the plotly.graph_objs.histogram.Cumulative 
constructor must be a dict or 
an instance of plotly.graph_objs.histogram.Cumulative"""
            )

        # Handle skip_invalid
        # -------------------
        self._skip_invalid = kwargs.pop('skip_invalid', False)

        # Import validators
        # -----------------
        from plotly.validators.histogram import (cumulative as v_cumulative)

        # Initialize validators
        # ---------------------
        self._validators['currentbin'] = v_cumulative.CurrentbinValidator()
        self._validators['direction'] = v_cumulative.DirectionValidator()
        self._validators['enabled'] = v_cumulative.EnabledValidator()

        # Populate data dict with properties
        # ----------------------------------
        _v = arg.pop('currentbin', None)
        self['currentbin'] = currentbin if currentbin is not None else _v
        _v = arg.pop('direction', None)
        self['direction'] = direction if direction is not None else _v
        _v = arg.pop('enabled', None)
        self['enabled'] = enabled if enabled is not None else _v

        # Process unknown kwargs
        # ----------------------
        self._process_kwargs(**dict(arg, **kwargs))

        # Reset skip_invalid
        # ------------------
        self._skip_invalid = False
