'''
Created on Dec 8, 2013

@author: Chris
'''

import os
import sys
import threading

import wx

from app.dialogs.controller import Controller
from app.images import image_store
from app.dialogs.header import FrameHeader
from app.dialogs.basic_config_panel import RuntimeDisplay
from app.dialogs.footer import Footer
from gooey.gui.message_event import EVT_MSG


class MessagePump(object):
  def __init__(self, queue):
    self.queue = queue
    self.stdout = sys.stdout

  # Overrides stdout's write method
  def write(self, text):
    if text != '':
      self.queue.put(text)


class Listener(threading.Thread):
  def __init__(self, queue, textbox):
    threading.Thread.__init__(self)
    self.queue = queue
    self.update_text = lambda x: textbox.AppendText(x)

  def run(self):
    while True:
      try:
        stdout_msg = self.queue.get(timeout=1)
        if stdout_msg != '':
          self.update_text(stdout_msg)
      except Exception as e:
        pass  # Timeout. Aint nobody care 'bout dat


class MainWindow(wx.Frame):
  def __init__(self, queue, payload=None):
    wx.Frame.__init__(
      self,
      parent=None,
      id=-1,
      title=os.path.basename(__file__),
      size=(640, 480)
    )

    self._controller = Controller()

    self._init_properties()
    self._init_components()
    self._do_layout()

    self.queue = queue
    # the client's main function
    self._payload = payload

    _stdout = sys.stdout
    sys.stdout = MessagePump(queue)
    listener = Listener(queue, self.config_panel.cmd_textbox)
    listener.start()

  def _init_properties(self):
    self.SetMinSize((400, 300))
    self.icon = wx.Icon(image_store.icon, wx.BITMAP_TYPE_ICO)
    self.SetIcon(self.icon)

  def _init_components(self):
    # init gui
    self.head_panel = FrameHeader(image_path=image_store.computer3, parent=self, size=(30, 90))
    self.config_panel = RuntimeDisplay(parent=self)
    self.foot_panel = Footer(self, self._controller)

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

    self.Bind(EVT_MSG, self.OnMsg)

  def _init_panels(self):
    self._frame_header = FrameHeader
    self._basic_config_body = None
    self._adv_config_body = None
    self._config_footer = None
    self._output_footer = None

  def _draw_horizontal_line(self, sizer):
    line = wx.StaticLine(self, -1, style=wx.LI_HORIZONTAL)
    line.SetSize((10, 10))
    sizer.Add(line, 0, wx.EXPAND)