from collections import namedtuple
from gooey.gui.widgets import components


is_required = lambda widget: widget['required']
is_checkbox = lambda widget: isinstance(widget, components.CheckBox)

ComponentList = namedtuple('ComponentList', 'required_args optional_args')

def build_components(widget_list):
  '''
  :param widget_list: list of dicts containing widget info (name, type, etc..)
  :return: ComponentList

  Converts the Json widget information into concrete wx Widget types
  '''
  required_args, optional_args  = partition(widget_list, is_required)
  checkbox_args, general_args = partition(map(build_widget, optional_args), is_checkbox)

  required_args = map(build_widget, required_args)
  optional_args = general_args + checkbox_args

  return ComponentList(required_args, optional_args)

def build_widget(widget_info):
  widget_class = getattr(components, widget_info['type'])
  return widget_class(data=widget_info['data'])

def partition(collection, condition):
  return filter(condition, collection), filter(lambda x: not condition(x), collection)