from pathlib import Path

import ipyvue
import reacton
import traitlets
from ipywidgets import DOMWidget
from traitlets import Unicode, default

HERE = Path(__file__).parent
# Exports a few built vue components, e.g.:
# "import { MyComponent } from "./dist/index.js" works in vue land
module_path = HERE / "dist/index.js"

# ----------------------------------------
# Pulled from `ipyreact` after looking at `pyantd` example
# ----------------------------------------
module_name = "@widgetti/jupyter-react"
module_version = "^0.5.0"

_standard_dependencies: list[str] = []


def get_module_names():
    return _standard_dependencies


class Module(DOMWidget):
    _model_name = Unicode("Module").tag(sync=True)
    _model_module = Unicode(module_name).tag(sync=True)
    _model_module_version = Unicode(module_version).tag(sync=True)
    _view_name = Unicode("ModuleView").tag(sync=True)
    _view_module = Unicode(module_name).tag(sync=True)
    _view_module_version = Unicode(module_version).tag(sync=True)
    name = Unicode(allow_none=False).tag(sync=True)
    code = Unicode(allow_none=False).tag(sync=True)
    dependencies = traitlets.List(Unicode(), allow_none=True).tag(sync=True)
    status = Unicode(allow_none=True).tag(sync=True)

    @default("dependencies")
    def _default_dependencies(self):
        return [k for k in get_module_names() if k != self.name]


def define_module(name, module: str | Path):
    """Register a ES module under a name.

    Parameters
    ----------
    name: str
        Name of the es module to register
    module: str | Path
        The module code to register
    """
    _standard_dependencies.append(name)
    return Module(
        code=(
            module
            if not isinstance(module, Path)
            else module.read_text(encoding="utf8")
        ),
        name=name,
    )


# ----------------------------
# My attempt to expose built es module to ipyvue
# ----------------------------
define_module("my-module", module_path)


class MyComponentWidget(ipyvue.VueWidget):
    _module = traitlets.Unicode("my-module").tag(sync=True)
    _type = traitlets.Unicode("MyComponent").tag(sync=True)


def MyComponent(props={}, events={}, children=[]):
    widget_cls = MyComponentWidget
    comp = reacton.core.ComponentWidget(widget=widget_cls)
    return reacton.core.Element(
        comp, kwargs={"props": props, "events": events, "children": children}
    )


# -------------
# in jupyter notebook somewhere:
# MyComponent()
# -------------
