"""
HoloViews plotting sub-system the defines the interface to be used by
any third-party plotting/rendering package.

This file defines the HTML tags used to wrap rendered output for
display in the IPython Notebook (optional).
"""
from __future__ import absolute_import

from ..core.options import Cycle, Compositor
from ..element import Area, Image, QuadMesh, Polygons, Raster
from ..element.sankey import _layout_sankey, Sankey
from .plot import Plot
from .renderer import Renderer, HTML_TAGS # noqa (API import)
from .util import apply_nodata, list_cmaps # noqa (API import)
from ..operation.stats import univariate_kde, bivariate_kde

Compositor.register(Compositor("Image", apply_nodata, None,
                               'data', transfer_options=True,
                               transfer_parameters=True,
                               output_type=Image,
                               backends=['bokeh', 'matplotlib', 'plotly']))
Compositor.register(Compositor("Raster", apply_nodata, None,
                               'data', transfer_options=True,
                               transfer_parameters=True,
                               output_type=Raster,
                               backends=['bokeh', 'matplotlib', 'plotly']))
Compositor.register(Compositor("QuadMesh", apply_nodata, None,
                               'data', transfer_options=True,
                               transfer_parameters=True,
                               output_type=QuadMesh,
                               backends=['bokeh', 'matplotlib', 'plotly']))
Compositor.register(Compositor("Distribution", univariate_kde, None,
                               'data', transfer_options=True,
                               transfer_parameters=True,
                               output_type=Area,
                               backends=['bokeh', 'matplotlib', 'plotly']))
Compositor.register(Compositor("Bivariate", bivariate_kde, None,
                               'data', transfer_options=True,
                               transfer_parameters=True,
                               output_type=Polygons,
                               backends=['bokeh', 'matplotlib']))
Compositor.register(Compositor("Sankey", _layout_sankey, None,
                               'data', transfer_options=True,
                               transfer_parameters=True,
                               output_type=Sankey))


DEFAULT_CYCLE = ['#30a2da', '#fc4f30', '#e5ae38', '#6d904f', '#8b8b8b', '#17becf',
                 '#9467bd', '#d62728', '#1f77b4', '#e377c2', '#8c564b', '#bcbd22']

Cycle.default_cycles['default_colors'] = DEFAULT_CYCLE

def public(obj):
    if not isinstance(obj, type): return False
    is_plot_or_cycle = any([issubclass(obj, bc) for bc in [Plot, Cycle]])
    is_renderer = any([issubclass(obj, bc) for bc in [Renderer]])
    return (is_plot_or_cycle or is_renderer)

_public = list(set([_k for _k, _v in locals().items() if public(_v)]))
__all__ = _public
