# -*- coding: utf-8 -*-
"""
Écran de démarrage minwii.

$Id$
$URL$
"""
from pgu.gui import Table
from pgu.gui import Spacer
from pgu.gui import Label
from pgu.gui import Button
from pgu.gui import Switch
from pgu.gui import Radio
from pgu.gui import Group
from pgu.gui import Select
from pgu.gui import CLICK
from pgu.gui import QUIT
from pgu.gui import CHANGE
import pygame
from minwii.globals import PLAYING_MODES
from songfilebrowser import FileOpenDialog
import os.path

STYLE_LEFT_COL = {#'border_right' : 2,
                  #'border_left' : 2,
                  'align' : 1,
                  'padding_top' : 30,
                  'padding_right' : 10}

STYLE_RIGHT_COL = {#'border_right' : 2,
                   #'border_left' : 2,
                   'align' : -1,
                   'padding_top' : 30,
                   'padding_left' : 20}


class Home(Table) :
    """
    Écran de démarrage de minwii
    """
    
    def __init__(self,**params):
        style = {'valign' : 0,
                 'width' : pygame.display.get_surface().get_width(),
                 'height' : pygame.display.get_surface().get_height()}
        params['style'] = style
        Table.__init__(self,**params)
        self.songPath = params.get('songPath', '.')
        self.nwiimotes = params.get('nwiimotes', 0)
        self.songFile = params.get('songFile', '')
        self.spaceSize = (100,100)
        self.font = pygame.font.Font(None,90)
        self._fill()
        self.selectedPlayMode = params.get('playMode', 'NORMAL')
        self.displayNotes = params.get('displayNotes', True)
        self.selectedWiimoteIndex = params.get('wiimoteIndex', 0)
        self.exitApp = False
        self._initLocalListeners()


    def _fill(self):
        # bouton pour browser de fichiers
        self.tr()
        st = STYLE_LEFT_COL.copy()
        st['valign'] = -1
        self.td(self.createLabel("Chanson :"), rowspan=2, style = st)
        self.browseButton = Button(self.createLabel("Choisir..."))
        self.td(self.browseButton,colspan=2, style = STYLE_RIGHT_COL)

        self.tr()
        caption = '' if not self.songFile else FileOpenDialog.getSongTitle(self.songFile)
        self.songTitle = self.createLabel(caption, font=pygame.font.Font(None,60))
        st = STYLE_RIGHT_COL.copy()
        del st['padding_top']
        self.td(self.songTitle, style = st)

        # choix du mode de jeu
        self.tr()
        self.td(self.createLabel("Mode :"), style=STYLE_LEFT_COL)
        self.modeSelect = Select('NORMAL')
        for k, caption in PLAYING_MODES :
            self.modeSelect.add(self.createLabel(caption), k)
        self.td(self.modeSelect,colspan=3, style=STYLE_RIGHT_COL)
        
        # affichage / masquage des noms de notes
        self.tr()
        self.td(self.createLabel("Notes :"), style=STYLE_LEFT_COL)
        self.displayNotesSelect = Select(True)
        for k, caption in ((True, 'Oui'), (False, 'Non')) :
            self.displayNotesSelect.add(self.createLabel(caption), k)
        self.td(self.displayNotesSelect, style=STYLE_RIGHT_COL)
        

        # choix des wiimotes
        self.tr()
        self.td(self.createLabel("Wiimote :", self.font), style=STYLE_LEFT_COL)
        playerTable = Table()
        
        self.selectedWiimote = Group(name='selectedWiimote', value=0)
        for i in range(self.nwiimotes - 1):
            r = Radio(self.selectedWiimote, i)
            playerTable.td(r)
            playerTable.td(self.createLabel(" %d " % (i+1)))
        self.td(playerTable, style=STYLE_RIGHT_COL)

        # boutons jouer / quitter
        self.tr()
        self.quitButton = Button(self.createLabel("Quitter"))
        self.td(self.quitButton, style={'padding_top' : 50})
        self.playButton = Button(self.createLabel("Jouer"))
        self.td(self.playButton, style={'padding_top' : 50})
    
    @property
    def selectedPlayMode(self) :
        return self.modeSelect.value
    
    @selectedPlayMode.setter
    def selectedPlayMode(self, value) :
        self.modeSelect.value = value
        if self.selectedPlayMode != 'IMPRO' and \
           not self.songFile :
            self.playButton.disabled = True
        else :
            self.playButton.disabled = False
    
    @property
    def displayNotes(self) :
        return self.displayNotesSelect.value
    
    @displayNotes.setter
    def displayNotes(self, value) :
        self.displayNotesSelect.value = value
    
    @property
    def selectedWiimoteIndex(self) :
        return self.selectedWiimote.value

    @selectedWiimoteIndex.setter
    def selectedWiimoteIndex(self, value) :
        self.selectedWiimote.value = value
    
    def _initLocalListeners(self) :
        self.browseButton.connect(CLICK, self.open_file_browser)
        self.quitButton.connect(CLICK, self._exitApp)
        self.playButton.connect(CLICK, self._exitHome)
        self.modeSelect.connect(CHANGE, self._changeModeCB)
    
    def _changeModeCB(self) :
        if self.selectedPlayMode == 'IMPRO' :
            self.playButton.disabled = False
        elif not self.songFile :
            self.playButton.disabled = True
    
    def _exitApp(self, data=None) :
        self.exitApp = True
        self.send(QUIT)
    
    def _exitHome(self, data=None) :
        self.exitApp = False
        self.send(QUIT)
    
    def createLabel(self,text,font = None):
        if font == None :
            font = self.font
        w,h = self.font.size(text)
        label = Label(text,width=w,height=h,font = font)
        return(label)
    
    def open_file_browser(self):
        dlg = FileOpenDialog(self.songPath)
        dlg.connect(CHANGE, self.handle_file_browser_closed, dlg)
        dlg.open()
    
    def handle_file_browser_closed(self, dlg) :
        if dlg.value and os.path.isfile(dlg.value):
            self.remove(self.songTitle)
            title = FileOpenDialog.getSongTitle(dlg.value)
            self.songTitle = self.createLabel(title, font= pygame.font.Font(None,60))
            self.td(self.songTitle, col=1, row=1, style=STYLE_RIGHT_COL)
            self.songFile = dlg.value
            self.playButton.disabled = False
    

    