'''
Created on Jan 19, 2014

New plan: 

  fuck the multi-component thing.

  Bind and unbind the buttons on the panels.

@author: Chris
'''

import os
import wx
import sys
import header

from gooey import i18n
from gooey.gui import footer
from gooey import image_repository
from gooey.gui.controller import Controller
from gooey.gui.runtime_display_panel import RuntimeDisplay
import styling


class BaseWindow(wx.Frame):
  def __init__(self, BodyPanel, client_app, params):
    wx.Frame.__init__(self, parent=None, id=-1)

    self._params = params
    self._client_app = client_app

    self._controller = None

    # Components
    self.icon = None
    self.head_panel = None
    self.config_panel = None
    self.runtime_display = None
    self.foot_panel = None
    self.panels = None

    self._init_properties()
    self._init_components(BodyPanel)
    self._do_layout()
    self._init_controller()
    self.registerControllers()


  def _init_properties(self):
    if not self._params['program_name']:
      title = os.path.basename(sys.argv[0].replace('.py', ''))
    else:
      title = self._params['program_name']
    self.SetTitle(title)
    self.SetSize((610, 530))
    self.SetMinSize((400, 300))
    self.icon = wx.Icon(image_repository.icon, wx.BITMAP_TYPE_ICO)
    self.SetIcon(self.icon)

  def _init_components(self, BodyPanel):
    # init gui
    self.head_panel = header.FrameHeader(
        heading=i18n.translate("settings_title"),
        subheading=self._client_app.description,
        parent=self)
    self.config_panel = BodyPanel(self)
    self.runtime_display = RuntimeDisplay(self)
    self.foot_panel = footer.Footer(self, self._controller)
    self.panels = [self.head_panel, self.config_panel, self.foot_panel]

  def _do_layout(self):
    sizer = wx.BoxSizer(wx.VERTICAL)
    sizer.Add(self.head_panel, 0, wx.EXPAND)
    sizer.Add(styling.HorizontalRule(self), 0, wx.EXPAND)
    sizer.Add(self.config_panel, 1, wx.EXPAND)
    self.runtime_display.Hide()
    sizer.Add(self.runtime_display, 1, wx.EXPAND)
    sizer.Add(styling.HorizontalRule(self), 0, wx.EXPAND)
    sizer.Add(self.foot_panel, 0, wx.EXPAND)
    self.SetSizer(sizer)

  def _init_controller(self):
    self._controller = Controller(
        base_frame=self,
        client_app=self._client_app)

  def registerControllers(self):
    for panel in self.panels:
      panel.RegisterController(self._controller)

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

  def NextPage(self):
    self.head_panel.NextPage()
    self.foot_panel.NextPage()
    self.config_panel.Hide()
    self.runtime_display.Show()
    self.Layout()

  # def AttachPayload(self, payload):
  #   self._payload = payload

  def ManualStart(self):
    self._controller.ManualStart()


if __name__ == '__main__':
  pass