'''
Created on 12 nov. 2009

@author: Samuel Benveniste
'''
from logging.FamiliarizerLog import FamiliarizerLog

import os
import sys
import subprocess

import pygame
import pygame.midi
import pickle

from pygame.locals import *

from pgu import gui

from StaticFamiliarizer import StaticFamiliarizer
from SongFamiliarizer import SongFamiliarizer
from instruments.Instrument import Instrument
from cursor.WarpingCursor import *
from controllers.Wiimote import Wiimote
from logging.FamiliarizerLog import FamiliarizerLog
from songs.Song import Song
from constants import *
from SongPlayingScreen import SongPlayingScreen
from DummyInstrumentChoice import DummyInstrumentChoice

class FamiliarizerPGUConfiguration(gui.Desktop):
    '''
    classdocs
    '''


    def __init__(self,window,defaultParams = False):
        '''
        Constructor
        '''
        gui.Desktop.__init__(self)
        self.done = False
        self.level = 0
        self.scale = scaleDict["majorScale"]
        self.fileName = fileName
        self.log = None
        self.activeWiimotes = [False for i in range(4)]    
        
        pygame.font.init()

        self.titleFont = pygame.font.Font(None,100)
        self.font = pygame.font.Font(None,70)
        self.spaceSize = (100,100)
        
        self.goButton = gui.Button(self.createLabel("Go"))
        self.goButton.connect(gui.CLICK,self.goButtonClicked,None)
        
        self.quitButton = gui.Button(self.createLabel("Fin"))
        self.quitButton.connect(gui.CLICK,self.quitButtonClicked,None)
        
        self.levelSelect = gui.Select()
        for i in range(3) :
            self.levelSelect.add(self.createLabel(str(i+1)),i)
        self.levelSelect.connect(gui.CHANGE,self.levelSelectChanged,None)
        
        self.activeWiimoteSwitches = [gui.Switch(False) for i in range(4)]
        for i in range(len(self.activeWiimoteSwitches)) :
            self.activeWiimoteSwitches[i].connect(gui.CHANGE,self.activeWiimoteSwitchesChanged,i)   
        
        self.connect(gui.QUIT,self.quit,None)
        
        self.window = window
        
        ##The table code is entered much like HTML.
        ##::
        mainContainer = gui.Table() 
        
        c = gui.Table()
                
#        c.tr()
#        c.td(self.createLabel("MINWii",self.titleFont),colspan = 4)
        
        c.tr()
        c.td(gui.Spacer(*self.spaceSize))
        
        c.tr()
        c.td(self.createLabel("Niveau :"))
        c.td(self.levelSelect,colspan=3)
        
        c.tr()
        c.td(gui.Spacer(*self.spaceSize))
        
        c.tr()
        c.td(self.createLabel("Joueurs :", self.font))
        playerTable = gui.Table()
        for i in range(len(self.activeWiimoteSwitches)):
            playerTable.td(self.createLabel(" " + str(i+1)+" ", self.font))
            playerTable.td(self.activeWiimoteSwitches[i])
        c.td(playerTable,colspan = 3)
            
        c.tr()
        c.td(gui.Spacer(*self.spaceSize))
        
        c.tr()
        c.td(self.goButton)
        c.td(self.quitButton,colspan=3)        
        
        c.tr()
        c.td(gui.Spacer(500,500))
        
        mainContainer.add(c,0,0)
        
        if defaultParams :
            self.goButtonClicked()
        else :
            self.run(mainContainer)
        
    def open_file_browser(self,data=None):
        d = gui.FileDialog()
        d.connect(gui.CHANGE, self.handle_file_browser_closed, d)
        d.open()
    

    def handle_file_browser_closed(self,dlg):
        if dlg.value:
            self.file = dlg.value
            
    def createLabel(self,text,font = None):
        if font == None :
            font = self.font
        w,h = self.font.size(text)
        label = gui.Label(text,width=w,height=h,font = font)
        return(label)
    
    def levelSelectChanged(self,data=None):
        self.level = self.levelSelect.value
    
    def quitButtonClicked(self,data = None):
        self.done = True
        self.quit()
        
    def activeWiimoteSwitchesChanged(self,data = None):
        if self.activeWiimoteSwitches[data].value :
            for i in range(len(self.activeWiimoteSwitches)) :
                if self.activeWiimoteSwitches[i].value and data != i :
                    self.activeWiimoteSwitches[i].click()                
        for i in range(len(self.activeWiimoteSwitches)) :
            self.activeWiimotes[i] = self.activeWiimoteSwitches[i].value
    
    def hasActiveWiimote(self):
        hasActive = False
        for active in self.activeWiimotes :
            if active :
                hasActive = True
                break
        return(hasActive)
        

                    
        
    def goButtonClicked(self,data = None):        
        
        pygame.midi.init()
        instruments = [Instrument(self.scale, i + 1, "".join(["../instruments/instrumentImages/", instrumentImagePathList[i], ".jpg"]), octaves[i]) for i in range(9)]
        
        joys = [[id,pygame.joystick.Joystick(id).get_name()] for id in range(pygame.joystick.get_count())]
        for joy in joys:
            if joy[1] in joyNames:
                pygame.joystick.Joystick(joy[0]).init() 
        
        ports = [pygame.midi.get_device_info(id)[1] for id in range(pygame.midi.get_count())]
        portOffset = ports.index(portNames[0])
        print(portOffset)
        
        screen = pygame.display.get_surface()
        clock = pygame.time.Clock()        
        cursorImages=[['../cursor/cursorImages/black/10.png'],['../cursor/cursorImages/red/10.png'],['../cursor/cursorImages/blue/10.png'],['../cursor/cursorImages/green/10.png']]
        durations = [75 for i in range(len(cursorImages))]
        
        extsc = True
        casc = False
        easyMode = True
        
        song = Song(scaleDict["majorScale"],[3,9,6,4,1,8,5,7,2,10],True)

        wiimoteCount = 4
        
        cursors = [WarpingCursor(None, cursorImages[i], durations, (300 * i, 300 * i),'../cursor/cursorImages/black/flash.png') for i in range(wiimoteCount)]
        wiimotes = [Wiimote(i, i + portOffset, None, instruments[0], cursors[i]) for i in range(wiimoteCount)]
        dummyInstrumentChoice = DummyInstrumentChoice(wiimotes, self.window, screen, clock, joys, portOffset, self.activeWiimotes)
        if not self.hasActiveWiimote():
            self.activeWiimotes[0] = True
        if self.level < 2 :
            familiarize = StaticFamiliarizer(wiimotes, self.window, screen, clock, joys, portOffset,self.activeWiimotes,level = self.level)
        elif familiarize.nextLevel == 2 :
            familiarize = SongFamiliarizer(wiimotes, self.window, screen, clock, joys, portOffset,song,self.activeWiimotes,casc,extsc,easyMode)
        else :
            familiarize = SongPlayingScreen(dummyInstrumentChoice,songDict["clairdelalune"],easyMode = True)
                        
        while familiarize.nextLevel != None :
            if familiarize.nextLevel < 2 :
                familiarize = StaticFamiliarizer(wiimotes, self.window, screen, clock, joys, portOffset,self.activeWiimotes,level = familiarize.nextLevel,eventLog = familiarize.eventLog)
            elif familiarize.nextLevel == 2 :
                familiarize = SongFamiliarizer(wiimotes, self.window, screen, clock, joys, portOffset,song,self.activeWiimotes,casc,extsc,easyMode,eventLog = familiarize.eventLog)
            else :
                familiarize = SongPlayingScreen(dummyInstrumentChoice,songDict["clairdelalune"],easyMode = True,eventLog = familiarize.eventLog)
            
        for wiimote in wiimotes:
            del wiimote.port            
        
        pygame.midi.quit()
        
        i = 1        
        filePath = "".join([self.fileName,str(i),".fmwi"])        
        while os.path.exists(filePath):
            i += 1
            filePath = "".join([self.fileName,str(i),".fmwi"])
        
        f = file(filePath, 'w')
        self.log = FamiliarizerLog(familiarize.eventLog,self.level,self.activeWiimotes)
        pickler = pickle.Pickler(f)
        pickler.dump(self.log)
        
        f.close()
        
        self.repaint()
        
if __name__ == "__main__" :
    pygame.init()
    modeResolution = (1024,768)
    window = pygame.display.set_mode(modeResolution,pygame.FULLSCREEN)
    familiarizer = FamiliarizerPGUConfiguration(window)
    pygame.quit()   
        
        
        
        