'''
Created on 25 janv. 2010

@author: Samuel Benveniste
'''

import pygame
import pickle

from pgu import gui as pguGui

from gui import constants

from instruments.Instrument import Instrument
from songs.Song import Song
from cursor.WarpingCursor import *
from gui.StaticFamiliarizer import StaticFamiliarizer
from gui.SongFamiliarizer import SongFamiliarizer
from gui.SongPlayingScreen import SongPlayingScreen
from gui.DummyInstrumentChoice import DummyInstrumentChoice
from controllers.Wiimote import Wiimote

class LogPGUPlayer(pguGui.Desktop):
    '''
    classdocs
    '''


    def __init__(self,rate):
        '''
        Constructor
        '''
        self.firstStepDurations = []
        self.firstStepClicks = []
        self.firstStepClicksIn = []
        
        self.secondStepDurations = []
        self.secondStepClicks = []
        self.secondStepClicksIn = []
        
        self.thirdStepDurations = []
        self.thirdStepClicks = []
        self.thirdStepClicksIn = []
        
        self.songDurations = []
        self.songClicks = []
        self.songClicksIn = []
        self.songClicksPerMinute = []
        self.songClicksInPerMinute = []
        self.songTotalDurations = []
        
        self.meanTimeBetweenNotes = []
        
        pguGui.Desktop.__init__(self)
        
        self.replayRate = rate
        #pguGui.theme.load('../data/themes/default')
        
        self.connect(pguGui.QUIT,self.quit,None)
        
        main = pguGui.Container(width=500, height=400) #, background=(220, 220, 220) )
        
        
        main.add(pguGui.Label("File Dialog Example", cls="h1"), 20, 20)
        
        
        td_style = {'padding_right': 10}
        t = pguGui.Table()
        t.tr()
        t.td( pguGui.Label('File Name:') , style=td_style )
        self.input_file = pguGui.Input()
        t.td( self.input_file, style=td_style )
        self.browseButton = pguGui.Button("Browse...")
        t.td( self.browseButton, style=td_style )
        self.browseButton.connect(pguGui.CLICK, self.open_file_browser, None)
        
        self.goButton = pguGui.Button("Go")
        
        self.goButton.connect(pguGui.CLICK, self.goButtonClicked,None)
        
        self.quitButton = pguGui.Button("Fin")
        self.quitButton.connect(pguGui.CLICK,self.quit,None)
        
        t.td( self.browseButton, style=td_style )
        t.td( self.goButton, style=td_style )
        t.td( self.quitButton, style=td_style )
        
        main.add(t, 20, 100)
        
        self.run(main)
        #import profile
        #profile.run('app.run(main)')
        
    def open_file_browser(self,data=None):
        d = pguGui.FileDialog(path = "../../../saves")
        d.connect(pguGui.CHANGE, self.handle_file_browser_closed, d)
        d.open()
        
    
    def handle_file_browser_closed(self,dlg):
        if dlg.value: self.input_file.value = dlg.value
    
    def goButtonClicked(self,data=None):
        if self.input_file.value.endswith(".fmwi"):
            f = file(self.input_file.value, 'r')
            unpickler = pickle.Unpickler(f)
            log = unpickler.load()
            f.close()
            
            log.eventLog.setReplayRate(self.replayRate)
        
            pygame.midi.init()
            instruments = [Instrument(log.scale, i + 1, "".join(["../instruments/instrumentImages/", constants.instrumentImagePathList[i], ".jpg"]), constants.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 constants.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(constants.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(constants.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, window, screen, clock, joys, portOffset, log.activeWiimotes)
            if log.level < 2 :
                familiarize = StaticFamiliarizer(wiimotes, window, screen, clock, joys, portOffset,log.activeWiimotes,level = log.level,eventLog = log.eventLog,replay = True)
                self.fillStaticFamiliarizerStats(familiarize)
            elif log.level == 2 :
                familiarize = SongFamiliarizer(wiimotes, window, screen, clock, joys, portOffset,song,log.activeWiimotes,casc,extsc,easyMode,eventLog = log.eventLog,replay = True)
                self.fillSongFamiliarizerStats(familiarize)
            else :
                familiarize = SongPlayingScreen(dummyInstrumentChoice,constants.songDict["clairdelalune"],easyMode = True,eventLog = log.eventLog,replay = True)
                self.fillSongStats(familiarize)            
            
            while familiarize.nextLevel != None :
                if familiarize.nextLevel < 2 :
                    familiarize = StaticFamiliarizer(wiimotes, window, screen, clock, joys, portOffset,log.activeWiimotes,level = familiarize.nextLevel,eventLog = familiarize.eventLog,replay = True)
                    self.fillStaticFamiliarizerStats(familiarize)
                elif familiarize.nextLevel == 2 :
                    familiarize = SongFamiliarizer(wiimotes, window, screen, clock, joys, portOffset,song,log.activeWiimotes,casc,extsc,easyMode,eventLog = familiarize.eventLog,replay = True)
                    self.fillSongFamiliarizerStats(familiarize)
                else :
                    familiarize = SongPlayingScreen(dummyInstrumentChoice,constants.songDict["clairdelalune"],easyMode = True,eventLog = familiarize.eventLog,replay = True)
                    self.fillSongStats(familiarize)
                    
            for wiimote in wiimotes:
                del wiimote.port            
            
            pygame.midi.quit()
            self.printStatsToFile()
            
    def fillStaticFamiliarizerStats(self,familiarizer):
        if familiarizer.level == 0 :
            self.firstStepClicks.append(familiarizer.clicks)
            self.firstStepClicksIn.append(familiarizer.clicksIn)
            self.firstStepDurations.append(familiarizer.duration)
            
        if familiarizer.level == 1 :
            self.secondStepClicks.append(familiarizer.clicks)
            self.secondStepClicksIn.append(familiarizer.clicksIn)
            self.secondStepDurations.append(familiarizer.duration)
            
    def fillSongFamiliarizerStats(self,familiarizer):
        self.thirdStepClicks.append(familiarizer.clicks)
        self.thirdStepClicksIn.append(familiarizer.clicksIn)
        self.thirdStepDurations.append(familiarizer.duration)
        
    def fillSongStats(self,familiarizer):
        self.songClicks.append(familiarizer.clicks)
        self.songClicksIn.append(familiarizer.clicksIn)
        self.songClicksPerMinute.append(familiarizer.clicksPerMinute)
        self.songClicksInPerMinute.append(familiarizer.clicksInPerMinute)
        self.songDurations.append(familiarizer.songDurations)
        self.songTotalDurations.append(familiarizer.totalDuration)
        
    def statsToFormattedString(self):
        return("First step durations :\n"+"\n"+
                   str(self.firstStepDurations)+"\n"+"\n"+
                   "First step clicks :\n"+"\n"+
                   str(self.firstStepClicks)+"\n"+"\n"+
                   "First step clicksIn :\n"+"\n"+
                   str(self.firstStepClicksIn)+"\n"+"\n"+
                   "Second step durations :\n"+"\n"+
                   str(self.secondStepDurations)+"\n"+"\n"+
                   "Second step clicks :\n"+"\n"+
                   str(self.secondStepClicks)+"\n"+"\n"+
                   "Second step clicksIn :\n"+"\n"+
                   str(self.secondStepClicksIn)+"\n"+"\n"+
                   "Third step durations :\n"+"\n"+
                   str(self.thirdStepDurations)+"\n"+"\n"+
                   "Third step clicks :\n"+"\n"+
                   str(self.thirdStepClicks)+"\n"+"\n"+
                   "Third step clicksIn :\n"+"\n"+
                   str(self.thirdStepClicksIn)+"\n"+"\n"+
                   "song durations :\n"+"\n"+
                   str(self.songDurations)+"\n"+"\n"+
                   "song clicks :\n"+"\n"+
                   str(self.songClicks)+"\n"+"\n"+
                   "song clicksIn :\n"+"\n"+
                   str(self.songClicksIn)+"\n"+"\n"+
                   "song clicks per minute:\n"+"\n"+
                   str(self.songClicksPerMinute)+"\n"+"\n"+
                   "song clicksIn per minute :\n"+"\n"+
                   str(self.songClicksInPerMinute)+"\n"+"\n"+
                   "song total durations :\n"+"\n"+
                   str(self.songTotalDurations)+"\n"+"\n")
        
    def printStatsToFile(self,path=None):
        if path == None :
            path = self.input_file.value.replace(".fmwi",".txt")
        file = open(path,"w")
        file.write("Log ID : "+self.input_file.value+"\n"+"\n")
        file.write(self.statsToFormattedString())
        file.close()
                    
if __name__ == "__main__":
    pygame.init()
    modeResolution = (1024,768)
    window = pygame.display.set_mode(modeResolution,pygame.FULLSCREEN)
    logConfig = LogPGUPlayer(10000)
    pygame.quit()
    