from __future__ import annotations

from .tkstate import state


class tkPopupController:
    def __init__(self, events):
        self.events = events
        self.state = None

    def prepare(self, fig, parent=None):
        try:
            from tkinter import Tk, Menu
        except ImportError as exc:
            raise ImportError("Popup-menu support requires tkinter") from exc
        owns_parent = parent is None
        if parent is None:
            parent = Tk(); parent.withdraw()
        menu = Menu(parent, tearoff=0)
        self.state = state(fig=fig, parent=parent, menu=menu, owns_parent=owns_parent)
        self.state.add_menu = lambda label="run", command=lambda: print("run selected"): menu.add_command(label=label, command=command)
        return self.state

    def register(self, on_click=None):
        if self.state is None: raise RuntimeError("prepare_popup_menu() must be called first")
        def default(event):
            if event.button == 3 and getattr(event, "guiEvent", None) is not None:
                self.state.menu.tk_popup(event.guiEvent.x_root, event.guiEvent.y_root)
        return self.events.connect(self.state.fig, "button_press_event", on_click or default,
                                   key=("popup", id(self.state.fig)))
