#  ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓
#  ┃ ██████ ██████ ██████       █      █      █      █      █ █▄  ▀███ █       ┃
#  ┃ ▄▄▄▄▄█ █▄▄▄▄▄ ▄▄▄▄▄█  ▀▀▀▀▀█▀▀▀▀▀ █ ▀▀▀▀▀█ ████████▌▐███ ███▄  ▀█ █ ▀▀▀▀▀ ┃
#  ┃ █▀▀▀▀▀ █▀▀▀▀▀ █▀██▀▀ ▄▄▄▄▄ █ ▄▄▄▄▄█ ▄▄▄▄▄█ ████████▌▐███ █████▄   █ ▄▄▄▄▄ ┃
#  ┃ █      ██████ █  ▀█▄       █ ██████      █      ███▌▐███ ███████▄ █       ┃
#  ┣━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫
#  ┃ Copyright (c) 2017, the Perspective Authors.                              ┃
#  ┃ ╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌ ┃
#  ┃ This file is part of the Perspective library, distributed under the terms ┃
#  ┃ of the [Apache License 2.0](https://www.apache.org/licenses/LICENSE-2.0). ┃
#  ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛

from traitlets import HasTraits, Unicode, List, Bool, Dict, validate, Enum

import importlib.metadata

__version__ = importlib.metadata.version("perspective-python")

from .validate import (
    validate_version,
)


class PerspectiveTraitlets(HasTraits):
    """Define the traitlet interface with `PerspectiveJupyterWidget` on the
    front end. Attributes which are set here are synchronized between the
    front-end and back-end.

    Examples:
        >>> widget = perspective.PerspectiveWidget(
        ...     data, group_by=["a", "b", "c"])
        PerspectiveWidget(group_by=["a", "b", "c"])
        >>> widget.split_by=["b"]
        >>> widget
        PerspectiveWidget(group_by=["a", "b", "c"], split_by=["b"])
    """

    # `perspective-viewer` options
    plugin = Unicode("Datagrid").tag(sync=True)
    columns = List(default_value=[]).tag(sync=True)
    group_by = List(trait=Unicode(), default_value=[]).tag(sync=True, o=True)
    split_by = List(trait=Unicode(), default_value=[]).tag(sync=True)
    aggregates = Dict(default_value={}).tag(sync=True)
    sort = List(default_value=[]).tag(sync=True)
    filter = List(default_value=[]).tag(sync=True)
    expressions = Dict(default_value=[]).tag(sync=True)
    plugin_config = Dict(default_value={}).tag(sync=True)
    settings = Bool(True).tag(sync=True)
    theme = Unicode("Pro Light", allow_none=True).tag(sync=True)

    # used to tell the frontend which table to connect to
    table_name = Unicode(None, allow_none=True).tag(sync=True)

    server = Bool(False).tag(sync=True)
    binding_mode = Enum(("server", "client-server")).tag(default="server", sync=True)
    title = Unicode(None, allow_none=True).tag(sync=True)
    version = Unicode(__version__).tag(sync=True)

    # @validate("plugin")
    # def _validate_plugin(self, proposal):
    #     return validate_plugin(proposal.value)

    # @validate("columns")
    # def _validate_columns(self, proposal):
    #     return validate_columns(proposal.value)

    # @validate("group_by")
    # def _validate_group_by(self, proposal):
    #     return validate_group_by(proposal.value)

    # @validate("split_by")
    # def _validate_split_by(self, proposal):
    #     return validate_split_by(proposal.value)

    # @validate("aggregates")
    # def _validate_aggregates(self, proposal):
    #     return validate_aggregates(proposal.value)

    # @validate("sort")
    # def _validate_sort(self, proposal):
    #     return validate_sort(proposal.value)

    # @validate("filter")
    # def _validate_filter(self, proposal):
    #     return validate_filter(proposal.value)

    # @validate("expressions")
    # def _validate_expressions(self, proposal):
    #     return validate_expressions(proposal.value)

    # @validate("plugin_config")
    # def _validate_plugin_config(self, proposal):
    #     return validate_plugin_config(proposal.value)

    # @validate("title")
    # def _validate_title(self, proposal):
    #     return validate_title(proposal.value)

    @validate("version")
    def _validate_version(self, proposal):
        return validate_version(proposal.value)