from gi.repository import GObject, Gtk, Gdk
import os, sys, glob, re
import config

class ModelSelector(Gtk.Dialog):
    def __init__(self, asr_model = ''):
        super(ModelSelector, self).__init__()
        self.options = {'asr_model': asr_model, 'osc_host': '127.0.0.1', 'osc_port': '1234', 'slu': '0', 'adaptation': 'macbook'}
        self.load_options()

        self.set_title('Configuration')
        self.set_border_width(10)
        self.add_button("Cancel", Gtk.ResponseType.CANCEL)
        self.add_button("OK", Gtk.ResponseType.OK)
        box = self.get_content_area()

        #xml_box = Gtk.HBox()
        #xml_box.pack_start(Gtk.Label('XML file:'), False, False, 5)
        #xml_entry = Gtk.Entry()
        #xml_entry.set_text(self.options['xml_filename'])
        #xml_entry.set_width_chars(len(self.options['xml_filename']))
        #self.xml_entry = xml_entry
        #xml_box.pack_start(xml_entry, True, True, 5)
        #xml_button = Gtk.Button("Choose...")
        #xml_button.connect('clicked', self.show_filechooser)
        #xml_box.pack_start(xml_button, False, False, 5)

        #box.pack_start(xml_box, False, False, 5)

        model_box = Gtk.HBox()
        model_box.pack_start(Gtk.Label('ASR model:'), False, False, 5)
        model_chooser = Gtk.ComboBoxText()
        model_chooser.set_entry_text_column(0)
        target_index = 0
        for i, model in enumerate(self.list_models()):
            model_chooser.append_text(model)
            if self.options['asr_model'] == self.models[i]:
                target_index = i
        model_chooser.set_active(target_index)
        self.model_chooser = model_chooser
        model_box.pack_start(model_chooser, True, True, 5)

        box.pack_start(model_box, False, False, 5)

        self.adaptations = ['show', 'macbook', 'none']
        adaptation_box = Gtk.HBox()
        adaptation_box.pack_start(Gtk.Label('Adaptation:'), False, False, 5)
        adaptation_chooser = Gtk.ComboBoxText()
        adaptation_chooser.set_entry_text_column(0)
        target_index = 0
        for i, adaptation in enumerate(self.adaptations):
            adaptation_chooser.append_text(adaptation)
            if self.options['adaptation'] == adaptation:
                target_index = i
        adaptation_chooser.set_active(target_index)
        self.adaptation_chooser = adaptation_chooser
        adaptation_box.pack_start(adaptation_chooser, True, True, 5)

        box.pack_start(adaptation_box, False, False, 5)

        slu_box =Gtk.HBox()
        slu_box.pack_start(Gtk.Label('SLU model:'), False, False, 5)
        slu_chooser = Gtk.ComboBoxText()
        slu_chooser.set_entry_text_column(0)
        for i, slu in enumerate(['Regular', 'Alternative']):
            slu_chooser.append_text(slu)
        slu_chooser.set_active(int(self.options['slu']))
        self.slu_chooser = slu_chooser
        slu_box.pack_start(slu_chooser, True, True, 5)

        box.pack_start(slu_box, False, False, 5)

        osc_box = Gtk.HBox()
        osc_box.pack_start(Gtk.Label('OSC host:'), False, False, 5)
        osc_host = Gtk.Entry()
        osc_host.set_text(self.options['osc_host'])
        osc_host.set_width_chars(len(osc_host.get_text()))
        self.osc_host = osc_host
        osc_box.pack_start(osc_host, True, True, 5)
        osc_box.pack_start(Gtk.Label('Port:'), False, False, 5)
        osc_port = Gtk.Entry()
        osc_port.set_text(self.options['osc_port'])
        osc_port.set_width_chars(len(osc_port.get_text()))
        self.osc_port = osc_port
        osc_box.pack_start(osc_port, True, True, 5)

        box.pack_start(osc_box, False, False, 5)

        #self.xml_entry.set_activates_default(True)
        okButton = self.get_widget_for_response(response_id=Gtk.ResponseType.OK)
        okButton.set_can_default(True)
        okButton.grab_default()
        okButton.grab_focus()

        self.show_all()

    def save_options(self):
        try:
            with open('.options.txt', 'w') as fp:
                for key, value in self.options.items():
                    print >>fp, '%s: %s' % (key, str(value))
        except:
            print 'Warning: could not save options'

    def load_options(self):
        try:
            with open('.options.txt') as fp:
                for line in fp:
                    line = line.strip()
                    found = re.search('^([^:]*):(.*)', line)
                    if found:
                        key = found.group(1).strip()
                        value = found.group(2).strip()
                        self.options[key] = value
        except:
            print 'Warning: could not load options'

    def show_filechooser(self, button):
        dialog = Gtk.FileChooserDialog("Please choose a file", self, Gtk.FileChooserAction.OPEN, (Gtk.STOCK_CANCEL, Gtk.ResponseType.CANCEL, Gtk.STOCK_OPEN, Gtk.ResponseType.OK))
        filter_text = Gtk.FileFilter()
        filter_text.set_name("XML files")
        filter_text.add_mime_type("text/xml")
        dialog.add_filter(filter_text)
        dialog.set_current_folder('%s/data' % (os.path.dirname(__file__) or '.'))

        response = dialog.run()
        if response == Gtk.ResponseType.OK:
            self.xml_entry.set_text(dialog.get_filename())
        dialog.destroy()

    def list_models(self):
        self.models = []
        model_names = []
        for filename in glob.glob('asr/models/*.cfg'):
            try:
                items = config.read(filename)
                self.models.append(filename)
                if 'name' in items:
                    model_names.append(items['name'])
                else:
                    model_names.append(filename)
            except:
               pass
        return model_names

    def run(self):
        response = super(ModelSelector, self).run()
        if response != Gtk.ResponseType.OK:
            return None, None, None, None, None
        self.options['asr_model'] = self.models[self.model_chooser.get_active()]
        self.options['adaptation'] = self.adaptations[self.adaptation_chooser.get_active()]
        #self.options['xml_filename'] = self.xml_entry.get_text()
        self.options['osc_host'] = self.osc_host.get_text()
        self.options['osc_port'] = self.osc_port.get_text()
        self.options['slu'] = self.slu_chooser.get_active()
        self.save_options()
        self.destroy()
        return self.options['asr_model'], self.options['osc_host'], self.options['osc_port'], self.options['slu'], self.options['adaptation']