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

import os.path
import urllib
import xml.etree.ElementTree

class Categorie():
	"""Classe contenant les informations sur une categorie"""
	def __init__(self, config, elementtree = None):
		"""Récupère les informations depuis un element xml"""
		self.config = config
		self.infos = {}
		self.infos['apps'] = []
		
		if elementtree is None:
			self.infos['name'] = "Tout"
			self.infos['icon'] = "img/synapps/Tout.png"
		else:
			try:	self.infos['name'] = elementtree.get("name")
			except:	self.infos['name'] = ""
			
			if os.path.isfile("img/" + self.infos['name'] + ".png"):
				self.infos['icon'] = "img/" + self.infos['name'] + ".png"
			else:
				try:
					urllib.urlretrieve(elementtree.get("icon"), "img/" + self.infos['name'] + ".png")
					self.infos['icon'] = "img/" + self.infos['name'] + ".png"
				except:					
					self.infos['icon'] = "img/synapps/Autres.png"
			self.add_app_from_cat_element(elementtree)
	
	def add_app(self, app):
		"""Ajoute une application"""
		self.infos['apps'].append(app)
		
	def add_app_from_element(self, elementtree):
		"""Ajoute une application depuis un élément"""
		self.add_app(Application(self.config, elementtree))
		
	def add_app_from_cat_element(self, elementtree):
		"""Ajoute une application depuis un élément"""
		apps = elementtree.findall("app")
		for app in apps:
			self.add_app_from_element(app)
		
	def get(self, info = None):
		"""Si info = None: Renvoie un dictionnaire contenant les informations sur la catégorie.
		   Sinon: Renvoie l'information passée en paramètres."""
		if info is None:
			return self.infos
		else:
			return self.infos[info]
	
	def set(self, info, value):
		"""Modifie la valeur d'une information"""
		self.infos[info] = value
	
class Application():
	"""Classe contenant les informations sur une application"""
	def __init__(self, config, elementtree):
		"""Récupère les informations depuis un element xml"""
		self.config = config
		self.infos = {}
		
		try:	self.infos['parentname'] = elementtree.get("parentname")
		except:	self.infos['parentname'] = ""
		
		try:	self.infos['name'] = elementtree.get("name")
		except:	self.infos['name'] = ""
		
		if os.path.isfile("img/" + self.infos['name'] + ".png"):
			self.infos['icon'] = "img/" + self.infos['name'] + ".png"
		else:
			try:
				urllib.urlretrieve(elementtree.find("icon").text, "img/" + self.infos['name'] + ".png")
				self.infos['icon'] = "img/" + self.infos['name'] + ".png"
			except:
				self.infos['icon'] = "img/Autres.png"
		
		try:	self.infos['download'] = elementtree.find("download").text
		except:	self.infos['download'] = ""
		try:	self.infos['desc'] = elementtree.find("desc").text
		except:	self.infos['desc'] = ""
		try:	self.infos['longdesc'] = elementtree.find("longdesc").text
		except:	self.infos['longdesc'] = ""
		try:	self.infos['version'] = elementtree.find("download").get("version", 0)
		except:	self.infos['version'] = ""
		
		try:	self.infos['zipsize'] = eval(elementtree.find("zipsize").text)
		except:	self.infos['zipsize'] = 0
		self.infos['strzipsize'] = self.size2str(self.infos['zipsize'])
		try:	self.infos['size'] = eval(elementtree.find("size").text)
		except:	self.infos['size'] = 0
		self.infos['strsize'] = self.size2str(self.infos['size'])
		
		try:	self.infos['framasoft'] = elementtree.find("framasoft").text
		except:	self.infos['framasoft'] = ""
		try:	self.infos['framakey'] = elementtree.find("framakey").text
		except:	self.infos['framakey'] = ""
		try:	self.infos['website'] = elementtree.find("website").text
		except:	self.infos['website'] = ""
		try:	self.infos['dir'] = elementtree.find("dir").text
		except:	self.infos['dir'] = self.infos['name']
		try:	self.infos['exe'] = elementtree.find("exe").text
		except:	self.infos['exe'] = self.infos['name'] + ".exe"
		try:	self.infos['exe'] = elementtree.find("exe").text
		except:	self.infos['exe'] = self.infos['name'] + ".exe"
		try:	self.infos['installdir'] = elementtree.find("installdir").text
		except:	self.infos['installdir'] = ""
		try:	self.infos['licence'] = elementtree.find("licence").text
		except:	self.infos['licence'] = ""
		
		if self.infos['desc'] == None:
			self.infos['desc'] = ""
		if self.infos['longdesc'] == None:
			self.infos['longdesc'] = ""
		if self.infos['version'] == None:
			self.infos['version'] = ""
		if self.infos['size'] == None or self.infos['size'] == "":
			self.infos['size']= "0"
		if self.infos['dir'] == "" or self.infos['dir'] == None:
			self.infos['dir'] = self.infos['name']
		elif self.infos['dir'] == "*None*":
			self.infos['dir'] = ""
		if self.infos['exe'] == "" or self.infos['exe'] == None:
			self.infos['exe'] = self.infos['name'] + ".exe"""
		if self.infos['installdir'] == None:
			self.infos['installdir'] = ""
		if self.infos['licence'] == None:
			self.infos['licence'] = ""	
			
		if os.path.isfile(self.config.get("SynApps", "AppsPath")  + "/" + self.infos['installdir'] + "/" + self.infos['dir'] + "/" + self.infos['exe']):
			self.infos['installed'] = True
			self.infos['install'] = True
		else:
			self.infos['installed'] = False
			self.infos['install'] = False
	
	def size2str(self, size):
		unite = "o"
		if size >= 1024:
			size /= 1024.
			unite = "Ko"
			if size >= 1024:
				size /= 1024.
				unite = "Mo"
				if size >= 1024:
					size /= 1024.
					unite = "Go"
		return str(round(size, 2)) + " " + unite
	
	def get(self, info = None):
		"""Si info = None: Renvoie un dictionnaire contenant les informations sur l'applications.
		   Sinon: Renvoie l'information passée en paramètres."""
		if info is None:
			return self.infos
		else:
			return self.infos[info]
	
	def set(self, info, value):
		"""Modifie la valeur d'une information"""
		self.infos[info] = value