from typing import Optional
from decimal import Decimal
from validator_collection import validators
from highcharts_core.utility_classes.markers import *
from highcharts_maps import errors
from highcharts_maps.metaclasses import HighchartsMeta
[docs]class FlowmapMarker(HighchartsMeta):
    """Configuration of the arrow to depict at the end of a 
    :class:`FlowmapSeries <highcharts_maps.options.series.flowmap.FlowmapSeries>`.
    """
    
    def __init__(self, **kwargs):
        self._enabled = None
        self._height = None
        self._marker_type = None
        self._width = None
        
        self.enabled = kwargs.get('enabled', None)
        self.height = kwargs.get('height', None)
        self.marker_type = kwargs.get('marker_type', None)
        self.width = kwargs.get('width', None)
    @property
    def enabled(self) -> Optional[bool]:
        """If ``True``, displays the marker on the associated series. Defaults to ``True``.
        :returns: Flag indicating whether the marker is enabled for the series.
        :rtype: :class:`bool <python:bool>` or :obj:`None <python:None>`
        """
        return self._enabled
    @enabled.setter
    def enabled(self, value):
        if value is None:
            self._enabled = None
        else:
            self._enabled = bool(value)
    @property
    def height(self) -> Optional[str | int | float | Decimal]:
        """The height of the marker, expressed either in pixels or as a percentage of the weight of the link. 
        Defaults to ``'40%'``.
        :rtype: numeric or :class:`str <python:str>` or :obj:`None <python:None>`
        """
        return self._height
    @height.setter
    def height(self, value):
        if value is None:
            self._height = None
        else:
            try:
                value = validators.string(value)
                if '%' not in value:
                    raise ValueError
            except (TypeError, ValueError):
                value = validators.numeric(value, minimum = 0)
            self._height = value
            
    @property
    def marker_type(self) -> Optional[str]:
        """The shape to use for the marker symbol. Accepts either ``'arrow'`` or ``'mushroom'``. Defaults to 
        ``'arrow'``.
        
        :rtype: :class:`str <python:str>` or :obj:`None <python:None>`
        """
        return self._marker_type
    
    @marker_type.setter
    def marker_type(self, value):
        if not value:
            self._marker_type = None
        else:
            value = validators.string(value)
            value = value.lower()
            if value not in ['arrow', 'mushroom']:
                raise errors.HighchartsValueError(f'marker_type expects either "arrow" or "mushroom", '
                                                  f' but received "{value}".')
            self._marker_type = value
                
    @property
    def width(self) -> Optional[str | int | float | Decimal]:
        """The width of the marker, expressed either in pixels or as a percentage of the weight of the link. 
        Defaults to ``'40%'``.
        :rtype: numeric or :class:`str <python:str>` or :obj:`None <python:None>`
        """
        return self._width
    @width.setter
    def width(self, value):
        if value is None:
            self._width = None
        else:
            try:
                value = validators.string(value)
                if '%' not in value:
                    raise ValueError
            except (TypeError, ValueError):
                value = validators.numeric(value, minimum = 0)
            self._width = value
    @classmethod
    def _get_kwargs_from_dict(cls, as_dict):
        kwargs = {
            'enabled': as_dict.get('enabled', None),
            'height': as_dict.get('height', None),
            'marker_type': as_dict.get('markerType', None),
            'width': as_dict.get('width', None)
        }
        return kwargs
    def _to_untrimmed_dict(self, in_cls = None) -> dict:
        untrimmed = {
            'enabled': self.enabled,
            'height': self.height,
            'markerType': self.marker_type,
            'width': self.width,
        }
        
        return untrimmed