#!/usr/bin/python
# -*- coding: utf-8 -*-
#
# A GTK Python GO client

import sys
sys.path.append('lib/')
sys.path.append('widgets/')
sys.path.append('gomill/')

import goban
import config
import gtk, gtk.glade, gobject
import gogame


class Pygo():
    """This class handles the main interface, defines basic callbacks"""
    
    def __init__(self):
        self.resize = True
        self.go_game = None

        self.init_user_interface('./ui/default.glade')
        self.init_widgets()


    def init_user_interface(self, path_to_skin):
        self.tree=gtk.glade.XML(path_to_skin, "window")
        self.tree.signal_autoconnect(self)
        self.window = self.tree.get_widget('window')
        self.contents = self.tree.get_widget('main_box')
        self.games = self.tree.get_widget('games')


    def init_widgets(self):
        self.window.resize(800,600)
        # gobject.timeout_add(1000, self.update)


    # fixme - ctrl+shift+tab just does a shift+tab, even with the return True...
    def on_key_pressed(self, widget, event):
        key = gtk.gdk.keyval_name(event.keyval)

        if key == 'Tab' and event.state & gtk.gdk.CONTROL_MASK:
            if event.state & gtk.gdk.SHIFT_MASK:
                self.do_prev_page()
            else:
                self.do_next_page()

            return True


    def on_game_save(self, widget):
        print 'stub: Pygo.on_game_save()'


    def on_game_save_as(self, widget):
        print 'stub: Pygo.on_game_save_as()'


    def on_game_close(self, widget):
        if self.games.get_current_page() == -1:
            return

        self.games.remove_page(self.games.get_current_page())


    def on_local_new(self, widget):
        game = gogame.GoGame(goban.Goban())
        self._add_game(game, 'Local Game')

        
    def on_local_load_sgf(self, widget):
        dialog = gtk.FileChooserDialog(title='Choose SGF File', action=gtk.FILE_CHOOSER_ACTION_OPEN,
                                        buttons=(gtk.STOCK_CANCEL,gtk.RESPONSE_CANCEL,gtk.STOCK_OPEN,gtk.RESPONSE_OK))

        dialog.set_default_response(gtk.RESPONSE_OK)

        # fixme - add filters and such?

        resp = dialog.run()
        
        if resp == gtk.RESPONSE_OK:
            game = gogame.GoGame(goban.Goban(file_name=dialog.get_filename()))
            self._add_game(game, 'Loaded SGF') # fixme - put something more interesting in the label

        dialog.destroy()


    def _add_game(self, game, label):
        self.games.append_page(game, gtk.Label(label))
        self.games.set_tab_reorderable(game, True)
        game.show_all()
        game.winner_box.hide()
        

    def on_net_direct(self, widget):
        print 'stub: Pygo.on_net_direct()'


    def on_quit(self, widget):
        sys.exit(0)


    def do_prev_page(self):
        '''Goes to the previous tab page, but looping if this is the first'''
        if self.games.get_current_page() == -1:
            return

        new_page = self.games.get_current_page() - 1
        if new_page < 0:
            new_page = self.games.get_n_pages() - 1

        self.games.set_current_page(new_page)


    def do_next_page(self):
        '''Goes to the next tab page, but looping if this is the last'''
        if self.games.get_current_page() == -1:
            return

        new_page = self.games.get_current_page() + 1
        if new_page >= self.games.get_n_pages():
            new_page = 0

        self.games.set_current_page(new_page)


def main():
    # Read config file
    config.init()

#    base_icon = gtk.gdk.pixbuf_new_from_file('ui/icon.svg')
#    icon = base_icon.scale_simple(128, 128, gtk.gdk.INTERP_BILINEAR)
#    gtk.window_set_default_icon(icon)
    go_obj = Pygo()

# Let's see if we can avoid using threads in this implementation
#    gtk.gdk.threads_init()
#    gtk.gdk.threads_enter()
    gtk.main()
#    gtk.gdk.threads_leave()    


if __name__ == '__main__': main()