# -*- coding: latin-1 -*-
# GNU GPL
# Program Par Jean-François Roche <jfroche@jfroche.be>
# For more informations do not hesitate to send email.
from wxPython.wx import *
from wxPython.gizmos import *
import time
import sys
import os
import traceback

ID_ABOUT = 7

genre_list = ['Comedie','Drame','Comedie Dramatique','Science Fiction','Action',
              'Aventure','Film Policier','Film pour Enfants','Documentaire']

class edit_frame(wxDialog):
    ID_LISTBOX = 10006
    ID_TEXT = 10007
    ID_TEXTCTRL = 19233
    ID_BUTTON = 13344
    ID_CHOICE = 13333
    def __init__(self,parent,right,divx):
        wxDialog.__init__(self, parent, 134,'Edition du film ',
                          wxDefaultPosition,(750,400),style=wxDIALOG_MODAL |
                                                      wxDEFAULT_DIALOG_STYLE| wxRESIZE_BORDER )
        self.Centre()
        self.parent = right
        self.divx = divx
        self.SetReturnCode(666)
  #        wxFrame.__init__(self,parent.parent, 134, 'test')
        panel = wxPanel(self, -1)
        self.divx = divx
        self.formular()
        self.edited = 0
        
    def formular(self):
        item1 = wxStaticText( self, self.ID_TEXT, "Titre:", (10,10), wxDefaultSize, 0 )
        item1.SetFont( wxFont( 13, wxROMAN, wxNORMAL, wxBOLD,true ) )
        
        self.titre = wxTextCtrl( self, self.ID_TEXTCTRL, self.divx.title, (65,11), wxSize(200,-1), 0 )
        self.titre.SetFont(wxFont( 12, wxROMAN, wxNORMAL,wxNORMAL))
        self.titre.SetForegroundColour( wxRED )

        item3 = wxStaticText( self, self.ID_TEXT, "Realisateur:", (10,40), wxDefaultSize, 0 )
        item3.SetFont( wxFont( 13, wxROMAN, wxNORMAL, wxBOLD ) )
        
        self.realisateur = wxTextCtrl( self, self.ID_TEXTCTRL, self.divx.realisateur, (110,40), wxSize(200,-1), 0 )
        self.realisateur.SetFont(wxFont( 12, wxROMAN, wxNORMAL,wxNORMAL))
        
        item5 = wxStaticText( self, self.ID_TEXT, "Date de sortie:", (10,70), wxDefaultSize, 0 )
        item5.SetFont( wxFont( 13, wxROMAN, wxNORMAL, wxBOLD ) )
        
        self.date = wxTextCtrl( self, self.ID_TEXTCTRL, self.divx.date_sortie, (120,71), wxSize(120,-1), 0 )
        self.date.SetFont(wxFont( 12, wxROMAN, wxNORMAL,wxNORMAL))
        
        item7 = wxStaticText( self, self.ID_TEXT, "Duree:", (10,100), wxDefaultSize, 0 )
        item7.SetFont( wxFont( 13, wxROMAN, wxNORMAL, wxBOLD ) )
        
        self.minut = wxTextCtrl(self, self.ID_TEXTCTRL, self.divx.mins, (65,100), wxSize(36,-1), 0 )
        self.minut.SetMaxLength(3)
        self.minut.SetFont(wxFont( 12, wxROMAN, wxNORMAL,wxNORMAL))

        item10 = wxStaticText( self, self.ID_TEXT, ":", (95,100), wxDefaultSize, 0 )
        item10.SetFont( wxFont( 13, wxROMAN, wxNORMAL, wxBOLD ) )
        
        self.second = wxTextCtrl( self, self.ID_TEXTCTRL, self.divx.secs, (100,100), wxSize(30,-1), 0 )
        self.second.SetMaxLength(2)
        self.second.SetFont(wxFont( 12, wxROMAN, wxNORMAL,wxNORMAL))

       # item12 = wxStaticText( self, self.ID_TEXT, "Acteurs:", (10,130), wxDefaultSize, 0 )
       # item12.SetFont( wxFont( 13, wxROMAN, wxNORMAL, wxBOLD ) )

        #self.acteur = wxTextCtrl( self, self.ID_TEXT,"", (75,130), wxSize(100,-1), 0 )
        #self.acteur.SetFont(wxFont( 12, wxROMAN, wxNORMAL,wxNORMAL))
        self.acteur = wxEditableListBox(self, -1, "Liste des acteurs",(10,130), (250, 100))
        self.acteur.SetStrings(self.divx.acteur)

        item15 = wxStaticText( self, self.ID_TEXT, "Genre:", (10,240), wxDefaultSize, 0 )
        item15.SetFont( wxFont( 13, wxROMAN, wxNORMAL, wxBOLD ) )
        self.genre = wxChoice( self, self.ID_CHOICE, (70,240), wxSize(160,-1),genre_list, 0 )
        self.genre.SetSelection(int(self.divx.genre))
        
        item14 = wxStaticText( self, self.ID_TEXT, "Qualite:", (10,265), wxDefaultSize, 0 )
        item14.SetFont( wxFont( 13, wxROMAN, wxNORMAL, wxBOLD ) )

     #   self.qualite = wxTextCtrl( self, self.ID_TEXT,"",(75,160), wxSize(100,-1), 0 )
     #   self.qualite.SetFont(wxFont( 12, wxROMAN, wxNORMAL,wxNORMAL))
        self.qualite = wxChoice( self, self.ID_CHOICE, (75,265), wxSize(120,-1),
                                 ['Moins bonne qualite',u'Qualité Moyenne',u'Très Bonne qualite'], 0 )
        self.qualite.SetSelection(self.divx.qualite)

        item16 = wxStaticText( self, self.ID_TEXT, "Vu par:", (10,292), wxDefaultSize, 0 )
        item16.SetFont( wxFont( 13, wxROMAN, wxNORMAL, wxBOLD ) )
        
      #  self.vupar = wxTextCtrl( self, self.ID_TEXT, "",(72,190), wxDefaultSize, 0 )
     #   self.vupar.SetFont(wxFont( 12, wxROMAN, wxNORMAL,wxNORMAL))
        self.vu_par =  wxCheckListBox(self, 60, (70, 292), wxSize(70, 70), ['maman','papa','ben','jfr'])
        for elem in self.divx.vupar:
            if(elem == 'maman'):
                self.vu_par.Check(0)
            elif(elem == 'papa'):
                self.vu_par.Check(1)
            elif(elem == 'ben'):
                self.vu_par.Check(2)
            elif(elem == 'jfr'):
                self.vu_par.Check(3)

        item18 = wxStaticText( self, self.ID_TEXT, "Description:",(350,50), wxDefaultSize, 0 )
        item18.SetFont( wxFont( 13, wxROMAN, wxNORMAL, wxBOLD ) )
        
        self.description = wxTextCtrl( self, self.ID_TEXT, self.divx.description, (350,80),
                                       wxSize(350,200), wxTE_MULTILINE )
        
        self.button = wxButton(self,self.ID_BUTTON,"Save Changes",(300,320),wxDefaultSize,0)
        EVT_BUTTON(self,self.ID_BUTTON, self.save_divx_changes)
     #   EVT_CLOSE(self,self.quit)
        
    #def quit(self,event):
    #    self.Close(true) 

    def save_divx_changes(self,event):
        self.divx.title = self.titre.GetValue()
        self.divx.realisateur = self.realisateur.GetValue()
        self.divx.date_sortie = self.date.GetValue()
        self.divx.mins = self.minut.GetValue()
        self.divx.secs = self.second.GetValue()
        self.divx.acteur =  self.acteur.GetStrings()
        self.divx.qualite = int(self.qualite.GetSelection())
        self.divx.genre = self.genre.GetSelection()
        list_vu = []
        for item in range(self.vu_par.GetCount()):
            if(self.vu_par.IsChecked(item)):
                list_vu.append(self.vu_par.GetString(item))
                #print self.vu_par.GetString(item)
        self.divx.vupar = list_vu
        self.divx.description = self.description.GetValue()
        self.parent.update_db_edited(self.divx)

    def OnCloseWindow(self, event):
        self.Destroy()

class divx_item:
    id = 0
    title = ''
    mins = ''
    secs = ''
    realisateur = ''
    date_sortie = ''
    genre = 0
    acteur = ['']
    qualite = 2  # 2 est la meilleur qualité
    vupar = []
    description = ''
    def __init__(self):
        acteur = []
        vupar = []
    def __del__(self):
        acteur = []
        vupar = []
    def give_all(self):
        list = []
        list.append(self.id)
        list.append(self.title)
        list.append(self.mins)
        list.append(self.secs)
        list.append(self.realisateur)
        list.append(self.date_sortie)
        list.append(self.acteur)
        list.append(self.qualite)
        list.append(self.vupar)
        list.append(self.genre)
        list.append(self.description)
        return list
        
    def print_all(self):
        "print all the data"
        print 'Titre: %s' % self.title
        print 'Minutes: %s' % self.mins
        print 'Secondes: %s' % self.secs
        print 'Réalisateur: %s' % self.realisateur
        print 'Date de sortie: %s' % self.date_sortie
        print 'Acteur: %s' % self.acteur
        print 'Qualité: %d' % self.qualite 
        print 'Vu par: %s' %  self.vupar
        print 'Description: %s' % self.description
        
    def get_title(self):
        return str(self.title)

class divx_db:
    def __init__(self,location):
        self.list_divx = []
        if(location != ''):
            self.location = location
            db = open(location)
            self.db = db.readlines()
            self.parser()
        
    def parser(self):
        cpt = 0
        for line in self.db:
            if(line != ''):
                cpt = cpt+1
                #print cpt
                divx = divx_item()
                list = line.split('//')
                #print list
                try:
                    divx.id = list[0]
                    divx.title = list[1]
                    divx.mins = list[2]
                    divx.secs = list[3]
                    divx.realisateur = list[4]
                    divx.date_sortie = list[5]
                    divx.acteur = []
                    for elem in list[6].split(','):
                        divx.acteur.append(elem)
                    divx.qualite = int(list[7])
                    divx.vupar = []
                    for elem in list[8].split(','):
                      #  print elem
                        divx.vupar.append(elem)
                    divx.genre = list[9]
                    divx.description = list[10]
                except:
                    print traceback.print_exc()
                    print 'Error: Wrong data in line %d !!!' % cpt
                    continue   # on va au debut de la boucle!!
                self.list_divx.append(divx)
        self.divx_database = self
        
    def save_database(self,path):
            db = open(path,'w')
            print 'Database size: ' + str(self.get_list_size())
            if(self.list_divx != []):
                line = ''
                for divx in self.list_divx:
                    if(divx.get_title()!=''):
                        for elem in divx.give_all():
                            if(type(elem) == type('')):
                                line = line + '//' + elem
                            elif(type(elem) == type(1)):
                                line = line + '//' + str(elem)
                            else:
                                slin = ''
                                for el in elem:
                                    slin = slin + ',' + el
                                line = line + '//' + slin[1:]
                     #   line = line[2:]
                     #   print line
                        line = line[2:]
                        db.write(str(line)+'\n')
                        line = ''
            db.close()
    
    def add_new(self,divx):
        #print 'pouet 123'
        self.list_divx.append(divx)

    def get_divx_from_title(self,title):
        "return divx from the title"
        for item in self.list_divx:
            if(item.title == title):
                return item

    def get_list_size(self):
        return len(self.list_divx)
            
    def givedb(self):
        return self.list_divx
        

class LeftPart(wxSashLayoutWindow):
    ID_WINDOW_TOP          = 5101
    ID_WINDOW_BOTTOM       = 5102
    ID_TREECTRL = 10004
    ID_LISTBOX = 10006
    ID_BUTTON = 10008
    ID_TEXT = 10007
    db = ''
    def __init__(self, parent,ID=-1):
        self.parent = parent
        self.divxdb = ''
        wxSashLayoutWindow.__init__(self,
                                    parent,
                                    ID,
                                    #wxDefaultPosition,
                                    #wxSize(1600, 600),
                                    style=wxNO_BORDER|wxSW_3D
                                    )
        self.SetBackgroundColour('white')
        self.SetDefaultSize(wxSize(200, 400))                                                                                                   
        self.SetOrientation(wxLAYOUT_VERTICAL)
        self.SetAlignment(wxLAYOUT_LEFT)
        item1 = wxStaticText( self, self.ID_TEXT, "Liste des DIVX:", (10,10), wxDefaultSize, 0 )
        item1.SetFont( wxFont( 13, wxROMAN, wxNORMAL, wxBOLD,true ) )
        self.liste = wxListBox( self, self.ID_LISTBOX, (10,45), wxSize(175,500),
                                style=wxLB_SINGLE|wxLB_SORT)
        self.liste.SetFont( wxFont( 12, wxROMAN, wxNORMAL, wxNORMAL,false ) )
        self.button_add = wxButton(self,self.ID_BUTTON,"Ajouter un nouveau DIVX",(25,570),wxDefaultSize,0)
        EVT_LISTBOX(self, self.ID_LISTBOX, self.OnLeftDClick)
        EVT_BUTTON(self,self.ID_BUTTON, self.add_adivx)
               
    def newtree(self,database):
        self.db = database
        self.liste.Clear()
        self.list = []
        self.list = self.db.givedb()
        for divx in self.list:
            if(divx.get_title()!=''):
                self.liste.Append(divx.get_title())
    def add_adivx(self,event):
        new_divx = divx_item()
        self.divxdb.add_new(new_divx)
        self.parent.window_right.divx = new_divx
        self.parent.window_right.edit_adivx(new_divx)
        #new_divx.print_all()
        
    
    def OnLeftDClick(self,event):
        name = event.GetString()
        self.parent.update_right(self.db.get_divx_from_title(name))

class RightPart(wxSashLayoutWindow):
    ID_WINDOW_TOP          = 5101
    ID_WINDOW_BOTTOM       = 5102
    ID_TEXT = 10000
    ID_TEXTCTRL = 10001
    ID_CHOICE = 10002
    ID_RADIOBOX = 10003
    ID_BUTTON = 10111
    parent = 0
    t1 = NULL

    def setdivx(self,divx):
        self.divx = divx
        self.titre.SetLabel(divx.title)
        self.realisateur.SetLabel(divx.realisateur)
        self.date.SetLabel(divx.date_sortie)
        self.minut.SetLabel(divx.mins)
        self.second.SetLabel(divx.secs)
        actors = ''
        for elem in divx.acteur:
            actors = actors + elem + ', '
        actors = actors[:-2] # - 1 virgule
        self.acteur.SetLabel(actors)
        if(divx.qualite == 2):
            self.qualite.SetLabel(u'Très bonne')
        elif(divx.qualite == 1):
            self.qualite.SetLabel('Moyenne')
        else:
            self.qualite.SetLabel(u'Moins bonne qualité')
        self.genre.SetLabel(genre_list[int(divx.genre)]) 
        self.description.Clear()
        vu_par = ''
        for elem in divx.vupar:
            vu_par = vu_par + elem + ', '
        vu_par = vu_par[:-2] # - 1 virgule
        self.vupar.SetLabel(vu_par)
        self.description.WriteText(divx.description)
        
    def update_db_edited(self,divx):
        self.setdivx(divx)
        self.parent.refresh_left()


    def make_formular(self): 
        "coool"
        item1 = wxStaticText( self, self.ID_TEXT, "Titre:", (10,10), wxDefaultSize, 0 )
        item1.SetFont( wxFont( 13, wxROMAN, wxNORMAL, wxBOLD,true ) )
        
        self.titre = wxStaticText( self, self.ID_TEXTCTRL, "", (65,11), wxSize(160,-1), 0 )
        self.titre.SetFont(wxFont( 12, wxROMAN, wxNORMAL,wxNORMAL))
        self.titre.SetForegroundColour( wxRED )

        item3 = wxStaticText( self, self.ID_TEXT, "Realisateur:", (10,40), wxDefaultSize, 0 )
        item3.SetFont( wxFont( 13, wxROMAN, wxNORMAL, wxBOLD ) )
        
        self.realisateur = wxStaticText( self, self.ID_TEXTCTRL, "", (110,40), wxSize(80,-1), 0 )
        self.realisateur.SetFont(wxFont( 12, wxROMAN, wxNORMAL,wxNORMAL))
        
        item5 = wxStaticText( self, self.ID_TEXT, "Date de sortie:", (10,70), wxDefaultSize, 0 )
        item5.SetFont( wxFont( 13, wxROMAN, wxNORMAL, wxBOLD ) )
        
        self.date = wxStaticText( self, self.ID_TEXTCTRL, "", (120,71), wxSize(80,-1), 0 )
        self.date.SetFont(wxFont( 12, wxROMAN, wxNORMAL,wxNORMAL))
        
        item7 = wxStaticText( self, self.ID_TEXT, u"Durée:", (10,100), wxDefaultSize, 0 )
        item7.SetFont( wxFont( 13, wxROMAN, wxNORMAL, wxBOLD ) )
        
        self.minut = wxStaticText(self, self.ID_TEXTCTRL, "", (65,100), wxSize(20,-1), 0 )
        self.minut.SetFont(wxFont( 12, wxROMAN, wxNORMAL,wxNORMAL))

        item10 = wxStaticText( self, self.ID_TEXT, ":", (81,100), wxDefaultSize, 0 )
        item10.SetFont( wxFont( 13, wxROMAN, wxNORMAL, wxBOLD ) )
        
        self.second = wxStaticText( self, self.ID_TEXTCTRL, "", (86,100), wxSize(40,-1), 0 )
        self.second.SetFont(wxFont( 12, wxROMAN, wxNORMAL,wxNORMAL))

        item12 = wxStaticText( self, self.ID_TEXT, "Acteurs:", (10,130), wxDefaultSize, 0 )
        item12.SetFont( wxFont( 13, wxROMAN, wxNORMAL, wxBOLD ) )

        self.acteur = wxStaticText( self, self.ID_CHOICE,"", (75,130), wxSize(100,-1), 0 )
        self.acteur.SetFont(wxFont( 12, wxROMAN, wxNORMAL,wxNORMAL))

        item15 = wxStaticText(self,self.ID_TEXT, "Genre:", (10,160), wxDefaultSize, 0 )
        item15.SetFont( wxFont( 13, wxROMAN, wxNORMAL, wxBOLD ) )
        
        self.genre = wxStaticText( self, self.ID_CHOICE,"",(65,160), wxSize(100,-1), 0 )
        self.genre.SetFont( wxFont( 13, wxROMAN, wxNORMAL, wxBOLD ) )
                              
        item14 = wxStaticText( self, self.ID_TEXT, u"Qualité:", (10,190), wxDefaultSize, 0 )
        item14.SetFont( wxFont( 13, wxROMAN, wxNORMAL, wxBOLD ) )

        self.qualite = wxStaticText( self, self.ID_CHOICE,"",(75,190), wxSize(100,-1), 0 )
        self.qualite.SetFont(wxFont( 12, wxROMAN, wxNORMAL,wxNORMAL))

        item16 = wxStaticText( self, self.ID_TEXT, "Vu par:", (10,220), wxDefaultSize, 0 )
        item16.SetFont( wxFont( 13, wxROMAN, wxNORMAL, wxBOLD ) )
        
        self.vupar = wxStaticText( self, self.ID_TEXT, "",(72,220), wxDefaultSize, 0 )
        self.vupar.SetFont(wxFont( 12, wxROMAN, wxNORMAL,wxNORMAL))

        item18 = wxStaticText( self, self.ID_TEXT, "Description:",(10,250), wxDefaultSize, 0 )
        item18.SetFont( wxFont( 13, wxROMAN, wxNORMAL, wxBOLD ) )

        self.button = wxButton(self,self.ID_BUTTON,"Editer le DIVX",(120,550),wxDefaultSize,0)
        
        self.description = wxTextCtrl( self, self.ID_TEXT, "", (10,270), wxSize(350,250), wxTE_MULTILINE|wxTE_READONLY )
        EVT_BUTTON(self,self.ID_BUTTON, self.edit_adivx)
        
    def edit_adivx(self,event):
        win = edit_frame(self.parent,self,self.divx)
        win.ShowModal()
         
    def __init__(self, parent,ID=-1):
        self.parent = parent
        self.divx = ''
        self.divx_database = ''
        wxSashLayoutWindow.__init__(self,
                                    parent,
                                    ID, #,
                                    #wxDefaultPosition,
                                    #wxSize(1600, 600),
                                    style=wxNO_BORDER|wxSW_3D
                                    )                                                                      
#        self.SetMinimumSizeY(50)
#        self.SetMaximumSizeY(510)
        size = parent.GetSize()
        size[0] = size[0]- 210
        self.SetDefaultSize(wxSize(size[0], 400)) 
        self.SetBackgroundColour('white')
        self.SetOrientation(wxLAYOUT_VERTICAL)
        self.SetAlignment(wxLAYOUT_RIGHT)
        self.make_formular()
        
   

class mainfraim(wxFrame):
    ID_WINDOW_TOP          = 5101
    ID_WINDOW_BOTTOM       = 5102
    def __init__(self, parent, ID, title):
        self.parent = parent
        self.divxdb = divx_db('')
        wxFrame.__init__(self, parent, ID, title,wxDefaultPosition)
        self.remainingSpace = wxPanel(self, -1, style=wxSUNKEN_BORDER)
        EVT_SIZE(self, self.OnSize)
        self.window_left = LeftPart(self,self.ID_WINDOW_TOP)
        self.window_left.divxdb = self.divxdb
        self.window_right = RightPart(self, self.ID_WINDOW_BOTTOM)
        
               
        test = wxMenu()
        test.Append(ID_ABOUT, "&About","Plus d'info sur l'application")
#        test.Break()
        test2 = wxMenu()
        test2.Append(2, "O&uvrir",u"Ouvrir une base de donnée")
        test2.Append(3, "S&auver",u"Sauver la base de donnée en cours")
        test2.Append(4, "Q&uitter","Quitter l'application")
        menubar = wxMenuBar()
        menubar.Append(test2,'Fichier')
        menubar.Append(test,'Autres')
#        print test.GetMenuItemCount()
      #  print test.GetHelpString(ID_ABOUT)
       # menubar.Append(test,'Bidon')
        self.SetMenuBar(menubar)
        
        ###Statut####
        self.CreateStatusBar()

        ###EVENT####
        EVT_MENU(self,ID_ABOUT,self.OnAbout)
        EVT_MENU(self,2,self.openDB)
        EVT_MENU(self,3,self.save)
        EVT_MENU(self,4,self.quit)
        
        EVT_CLOSE(self,self.quit)
        self.SetStatusText('cooool')
        
#    def edit_divx(self,divx):
#        edit_frame(self.parent,divx)
#        pass

    def save(self,event):
        dir,file=os.path.split(self.path)
        #print dir
        #print file
        dlg = wxFileDialog(self, "Choose a file to save", dir, file, "*.db", wxSAVE)
        if dlg.ShowModal() == wxID_OK:
            #print 'You selected: %s\n' % dlg.GetPath()
            self.divxdb.save_database(dlg.GetPath())

    def update_right(self,divx):
        self.window_right.setdivx(divx)

    def refresh_left(self):
        self.window_left.newtree(self.divxdb)
        
    def openDB(self, event):
        dlg = wxFileDialog(self, "Choose a file", ".", "", "*.*", wxOPEN)
        if dlg.ShowModal() == wxID_OK:
            #print 'You selected: %s\n' % dlg.GetPath()
            self.data = divx_db(dlg.GetPath())
            self.path = dlg.GetPath()
            self.divxdb = self.data
            #print 'data: !!!!' + str(self.data)
            #print 'details: !!!!' + str(self.data.get_list_size())
            self.window_left.newtree(self.data)
            self.window_right.divx_database = self.data
            self.window_left.divxdb = self.divxdb 
           #del self.data

    def OnSize(self, event):
        wxLayoutAlgorithm().LayoutWindow(self, self.window_left)
        wxLayoutAlgorithm().LayoutWindow(self, self.window_right)
        
    def OnAbout(self,event):
        dlg = wxMessageDialog(self,'Blabla bla bla bla \n bla bla...','About',style=wxICON_INFORMATION)        
        tmp = dlg.ShowModal()
        
    def quit(self,event):
        dlg = wxMessageDialog(self,'Do you really want to quit?','Quit?',style=wxYES_NO)
        tmp = dlg.ShowModal()
        if(tmp == wxID_YES):
#            print 'ok quiting'
            #print self.database
            self.Destroy()
        else:
            self.SetStatusText(u'Génial!')

class Monappli(wxApp):
    def OnInit(self):
        fenetre = mainfraim(NULL,0,'DivxManager 0.1')
        fenetre.Show(true)
    #    fenetre2 = wxFrame(fenetre,1,'test 2')
    #    fenetre2.Show(true)
    #    self.SetTopWindow(fenetre)
        return true

app = Monappli(0)
app.MainLoop()

