'''
Created on 2 nov 2019

@author: Emanuele Trabattoni
'''
import json,os,glob,copy

class bananaCONF(object):
	'''
	Carica e Salva file di configurazione per bananaSPLITTER
	'''
	def __init__(self, workdir=None, logger=None):
		self.log = logger
		self.fileList = None
		self.workdir = None
		self.inUse = None
		self.settingsList = dict()
		if workdir is not None:
			self.workdir = workdir
			os.chdir(workdir)
			self.log.debug("Cerco le configurazioni in: [{}]".format(os.getcwd()))
		else:
			self.log.error("Non mi e' stata fornita una directory per i file di configurazione")
		pass
	
	def open(self):
		self.log.info("Carico i file di configurazione")
		self.fileList = glob.glob(r"*.json")
		if len(self.fileList) > 0:
			for f in self.fileList:
				try:
					fp = open(f)
					tf = json.load(fp)
					fName = f.split("\\")[-1]
					self.settingsList[fName] = copy.deepcopy(tf)
					self.log.info("Caricato correttamente: {}".format(fName))
					fp.close()
				except json.JSONDecodeError as e:
					self.log.error("Impossibile leggere la configurazione:{}\n \
									Controlla il file a riga: {} e colonna:{}" .format(e.doc, e.lineno, e.colno))
				except IOError as ee:
					self.log.error("Impossibile aprire il file: {}".format(ee))
				except Exception as eee:
					self.log.critical("Eccezione inaspettata: {}".format(eee))
		else:
			self.log.error("Non ho trovato alcun file di configurazione!")
		pass
	
	def reload(self):
		self.settingsList = None
		self.fileList = None
		self.inUse = None
		self.open()
		pass
	
	def use(self, toUse):
		self.inUse = toUse
		pass
	
	def save(self, fName=None):
		if fName is None:
			fName=self.inUse
		self.log.info("Salvo la configurazione: {}".format(fName))
		try:
			f=open(fName, 'w')
			json.dump(self.settingsList[self.inUse], f, indent='\t')
			f.close()
		except IOError as e:
			self.log.error("Impossibile salvare il file: {} - [{}]".format(fName,e))
		except Exception as ei:
			self.log.error("Errore imprevisto nella scrittura del file: {}".format(ei))
		pass
	
	def getFiles(self):
		return self.fileList
	
	def getParam(self, *keys):
		rv = self.settingsList[self.inUse]
		try:
			for k in keys:
				rv = rv[k]
			return rv
		except ValueError as ve:
			self.log.error("Parametro di configurazione non valido! [{}]".format(ve))
			return False
		pass
	
	def setParam(self, keys=(), val=None):
		sv = self.settingsList[self.inUse]
		try:
			for k in keys[:-1]:
				sv = sv[k]
			sv[keys[-1]] = val
			return True
		except ValueError as ve:
			self.log.error("Parametro di configurazione non valido! [{}]".format(ve))
			return False
		pass

	
	