import sublime
import logging

from . import qp_globals as qpg

from ..core.workspace import workspaces
# from ..core.buffers import buffers

logger = logging.getLogger(__name__)

def qpi(text, details="", color=qpg.QP_COLOR_NONE, letter="", name="", hint="", prefix=""):
    return sublime.QuickPanelItem(text, details, annotation=hint, kind=(color, letter, name))

def show_qp(window, choices, on_done, placeholder='', keepopen=True):
    def _():
        flags = sublime.KEEP_OPEN_ON_FOCUS_LOST if keepopen else 0
        window.show_quick_panel(choices, on_done, flags, placeholder=placeholder)
    sublime.set_timeout(_, 10)

class QPServerBrowser():
    def __init__(self, window, host, raw_input_items):
        self.window = window
        self.host = host
        self.raw_input_items = raw_input_items

    def make_entry(self, wsid):
        return qpi(wsid, letter="w", color=qpg.QP_COLOR_BLUISH, hint="Workspace", prefix="    ")

    def qp_placeholder(self):
        return f"Browsing workspaces on host: {self.host}"

    def run(self):
        self.current_wid_selection = None
        self.entries = []
        for item in self.raw_input_items:
            self.entries.append(self.make_entry(item))

        self.entries.insert(0, qpi("Server Actions",
            color=qpg.QP_COLOR_CYANISH,
            letter=qpg.QP_DETAILS,
            hint="Submenu",
            prefix=" • "))

        show_qp(self.window, self.entries, self.server_actions, self.qp_placeholder())

    def server_actions(self, index):
        if index == -1:
            return
        elif index == 0:
            self.edit_server()
            return

        wid = self.entries[index].trigger
        self.current_wid_selection = wid
        # self.select_workspace()
        def _():
            if not wid in workspaces:
                try: self.window.run_command(
                        "codemp_join_workspace", {"workspace_id": wid})
                except Exception as e:
                    return

            ws = workspaces.lookupId(wid)
            buffers = ws.handle.fetch_buffers()

            QPWorkspaceBrowser(self.window, wid, buffers.wait()).run()
        sublime.set_timeout(_)
        logger.debug("exiting the server_broswer.")


    def edit_server(self):
        actions = [
            qpi("Back", color=qpg.QP_COLOR_CYANISH, letter=qpg.QP_BACK),
            qpi("Disconnect", color=qpg.QP_COLOR_REDISH, letter=qpg.QP_BACK),
            qpi("New Workspace", color=qpg.QP_COLOR_GREENISH, letter=qpg.QP_ADD),
            qpi("Delete Workspace", color=qpg.QP_COLOR_REDISH, letter=qpg.QP_NO)
        ]
        show_qp(self.window, actions, self.edit_server_actions, self.qp_placeholder())

    def edit_server_actions(self, index):
        if index == -1:
            return

        if index == 0:
            self.run()

        if index == 1:
            self.window.run_command("codemp_disconnect", {})

        if index == 2:
            def create_workspace(name):
                self.window.run_command(
                    "codemp_create_workspace", {"workspace_id": name})
                self.window.run_command(
                    "codemp_browse_server", {})

            self.window.show_input_panel("New Workspace Name", "", create_workspace, None, self.edit_server)

        if index == 3:
            def delete_workspace(index):
                if index == -1 or index == 0:
                    self.edit_server()
                    return

                selected = self.entries[index]
                self.window.run_command(
                    "codemp_delete_workspace",
                    {"workspace_id": selected.trigger})
                self.window.run_command(
                    "codemp_browse_server", {})

            if len(self.entries) < 2:
                sublime.message_dialog("You don't have workspaces to delete!")
                sublime.set_timeout(self.run, 10)
            else:
                selentries = self.entries
                selentries[0] = qpi("Back", color=qpg.QP_COLOR_CYANISH, letter=qpg.QP_BACK)
                show_qp(self.window, selentries, delete_workspace, self.qp_placeholder(), keepopen=False)
            show_qp(self.window, self.entries, delete_workspace, self.qp_placeholder())


class QPWorkspaceBrowser():
    def __init__(self, window, workspace_id, raw_input_items):
        self.window = window
        self.workspace_id = workspace_id
        self.raw_input_items = raw_input_items

    def qp_placeholder(self):
        return f"Browsing buffers in {self.workspace_id}"

    def make_entry(self, item):
        return qpi(item, letter="b", color=qpg.QP_COLOR_BLUISH, hint="Buffer", prefix="    ")

    def run(self):
        self.entries = []
        for buffer in self.raw_input_items:
            self.entries.append(self.make_entry(buffer))

        self.entries.insert(0, qpi("Workspace Actions",
            color=qpg.QP_COLOR_CYANISH,
            letter=qpg.QP_DETAILS,
            hint="Submenu",
            prefix=" • "))

        show_qp(self.window, self.entries, self.workspace_actions, self.qp_placeholder())

    def workspace_actions(self, index):
        if index == -1:
            return
        elif index == 0:
            self.edit_workspace()
            return

        bid = self.entries[index].trigger

        self.window.run_command(
            "codemp_join_buffer",
            {
                "workspace_id": self.workspace_id,
                "buffer_id": bid
            })

    def edit_workspace(self):
        actions = [
            qpi("Back", color=qpg.QP_COLOR_CYANISH, letter=qpg.QP_BACK),
            qpi("Leave Workspace", color=qpg.QP_COLOR_ORANGISH, letter=qpg.QP_BACK),
            qpi("Invite User", color=qpg.QP_COLOR_PINKISH, letter=qpg.QP_FORWARD),
            qpi("Create Buffer", color=qpg.QP_COLOR_GREENISH, letter=qpg.QP_ADD),
            qpi("Delete Buffer", color=qpg.QP_COLOR_REDISH, letter=qpg.QP_NO),
            qpi("Rename Buffer", color=qpg.QP_COLOR_ORANGISH, letter=qpg.QP_RENAME),
        ]
        show_qp(self.window, actions, self.edit_workspace_actions, self.qp_placeholder())

    def edit_workspace_actions(self, index):
        if index == -1 or index == 0:
            self.run()
        elif index == 1:
            self.window.run_command(
                "codemp_leave_workspace", {"workspace_id": self.workspace_id})
            self.window.run_command(
                "codemp_browse_server", {})
        elif index == 2:
            self.window.run_command(
                "codemp_invite_to_workspace", {"workspace_id": self.workspace_id})
        elif index == 3:
            def create_buffer(name):
                self.window.run_command(
                    "codemp_create_buffer",
                    {
                        "workspace_id": self.workspace_id,
                        "buffer_id": name
                    })

                self.window.run_command(
                    "codemp_browse_workspace", {"workspace_id": self.workspace_id})

            panel = self.window.show_input_panel("New Buffer Name", "", create_buffer, None, self.edit_workspace)
            panel.settings().set("password", False)
        elif index == 4:
            def delete_buffer(index):
                if index == -1 or index == 0:
                    self.edit_workspace()
                    return

                # same warning as the server browser. Check your indexed 3 times
                selected = self.entries[index]
                self.window.run_command(
                    "codemp_delete_buffer",
                    {
                        "workspace_id": self.workspace_id,
                        "buffer_id": selected.trigger
                    })

                self.window.run_command(
                    "codemp_browse_workspace", {"workspace_id": self.workspace_id})

            if len(self.entries) < 2:
                sublime.message_dialog("The workspace is empty!")
                sublime.set_timeout(self.run, 10)
            else:
                selentries = self.entries
                selentries[0] = qpi("Back", color=qpg.QP_COLOR_CYANISH, letter=qpg.QP_BACK)
                show_qp(self.window, selentries, delete_buffer, self.qp_placeholder(), keepopen=False)


        elif index == 5:
            sublime.message_dialog("renaming is not yet implemented.")
            self.edit_workspace()
        logger.debug("Exiting the workspace browser")