#!/usr/bin/python
# -*- coding: utf-8 -*-
# License:: GPL
# Author:: Alberto Milone (aka tseliot) (mailto:albertomilone@alice.it)
# Website:: http://albertomilone.com

import os, threading
import tarfile

try:
    import pygtk
    pygtk.require('2.0')
except:
    pass
try:
    import gtk
    import gtk.glade
except:
    sys.exit(1)

from Evolbck import VirtualTerminal
from Evolbck import osutils
from os import path
import gettext, locale

# set up gettext for translations
locale.setlocale(locale.LC_ALL, '')
from gettext import gettext as _
gettext.bindtextdomain('evolbck', 'po')
gettext.textdomain('evolbck')

date = osutils.getlocaltime()
username = osutils.getusername()
groupname = osutils.getgroupname()
home_folder = '/home/' + username

class EvolMain:
    def __init__(self):
        
        #Set the Glade file
        try:
            self.gladefile = 'evolui/evolutionimportex.glade'  
            self.wTree = gtk.glade.XML(self.gladefile)
        except RuntimeError:
            self.gladefile = '/usr/share/evolbck/evolui/evolutionimportex.glade'  
            self.wTree = gtk.glade.XML(self.gladefile)
        
        
        try:
            xml = gtk.glade.XML("evolui/filechooser.glade")
        except RuntimeError:
            xml = gtk.glade.XML("/usr/share/evolbck/evolui/filechooser.glade")

        self.textdialog = xml.get_widget("textdialog")
        self.statuslabel = xml.get_widget('statuslabel')


        expbox = xml.get_widget("expbox")

        self.textclosebutton = xml.get_widget("textclosebutton")
        
        self.textclosebutton.connect("clicked", self.closetext)
        
        self.myTerminal = VirtualTerminal.VirtualTerminal()
        self.myTerminal.show()
        #sw.add(textview)
        expbox.pack_end(self.myTerminal)
        
        #Get the Main Window, and connect the destroy event
        self.window = self.wTree.get_widget('MainWindow')
        if (self.window):
            self.window.connect('destroy', gtk.main_quit)
        
        self.window.set_position(gtk.WIN_POS_CENTER)
        
        imptable = self.wTree.get_widget('impsubtable')
        
        exptable = self.wTree.get_widget('expsubtable')
        
        
        impfilebutton = self.wTree.get_widget('openbutton')#gtk.FileChooserButton(self.impdialog)
        expfilebutton = self.wTree.get_widget('savebutton')#gtk.FileChooserButton(self.expdialog)
        
        self.imptextview = self.wTree.get_widget('imptextview')
        self.exptextview = self.wTree.get_widget('exptextview')
        
        importbutton = self.wTree.get_widget('importbutton')
        exportbutton = self.wTree.get_widget('exportbutton')
        
        self.openfilebutton = self.wTree.get_widget('openfilebutton')
        self.savefilebutton = self.wTree.get_widget('savefilebutton')
        
        
        self.errordialog = self.wTree.get_widget('errordialog')
        self.errorlabel = self.wTree.get_widget('errorlabel')
        self.okerrbutton = self.wTree.get_widget('okerrbutton')
        
        self.okerrbutton.connect('clicked', self.errdialoghide)
        
        
        self.startupdialog = self.wTree.get_widget('startupdialog')
        strokbutton = self.wTree.get_widget('strokbutton')
        strquitbutton = self.wTree.get_widget('strquitbutton')
        
        
        strokbutton.connect('clicked', self.startuphide)
        strokbutton.connect('clicked', self.stopapps)
        strquitbutton.connect('clicked', lambda wid: gtk.main_quit())
        
        self.overwritedialog = self.wTree.get_widget('overwritedialog')
        overyesbutton = self.wTree.get_widget('overyesbutton')
        overnobutton = self.wTree.get_widget('overnobutton')
        
        overyesbutton.connect('clicked', self.overwritehide)
        overyesbutton.connect('clicked', self.importcmd)
        overnobutton.connect('clicked', self.overwritehide)
        
        importbutton.connect('clicked', self.impchoice)
        exportbutton.connect('clicked', self.expchoice)
        
        impfilebutton.connect('clicked', self.impclicked)
        expfilebutton.connect('clicked', self.expclicked)
        
        quitbutton = self.wTree.get_widget('quitbutton')
        aboutbutton = self.wTree.get_widget('aboutbutton')
        self.aboutdialog = self.wTree.get_widget('aboutdialog')
        
        '''
        CONNECTIONS
        '''
        quitbutton.connect('clicked', lambda wid: gtk.main_quit())
        aboutbutton.connect('clicked', self.aboutdial)
        
        self.systemcheck()
        #self.getsysenv()
        #self.impdialog.set_filename('/home/' + username + '/evolutionbackup-' + date)
        #self.expdialog.set_filename('/home/' + username + '/evolutionbackup-' + date)
        
        


##############
    def popuperror(self, error):
        '''
        displays an error dialog
        with the error you choose
        '''
        self.errorlabel.set_text(error)
        self.errordialog.show()
        
    def overwritehide(self, data=None):
        self.overwritedialog.hide()

    def systemcheck(self, data=None):
        self.tostop = []
        evolution = osutils.isinuse('evolution', '-e')
        gconf = osutils.isinuse('gconf', 'ax')
        
        if evolution: self.tostop.append('evolution')
        if gconf: self.tostop.append('gconf')
        
        if evolution or gconf:
            self.startupdialog.show()
            
    def startuphide(self, data=None):
        self.startupdialog.hide()
        
    def stopapps(self, data=None):
        commands = [\
        'gconftool-2 --shutdown', \
        'evolution --force-shutdown']
        
        
        if len(self.tostop) > 0:
            for cmd in commands:
                osutils.cmdoutput(cmd)
    
    def importcmd(self, data=None):
        commands = [\
        'gconftool-2 --shutdown', \
        'evolution --force-shutdown', \
        'tar xzf ' + self.importchoice, \
        'gconftool-2 --unload ' + home_folder + '/evolution_setting.xml', \
        'gconftool-2 --load ' + home_folder + '/evolution_setting.xml' \
        ]
        #os.chdir('/home/' + username)
        self.myTerminal.reset(full=True, clear_history=True)
        self.statuslabel.set_text('Please Wait until the process finishes...')
        self.textdialog.show()
        self.textclosebutton.set_sensitive(0)
        for command in commands:
            self.exec_comnd(command)
        
        if self.myTerminal.thread_running == False:
            self.textclosebutton.set_sensitive(1)
            self.statuslabel.set_text('Operation Complete')



    def errdialoghide(self, data=None):
        self.errordialog.hide()

    def closetext(self, data=None):
        #start, end = textbuffer.get_bounds()
        #textbuffer.delete(start, end)
        self.textdialog.hide()

    def export_check(self, data=None):
        self.toexport = []
        #os.chdir(home_folder)
        try:
            os.remove(home_folder + '/evolution_setting.xml')
        except OSError:
            pass
        osutils.cmdoutput('gconftool-2 --dump /apps/evolution > ' + home_folder + '/evolution_setting.xml')
        self.paths = [home_folder + '/.evolution', \
        home_folder + '/.gconf/apps/evolution', \
        home_folder + '/.gnome2_private/Evolution', \
        home_folder + '/evolution_setting.xml' \
        ]
        firstpart = len('/home/' + username + '/')
        for i in self.paths:
            #print i
            print i[firstpart:len(i)]
            if os.path.isdir(i) or os.path.isfile(i) == True:
                self.toexport.append(i[firstpart:len(i)])
        
    def export_settings(self, data=None):
        self.export_check()
        if len(self.toexport) > 0:
            self.myTerminal.reset(full=True, clear_history=True)
            self.textdialog.show()
            self.statuslabel.set_text(_('Please Wait until the process finishes...'))
            
            command = 'tar -cvzf ' + self.exportchoice + ' ' + ' '.join(self.toexport)
            print command
            self.textclosebutton.set_sensitive(0)

            self.commands(command)
            
            if self.myTerminal.thread_running == False:
                self.textclosebutton.set_sensitive(1)
                self.statuslabel.set_text(_('Operation Complete'))
        else:
            print 'ERROR: NO FILES TO EXPORT'

    def commands(self, command, data=None):
        self.exec_comnd(command)


    def exec_comnd(self, command, data=None):
        self.myTerminal.run_command(command, dir=home_folder)


        
    
    def impchoice(self, data=None):
        '''
        when you click import
        '''
        error1 = _('ERROR: The file you have chosen is not a valid tar.gz archive \
        \n\nClick on OK to continue')
        
        error2 = _('ERROR: The file you have chosen does not seem to exist \
        \n\nClick on OK to continue')
        
        text = self.imptextview.get_buffer()
        start, end = text.get_bounds()
        self.importchoice = text.get_text(start, end)
        if os.path.isfile(self.importchoice):
            print 'MY IMPORT CHOICE IS ' + self.importchoice
            if tarfile.is_tarfile(self.importchoice):
                if osutils.checktar(self.importchoice) == True:
                    print 'OK: IS A TAR FILE'
                    print 'IMPORT SETTINGS'
                    self.overwritedialog.show()
                else:
                    print 'NOT A TAR FILE!'
                    self.popuperror(error1)
            else:
                print 'NOT A TAR FILE!'
                self.popuperror(error1)
        else:
            self.popuperror(error2)

    
    def expformat(self, data=None):
        filelist = self.exportchoice.split('/')
        print 'filelist is ' + str(filelist)
        #filelist = filelist[1:len(filelist)]
        #print 'filelist is ' + str(filelist)
        if len(filelist) > 0:
            if len(filelist) == 1:
                if filelist[0] != '':
                    filelist = [home_folder, filelist[0]]
                    self.exportchoice = '/'.join(filelist)
                    self.wellformatted = True
                    if 'tar.gz' not in filelist[0]:
                        filelist[1] = filelist[1] + '.tar.gz'
                        self.exportchoice = '/'.join(filelist)
                else:
                    self.wellformatted = False
                    error1 = _('PLEASE CHOOSE A DIFFERENT NAME')
                    self.popuperror(error1)
            elif len(filelist) > 1:
                newpath = '/'.join(filelist[0:len(filelist)-1])
                print 'newpath is ' + newpath
                if os.path.isdir(newpath):
                    print 'EXPORT PATH EXISTS'
                    self.wellformatted = True
                    if 'tar.gz' not in filelist[0:len(filelist)-1]:
                        filelist[0:len(filelist)-1] = filelist[0:len(filelist)-1]
                        self.exportchoice = '/'.join(filelist) + '.tar.gz'
                else:
                    if filelist[0] != '':
                        filelist.insert(0, home_folder)
                        self.exportchoice = '/'.join(filelist)
                        print 'step 1 ' + self.exportchoice
                        newpath = '/'.join(filelist[0:len(filelist)-1])
                        print 'step 2 ' + newpath
                        if os.path.isdir(newpath):
                            self.wellformatted = True
                            if 'tar.gz' not in filelist[0:len(filelist)-1]:
                                filelist[0:len(filelist)-1] = filelist[0:len(filelist)-1]
                                self.exportchoice = '/'.join(filelist) + '.tar.gz'
                    else:
                        self.wellformatted = False
                        error1 = _('EXPORT PATH DOES NOT EXIST')
                        self.popuperror(error1)
        else:
            self.wellformatted = False
            error1 = _('EXPORT PATH DOES NOT EXIST')
            self.popuperror(error1)
            
        
    
    def expchoice(self, data=None):
        text = self.exptextview.get_buffer()
        start, end = text.get_bounds()
        self.exportchoice = text.get_text(start, end)
        print 'MY EXPORT CHOICE IS ' + self.exportchoice
        self.expformat()
        if self.wellformatted == True:
            print 'MY FINAL EXPORT CHOICE IS ' + self.exportchoice
            
            self.export_settings()
        

    def impclicked(self, button, data=None):
        ''' Add button callback. '''
        myfile = MyFilechooser()
        file = myfile.impfilechooser()
        
        if file == None:
            return

        try:
            print(file)
            #self.importchoice = file
            
            textbuffer = self.imptextview.get_buffer()
            textbuffer.set_text(file)
            self.imptextview.set_buffer(textbuffer)
        except KeyError:
            print "Unknown File Type", "%s has an unsupported file type." % (file)


    def expclicked(self, button, data=None):
        ''' Add button callback. '''
        myfile = MyFilechooser()
        file = myfile.expfilechooser()
        
        if file == None:
            return

        try:
            print(file)
            #self.exportchoice = file
            textbuffer = self.exptextview.get_buffer()
            textbuffer.set_text(file)
            self.exptextview.set_buffer(textbuffer)
        except KeyError:
            print "Unknown File Type", "%s has an unsupported file type." % (file)


    def on_aboutbox_response(self, dialog, response, *args):
        # system-defined GtkDialog responses are always negative, in which    
        # case we want to hide it
        if response < 0:
            self.aboutdialog.hide()#dialog.hide()
            self.aboutdialog.emit_stop_by_name('response')

    def on_aboutbox_close(self, widget, event=None):
        self.aboutdialog.hide()
        return gtk.TRUE

    def aboutdial(self, widget, data=None):
        self.aboutdialog.show()
        response3 = self.aboutdialog.run()
        self.aboutdialog.connect("response", self.on_aboutbox_response)
        self.aboutdialog.connect("close", self.on_aboutbox_close)
        self.aboutdialog.connect("delete_event", self.on_aboutbox_close)
        
        
        
        
        
        
class MyFilechooser:
    def __init__(self):
        '''
        ADD A FILTER TO THE
        FILECHOOSER
        '''
        
        self.filter = gtk.FileFilter()
        #filter.set_name("All files")
        #filter.add_pattern("*")
        #self.expdialog.add_filter(filter)

        #filter = gtk.FileFilter()
        self.filter.set_name("Compressed Archives (tar.gz)")
        self.filter.add_mime_type("application/x-compressed-tar")
        #filter.add_mime_type("image/jpeg")
        #filter.add_mime_type("image/gif")
        self.filter.add_pattern("*.tar.gz")
            


    def impfilechooser(self):
        ''' File selection dialog. '''
        try:
            xml = gtk.glade.XML("evolui/filechooser.glade")
        except RuntimeError:
            xml = gtk.glade.XML("/usr/share/evolbck/evolui/filechooser.glade")
        
        dialog = xml.get_widget('impfilechooserdialog')
        dialog.add_filter(self.filter)
        dialog.set_filename('/home/' + username + '/evolutionbackup-' + date + '.tar.gz')
        dialog.show()
        response = dialog.run()

        file = dialog.get_filename()
        dialog.destroy()

        if response == gtk.RESPONSE_OK:
            return file

        return None

    def expfilechooser(self):
        
        ''' File selection dialog. '''
        try:
            xml = gtk.glade.XML("evolui/filechooser.glade")
        except RuntimeError:
            xml = gtk.glade.XML("/usr/share/evolbck/evolui/filechooser.glade")
        
        dialog = xml.get_widget("expfilechooserdialog")
        dialog.add_filter(self.filter)
        dialog.set_filename('/home/' + username + '/evolutionbackup-' + date + '.tar.gz')
        dialog.show()
        response = dialog.run()

        file = dialog.get_filename()
        dialog.destroy()

        if response == gtk.RESPONSE_OK:
            return file

        return None
    



def main():
    gtk.main()
    return 0

if __name__ == '__main__':
    EvolMain()
    main()
