import logging
import os

from . import color_grid
from . import template_grid
from . import option_grid
from . import keyword_grid
from ..data import files
from ..data import themer
from ..data.config import WALL_DIR, WPG_DIR, __version__

from gi import require_version
from gi.repository import Gtk, GdkPixbuf
require_version('Gtk', '3.0')

PAD = 10


class mainWindow(Gtk.Window):

    def __init__(self, args):
        Gtk.Window.__init__(self, title='wpgtk ' + __version__)

        image_name = os.path.join(WPG_DIR, '.current')
        image_name = os.path.realpath(image_name)
        self.set_default_size(200, 200)
        self.args = args

        # these variables are just to get the image
        # and preview of current wallpaper
        file_name = themer.get_current()
        logging.info('current wallpaper: ' + file_name)
        sample_name = files.get_sample_path(file_name)

        self.notebook = Gtk.Notebook()
        self.add(self.notebook)

        self.wpage = Gtk.Grid()
        self.wpage.set_border_width(PAD)
        self.wpage.set_column_homogeneous(1)
        self.wpage.set_row_spacing(PAD)
        self.wpage.set_column_spacing(PAD)

        self.cpage = color_grid.ColorGrid(self)
        self.fpage = template_grid.TemplateGrid(self)
        self.optpage = option_grid.OptionsGrid(self)
        self.keypage = keyword_grid.KeywordGrid(self)

        self.notebook.append_page(self.wpage, Gtk.Label('Wallpapers'))
        self.notebook.append_page(self.cpage, Gtk.Label('Colors'))
        self.notebook.append_page(self.fpage, Gtk.Label('Templates'))
        self.notebook.append_page(self.keypage, Gtk.Label('Keywords'))
        self.notebook.append_page(self.optpage, Gtk.Label('Options'))

        option_list = Gtk.ListStore(str)
        current_idx = None

        for (i, elem) in enumerate(files.get_file_list()):
            if elem == themer.get_current():
                current_idx = i

            option_list.append([elem])

        self.option_combo = Gtk.ComboBox.new_with_model(option_list)
        self.renderer_text = Gtk.CellRendererText()
        self.option_combo.pack_start(self.renderer_text, True)
        self.option_combo.add_attribute(self.renderer_text, 'text', 0)
        self.option_combo.set_entry_text_column(0)

        self.textbox = Gtk.Label()
        self.textbox.set_text('Select colorscheme')
        self.colorscheme = Gtk.ComboBox.new_with_model(option_list)
        self.colorscheme.pack_start(self.renderer_text, True)
        self.colorscheme.add_attribute(self.renderer_text, 'text', 0)
        self.colorscheme.set_entry_text_column(0)

        self.set_border_width(10)
        self.preview = Gtk.Image()
        self.sample = Gtk.Image()

        if(os.path.isfile(image_name) and os.path.isfile(sample_name)):
            self.pixbuf_preview = GdkPixbuf.Pixbuf.new_from_file_at_scale(
                                  image_name,
                                  width=500,
                                  height=333, preserve_aspect_ratio=False)
            self.pixbuf_sample = GdkPixbuf.Pixbuf.new_from_file_at_size(
                                 sample_name,
                                 width=500, height=500)
            self.preview.set_from_pixbuf(self.pixbuf_preview)
            self.sample.set_from_pixbuf(self.pixbuf_sample)

        self.add_button = Gtk.Button(label='Add')
        self.set_button = Gtk.Button(label='Set')
        self.rm_button = Gtk.Button(label='Remove')

        # adds to first cell in wpage
        self.wpage.attach(self.option_combo, 1, 1, 2, 1)
        self.wpage.attach(self.colorscheme, 1, 2, 2, 1)
        self.wpage.attach(self.set_button, 3, 1, 1, 1)
        self.wpage.attach(self.add_button, 3, 2, 2, 1)
        self.wpage.attach(self.rm_button, 4, 1, 1, 1)
        self.wpage.attach(self.preview, 1, 3, 4, 1)
        self.wpage.attach(self.sample, 1, 4, 4, 1)
        self.add_button.connect('clicked', self.on_add_clicked)
        self.set_button.connect('clicked', self.on_set_clicked)
        self.rm_button.connect('clicked', self.on_rm_clicked)
        self.option_combo.connect('changed', self.combo_box_change)
        self.colorscheme.connect('changed', self.colorscheme_box_change)
        self.entry = Gtk.Entry()
        self.current_walls = Gtk.ComboBox()

        if current_idx is not None:
            self.option_combo.set_active(current_idx)
            self.colorscheme.set_active(current_idx)
            self.cpage.option_combo.set_active(current_idx)
            self.set_button.set_sensitive(True)

    def on_add_clicked(self, widget):
        filechooser = Gtk.FileChooserDialog(
                      'Select an Image', self,
                      Gtk.FileChooserAction.OPEN,
                      (Gtk.STOCK_CANCEL, Gtk.ResponseType.CANCEL,
                       Gtk.STOCK_OPEN, Gtk.ResponseType.OK))

        filechooser.set_select_multiple(True)
        filefilter = Gtk.FileFilter()
        filefilter.set_name("Images")
        filefilter.add_mime_type("image/png")
        filefilter.add_mime_type("image/jpg")
        filefilter.add_mime_type("image/jpeg")
        filechooser.add_filter(filefilter)
        response = filechooser.run()

        if response == Gtk.ResponseType.OK:
            for f in filechooser.get_filenames():
                themer.create_theme(f)
            option_list = Gtk.ListStore(str)
            for elem in list(files.get_file_list()):
                option_list.append([elem])
            self.option_combo.set_model(option_list)
            self.option_combo.set_entry_text_column(0)
            self.colorscheme.set_model(option_list)
            self.colorscheme.set_entry_text_column(0)
            self.cpage.update_combo(option_list)
        filechooser.destroy()

    def on_set_clicked(self, widget):
        x = self.option_combo.get_active()
        y = self.colorscheme.get_active()
        current_walls = files.get_file_list()
        if current_walls:
            filename = current_walls[x]
            colorscheme_file = current_walls[y]
            themer.set_theme(filename, colorscheme_file)

    def on_rm_clicked(self, widget):
        x = self.option_combo.get_active()
        current_walls = files.get_file_list()
        if current_walls:
            filename = current_walls[x]
            themer.delete_theme(filename)
            option_list = Gtk.ListStore(str)
            for elem in list(files.get_file_list()):
                option_list.append([elem])
            self.option_combo.set_model(option_list)
            self.option_combo.set_entry_text_column(0)
            self.colorscheme.set_model(option_list)
            self.colorscheme.set_entry_text_column(0)
            self.cpage.update_combo(option_list)

    def combo_box_change(self, widget):
        self.set_button.set_sensitive(True)
        x = self.option_combo.get_active()
        self.colorscheme.set_active(x)
        selected_file = files.get_file_list()[x]
        filepath = os.path.join(WALL_DIR, selected_file)

        self.pixbuf_preview = GdkPixbuf.Pixbuf.new_from_file_at_scale(
            str(filepath),
            width=500,
            height=333,
            preserve_aspect_ratio=False)
        self.preview.set_from_pixbuf(self.pixbuf_preview)

    def colorscheme_box_change(self, widget):
        x = self.colorscheme.get_active()

        # set the ComboBox in color_grid
        self.cpage.set_edit_combo(x)


def run(args):
    win = mainWindow(args)
    win.connect('delete-event', Gtk.main_quit)
    win.show_all()
    Gtk.main()


if __name__ == '__main__':
    run()