from collections import OrderedDict
import wx
from gooey.gui.pubsub import pub

from gooey.gui import events
from gooey.gui.windows.advanced_config import ConfigPanel
from gooey.gui.windows.sidebar import Sidebar
from gooey.gui.util import wx_util

basic_config = {
    'required': [{
      'type': 'CommandField',
      'data': {
        'display_name': 'Enter Commands',
        'help': 'Enter command line arguments',
        'nargs': '',
        'commands': '',
        'choices': [],
      }
    }],
    'optional': []
}


class FlatLayout(wx.Panel):
  def __init__(self, *args, **kwargs):
    self._build_spec = kwargs.pop('build_spec')
    super(FlatLayout, self).__init__(*args, **kwargs)
    self.SetDoubleBuffered(True)

    self.main_content = ConfigPanel(self, widgets=self._build_spec['widgets'], opt_cols=self._build_spec['num_optional_cols'])

    sizer = wx.BoxSizer(wx.HORIZONTAL)
    sizer.Add(self.main_content, 3, wx.EXPAND)
    self.SetSizer(sizer)

  def GetOptions(self):
    return self.main_content.GetOptions()

  def GetRequiredArgs(self):
    return self.main_content.GetRequiredArgs()


class ColumnLayout(wx.Panel):
  def __init__(self, *args, **kwargs):
    self._build_spec = kwargs.pop('build_spec')
    super(ColumnLayout, self).__init__(*args, **kwargs)
    self.SetDoubleBuffered(True)

    self.sidebar = Sidebar(self, contents=self._build_spec['widgets'].keys())

    self.config_panels = self.build_panels(self._build_spec)
    self.active_panel = self.config_panels.keys()[0]
    self.config_panels[self.active_panel].Show()

    sizer = wx.BoxSizer(wx.HORIZONTAL)
    sizer.Add(self.sidebar, 1, wx.EXPAND)
    sizer.Add(wx_util.vertical_rule(self), 0, wx.EXPAND)
    for panel in self.config_panels.values():
      sizer.Add(panel, 3, wx.EXPAND)
    self.SetSizer(sizer)

    pub.subscribe(self.load_view,   events.PANEL_CHANGE)

  def load_view(self, view_name):
    self.config_panels[self.active_panel].Hide()
    self.config_panels[view_name].Show()
    self.active_panel = view_name
    self.Layout()

  def build_panels(self, build_spec):
    panels = OrderedDict()
    for panel_name in self._build_spec['widgets'].keys():
      panel = ConfigPanel(self, widgets=self._build_spec['widgets'][panel_name], opt_cols=self._build_spec['num_optional_cols'], title=panel_name.upper())
      panels[panel_name] = panel
      panel.Hide()
    return panels

  def GetOptions(self):
    return '{} {}'.format(self.active_panel, self.config_panels[self.active_panel].GetOptions())

  def GetRequiredArgs(self):
    return self.config_panels[self.active_panel].GetRequiredArgs()



def get_layout_builder(layout_type):
  if layout_type == 'column':
    return