import sublime_plugin


# Input handlers
############################################################
class SimpleTextInput(sublime_plugin.TextInputHandler):
    def __init__(self, args):
        if not isinstance(args, list):
            args = [args]
        self.input, *self.next_inputs = args
        self.argname, self.default = self.input

    def placeholder(self):
        if isinstance(self.default, str):
            return self.default
        else:
            return ""

    def name(self):
        return self.argname

    def next_input(self, args):
        if self.next_inputs:
            if isinstance(self.next_inputs[0][1], list):
                return SimpleListInput(self.next_inputs)
            else:
                return SimpleTextInput(self.next_inputs)


class SimpleListInput(sublime_plugin.ListInputHandler):
    def __init__(self, args):
        if not isinstance(args, list):
            args = [args]
        self.input, *self.next_inputs = args
        self.argname, self.list = self.input

    def name(self):
        return self.argname

    def list_items(self):
        if isinstance(self.list, list):
            return self.list
        else:
            return [self.list]

    def next_input(self, args):
        if self.next_inputs:
            if isinstance(self.next_inputs[0][1], str):
                return SimpleTextInput(self.next_inputs)
            else:
                return SimpleListInput(self.next_inputs)


# class ActiveWorkspacesIdList(sublime_plugin.ListInputHandler):
#     def __init__(self, window=None, buffer_list=False, buffer_text=False):
#         self.window = window
#         self.buffer_list = buffer_list
#         self.buffer_text = buffer_text

#     def name(self):
#         return "workspace_id"

#     def list_items(self):
#         return [vws.id for vws in client.all_workspaces(self.window)]

#     def next_input(self, args):
#         if self.buffer_list:
#             return BufferIdList(args["workspace_id"])
#         elif self.buffer_text:
#             return SimpleTextInput(("buffer_id", "new buffer"))


# # To allow for having a selection and choosing non existing workspaces
# # we do a little dance: We pass this list input handler to a TextInputHandler
# # when we select "Create New..." which adds his result to the list of possible
# # workspaces and pop itself off the stack to go back to the list handler.
# class WorkspaceIdList(sublime_plugin.ListInputHandler):
#     def __init__(self):
#         assert client.codemp is not None  # the command should not be available

#         # at the moment, the client can't give us a full list of existing workspaces
#         # so a textinputhandler would be more appropriate. but we keep this for the future

#         self.add_entry_text = "* add entry..."
#         self.list = client.codemp.list_workspaces(True, True).wait()
#         self.list.sort()
#         self.list.append(self.add_entry_text)
#         self.preselected = None

#     def name(self):
#         return "workspace_id"

#     def placeholder(self):
#         return "Workspace"

#     def list_items(self):
#         if self.preselected is not None:
#             return (self.list, self.preselected)
#         else:
#             return self.list

#     def next_input(self, args):
#         if args["workspace_id"] == self.add_entry_text:
#             return AddListEntry(self)


# class BufferIdList(sublime_plugin.ListInputHandler):
#     def __init__(self, workspace_id):
#         vws = client.workspace_from_id(workspace_id)
#         self.add_entry_text = "* create new..."
#         self.list = vws.codemp.filetree(None)
#         self.list.sort()
#         self.list.append(self.add_entry_text)
#         self.preselected = None

#     def name(self):
#         return "buffer_id"

#     def placeholder(self):
#         return "Buffer Id"

#     def list_items(self):
#         if self.preselected is not None:
#             return (self.list, self.preselected)
#         else:
#             return self.list

#     def next_input(self, args):
#         if args["buffer_id"] == self.add_entry_text:
#             return AddListEntry(self)


# class AddListEntry(sublime_plugin.TextInputHandler):
#     # this class works when the list input handler
#     # added appended a new element to it's list that will need to be
#     # replaced with the entry added from here!
#     def __init__(self, list_input_handler):
#         self.parent = list_input_handler

#     def name(self):
#         return ""

#     def validate(self, text: str) -> bool:
#         return not len(text) == 0

#     def confirm(self, text: str):
#         self.parent.list.pop()  # removes the add_entry_text
#         self.parent.list.insert(0, text)
#         self.parent.preselected = 0

#     def next_input(self, args):
#         return sublime_plugin.BackInputHandler()