__author__ = 'Chris'

import wx
import styling
from calender_dialog import CalendarDlg


class AbstractChooser(object):
  def __init__(self, data):
    self.data = data

    # parent
    self.panel = None

    self.button_text = 'Browse'

    # Widgets
    self.title = None
    self.help_msg = None
    self.text_box = None
    self.button = None
    self.panel = None

  def build(self, parent):
    return self.do_layout(parent)

  def do_layout(self, parent):
    self.panel = wx.Panel(parent)

    self.title = self.CreateNameLabelWidget(self.panel)
    self.help_msg = self.CreateHelpMsgWidget(self.panel)
    self.text_box = wx.TextCtrl(self.panel)
    self.button = wx.Button(self.panel, label=self.button_text, size=(73, 23))

    vertical_container = wx.BoxSizer(wx.VERTICAL)
    widget_sizer = wx.BoxSizer(wx.HORIZONTAL)

    vertical_container.Add(self.title)
    vertical_container.AddSpacer(2)

    if self.help_msg.GetLabelText():
      vertical_container.Add(self.help_msg, 1, wx.EXPAND)
      vertical_container.AddSpacer(2)
    else:
      vertical_container.AddStretchSpacer(1)

    widget_sizer.Add(self.text_box, 1, wx.EXPAND)
    widget_sizer.AddSpacer(10)
    widget_sizer.Add(self.button, 0)

    vertical_container.Add(widget_sizer, 0, wx.EXPAND)
    self.panel.SetSizer(vertical_container)

    self.panel.Bind(wx.EVT_SIZE, self.OnResize)
    self.panel.Bind(wx.EVT_BUTTON, self.on_button, self.button)
    return self.panel

  def CreateHelpMsgWidget(self, parent):
    base_text = wx.StaticText(parent, label=self.data['help_msg'])
    # if self.data['nargs']:
    #   base_text.SetLabelText(base_text.GetLabelText() + self.CreateNargsMsg(action))
    styling.MakeDarkGrey(base_text)
    return base_text

  def CreateNameLabelWidget(self, parent):
    label = self.data['title'].title()
    text = wx.StaticText(parent, label=label)
    styling.MakeBold(text)
    return text

  def OnResize(self, evt):
    if self.help_msg is None:
      return

    container_width, _ = self.panel.Size
    text_width, _ = self.help_msg.Size

    if text_width != container_width:
      self.help_msg.SetLabel(self.help_msg.GetLabelText().replace('\n', ' '))
      self.help_msg.Wrap(container_width)
    evt.Skip()

  def on_button(self, evt):
    raise NotImplementedError



class FileChooser(AbstractChooser):
  def __init__(self, data):
    AbstractChooser.__init__(self, data)

  def on_button(self, evt):
    dlg = wx.FileDialog(self.panel, style=wx.FD_OPEN | wx.FD_FILE_MUST_EXIST)
    result = (dlg.GetPath()
              if dlg.ShowModal() == wx.ID_OK
              else None)
    if result:
      self.text_box.SetLabelText(result)


class DirectoryChooser(AbstractChooser):
  def __init__(self, data):
    AbstractChooser.__init__(self, data)

  def on_button(self, evt):
    dlg = wx.DirDialog(self.panel, 'Select directory', style=wx.DD_DEFAULT_STYLE)
    result = (dlg.GetPath()
              if dlg.ShowModal() == wx.ID_OK
              else None)
    if result:
      self.text_box.SetLabelText(result)


class CalendarChooser(AbstractChooser):
  def __init__(self, data):
    AbstractChooser.__init__(self, data)
    self.button_text = 'Choose Date'

  def on_button(self, evt):
    dlg = CalendarDlg(self.panel)
    dlg.ShowModal()
    if dlg.GetPath():
      self.text_box.SetLabelText(dlg.GetPath())