#!/usr/bin/env python
# -*- coding: utf-8 -*-

import gtk, sys, logging, traceback, os

def logging_excepthook(type, value, tb):
	global session
	errordialog = gtk.MessageDialog(None, gtk.DIALOG_MODAL|gtk.DIALOG_DESTROY_WITH_PARENT, gtk.MESSAGE_ERROR, gtk.BUTTONS_CLOSE, "Une erreur s'est produite; pour plus de détails, consultez le fichier debug.log.")
	errordialog.run()
	errordialog.destroy()
	
	logging.error(''.join(traceback.format_exception(type, value, tb)))
	try:
		gtk.main_quit()
	except:
		pass
	
	try:
		os.remove(session)
	except:
		pass
	
	sys.exit()

logging.basicConfig(level=logging.DEBUG, filename='debug.log', format='%(asctime)-15s - %(levelname)-8s : %(message)s')


# Affichage des message de debug dans la console
console = logging.StreamHandler()
console.setLevel(logging.INFO)
console.setFormatter(logging.Formatter('%(message)s'))
logging.getLogger('').addHandler(console)

# Enregistrement des messages d'erreur dans le fichier de log
sys.excepthook = logging_excepthook

from lib import main_window, db, progress_dialog

def thread(dialog):
	global finished, database
	
	try:
		database = db.database()
		logging.debug("Version : %s" % database.get_config("version"))
		database.update()
	except IOError as message:
		errordialog = gtk.MessageDialog(None, gtk.DIALOG_MODAL|gtk.DIALOG_DESTROY_WITH_PARENT, gtk.MESSAGE_ERROR, gtk.BUTTONS_CLOSE, str(message))
		errordialog.run()
		errordialog.destroy()
	
	finished = True
	dialog.destroy()
	
	return False

def end(widget, argv):
	global finished, database, session
	
	if finished:
		if len(argv) > 1:
			if argv[1] == "update":
				logging.info("Mode : Mise à jour")
				from lib.updatedialog import UpdateDialog
				dialog = UpdateDialog(database)
				dialog.update(len(argv) > 2 and argv[2] == "silent")
			elif argv[1] == "install":
				if len(argv) > 2 and not os.path.isfile(argv[2]):
					logging.info("Mode : Installation depuis la base de donnée")
					from lib.installdialog import InstallDialog
					dialog = InstallDialog(database, argv[2:])
				else:
					if len(argv) > 2:
						filename = argv[2]
					else:
						filename = None
					logging.info("Mode : Installation de paquet")
					from lib.packageinstaller import PackageInstaller
					dialog = PackageInstaller(database, filename)
				dialog.run()
			else:
				logging.info("Mode : Normal")
				main_window.main_window(database)
		else:
			logging.info("Mode : Normal")
			main_window.main_window(database)
	else:
		gtk.main_quit()
		os.remove(session)
		sys.exit()
	

def main(argv):
	global finished, database, session
	
	# vérification des sous dossiers de cache
	logging.debug('Création des sous-dossiers de cache')
	if not os.path.exists("cache/appinfo"):
		os.makedirs("cache/appinfo/")
	if not os.path.exists("cache/backup/"):
		os.makedirs("cache/backup/")
	if not os.path.exists("cache/icons/"):
		os.makedirs("cache/icons/")
	if not os.path.exists("cache/packages/"):
		os.makedirs("cache/packages/")
	
	session = "cache/session.lock~"
	if not os.path.exists(session):
		logging.info('Lancement de SynApps')
		import gobject
		
		logging.debug('Création du fichier %s' % session)
		open(session, 'w').close()
		finished = False
		database = None
		
		dialog = progress_dialog.progress_dialog()
		dialog.run()
		dialog.connect("destroy", end, argv)
		
		gobject.idle_add(thread, dialog)
		
		gtk.main()
		
		logging.debug('Suppression du fichier %s' % session)
		os.remove(session)
	else:
		logging.info('Le fichier %s existe : SynApps est déjà lancé.' % session)
		errordialog = gtk.MessageDialog(None, gtk.DIALOG_MODAL|gtk.DIALOG_DESTROY_WITH_PARENT, gtk.MESSAGE_WARNING, gtk.BUTTONS_CLOSE, "SynApps est déjà en cours d'exécution.\nEn cas de problème, supprimez le fichier %s avant de redémarrer SynApps." % os.path.abspath(session))
		errordialog.run()
		errordialog.destroy()	

if __name__ == "__main__":
	main(sys.argv)
