'''
Created on 2 nov 2019

@author: Emanuele Trabattoni
TODO LIST
1- Aggiungere le icone ai tasti (giulia)

'''
import sys
import PyQt5.QtWidgets

from mainwindow import Ui_mainwin
from selezout import Ui_selezout
from titolow import Ui_titolo
from avanzatetitolo3 import Ui_advtitolo3 as Ui_advtitolo
from opzioniavanzate import Ui_advoption

from libfancylogger import fancyLogger
from libconfload import bananaCONF
from libsplit import bananaSPLITTER

from PyQt5.QtCore import QDir,pyqtSignal
from slugify import slugify

class bananaMain(PyQt5.QtWidgets.QMainWindow):
	
	def __init__(self):
		PyQt5.QtWidgets.QMainWindow.__init__(self)
		try:
			self.logger = fancyLogger(filepath=r"./libbananasplit/loggerconf.json",fileLog=False)
			self.conf = bananaCONF(workdir=r"./libbananasplit", logger=self.logger)
			self.conf.open()
			self.conf.use("defaults.json")
			self.conf.use(self.conf.getParam('paths', 'lastUsed'))
		except:
			sys.exit()
		
		# inizializzazione interfaccia
		self.ui = Ui_mainwin()
		self.ui.setupUi(self)
		self.titolo = bananaTitolo(self.conf, self.logger)
		self.titoloav = bananaTitoloAvanzate(self.conf, self.logger)
		self.selezout = bananaSelezOut(self.conf, self.logger)
		self.advopt = bananaAdvOpt(self.conf, self.logger)

		#popola le tab con le finestre giuste
		self.ui.wgt_main.addTab(self.titolo, "Titolo")
		self.ui.wgt_main.addTab(self.selezout, "SelezioneOutput")
		
		# connetti bottoni avanti
		self.ui.btn_avanti.clicked.connect(self.nextTab)
		self.titolo.titoloui.btn_avanti.clicked.connect(self.nextTab)
		self.selezout.selezoutui.btn_avanti.clicked.connect(self.nextTab)
		
		#connetti bottoni indietro
		self.titolo.titoloui.btn_indietro.clicked.connect(self.prevTab)
		self.selezout.selezoutui.btn_indietro.clicked.connect(self.prevTab)
		
		#connetti bottoni selezione cartelle
		self.ui.btn_cartellasorg.clicked.connect(self.selezSorg)
		self.ui.btn_cartelladest.clicked.connect(self.selezDest)
		
		#connetti action tab
		self.ui.actionLingua.triggered.connect(self.openLanguage)
		self.ui.actionAvanzate.triggered.connect(self.openAdvOpt)
		self.ui.actionCarica_Preset.triggered.connect(self.openLoadPreset)
		self.ui.actionSalva_Preset.triggered.connect(self.openSavePreset)
		
		#riempi pagine di interfaccia
		self.fillAllInterfaces()
		pass
	
	def fillInterface(self):
		#pagina principale
		try:
			self.ui.lbl_sorg.setText(self.conf.getParam('paths','INworkPath'))
			self.ui.lbl_dest.setText(self.conf.getParam('paths','OUTworkPath'))
		except:
			self.log.critical("MainWindow: Configurazione non accettata")
			
	def fillAllInterfaces(self):
		self.fillInterface()
		self.titolo.fillInterface()
		self.titoloav.fillInterface()
		self.selezout.fillInterface()
		self.advopt.fillInterface()
	
	def nextTab(self):
		self.ui.wgt_main.setCurrentIndex(self.ui.wgt_main.currentIndex()+1)
		self.logger.debug("Prossima Tab")
		pass
	
	def prevTab(self):
		self.ui.wgt_main.setCurrentIndex(self.ui.wgt_main.currentIndex()-1)
		self.logger.debug("Tab Precedente")
		pass
	
	def openLoadPreset(self):
		self.logger.debug("Forzo applica a tutte le tab")
		self.applica()
		self.logger.debug("Apri Carica Preset")
		lf = PyQt5.QtWidgets.QFileDialog(self,"Carica Preset",self.conf.getParam('paths', 'configurationPath'))
		lf.setAcceptMode(PyQt5.QtWidgets.QFileDialog.AcceptOpen)
		lf.setFileMode(PyQt5.QtWidgets.QFileDialog.ExistingFile)
		lf.setNameFilter("bananaCONF (*.json)")
		if lf.exec():
			cf = str(lf.selectedFiles()[0].split('/')[-1])
			self.logger.debug("Scelto il File: {}".format(cf))
			self.conf.open()
			self.conf.use(cf)
			self.fillAllInterfaces()
		pass											 
	
	def openSavePreset(self):
		self.logger.debug("Apri Salva Preset")
		self.logger.debug("Forzo applica a tutte le tab")
		self.applica()
		sf = PyQt5.QtWidgets.QFileDialog(self,"Salva Preset",self.conf.getParam('paths', 'configurationPath'))
		sf.setAcceptMode(PyQt5.QtWidgets.QFileDialog.AcceptSave)
		sf.setNameFilter("bananaCONF (*.json)")
		if sf.exec():
			rv=str(sf.selectedFiles()[0])
			self.conf.setParam(('paths','lastUsed'),rv)
			self.logger.debug("Scrivi il File: {}".format(rv))
			self.conf.save(fName=rv)
		pass
		
	def openAdvOpt(self):
		self.logger.debug("Apri Opzioni Avanzate")
		pass
	
	def openLanguage(self):
		self.logger.debug("Apri Opzioni Lingua")
		pass
	
	def selezSorg(self):
		rv = PyQt5.QtWidgets.QFileDialog.getExistingDirectory(self,"Seleziona Cartella Sorgente",self.conf.getParam('paths','INworkPath'))
		if rv is not "":
			self.conf.setParam(keys=('paths','INworkPath',), val=rv)
			self.ui.lbl_sorg.setText(rv)
			self.logger.debug("Selezionata Cartella Sorgente: {}".format(rv))
			fl = QDir(rv).entryList()
			for f in fl:
				self.ui.lst_files.addItem(PyQt5.QtWidgets.QListWidgetItem(f))
		pass
	
	def selezDest(self):
		rv = PyQt5.QtWidgets.QFileDialog.getExistingDirectory(self,"Seleziona Cartella Destinazione",self.conf.getParam('paths','OUTworkPath'))
		if rv is not "":
			self.conf.setParam(keys=('paths','OUTworkPath',), val=rv)
			self.ui.lbl_dest.setText(rv)
			self.logger.debug("Selezionata Cartella Destinazione: {}".format(rv))
		pass
	
	def openFileDialog(self, name, path):
		self.log.debug("Apro in directory: {}".format(path))
		return 
	
	def applica(self):
		self.titolo.applica()
		self.titoloav.applica()
		self.selezout.applica()
		self.advopt.applica()

#############################################################
####################### INTERFACES ##########################
#############################################################

class bananaTitolo(PyQt5.QtWidgets.QWidget):
	def __init__(self, confloader=None, logger=None):
		PyQt5.QtWidgets.QWidget.__init__(self)
		self.titoloui = Ui_titolo()
		self.titoloui.setupUi(self)
		self.conf = confloader
		self.log = logger
		if self.conf is not None:
			self.titoloui.btn_avanzate.clicked.connect(self.spawnAvanzate)
			self.titoloui.btn_avanti.clicked.connect(self.applica)
			self.advtitolo = bananaTitoloAvanzate(self.conf, self.log)
			self.fillInterface()
		pass
	
	def fillInterface(self):
		try:
			# imposta predefiniti interfaccia da file
				#Data (la piu complicata)
			self.titoloui.chk_data.setChecked(self.conf.getParam('docStruct','outDate'))
			self.titoloui.rad_datajpn.setChecked(self.conf.getParam('docStruct', 'outDateType') is 'jpn')
			self.titoloui.rad_dataita.setChecked(self.conf.getParam('docStruct', 'outDateType') is 'it')
			self.titoloui.rad_datausa.setChecked(self.conf.getParam('docStruct', 'outDateType') is 'usa')
				#Titolo
			self.titoloui.chk_titolo.setChecked(self.conf.getParam('docStruct','outTitle'))
			self.titoloui.spn_ncarat.setValue(self.conf.getParam('docStruct', 'maxTitleLen'))
				#Numero Documento
			self.titoloui.chk_docnum.setChecked(self.conf.getParam('docStruct','outNumber'))
				#Separatore
			found=False
			for itmn in range(self.titoloui.lyt_sep.count()):
				itm=self.titoloui.lyt_sep.itemAt(itmn).widget()
				if isinstance(itm, PyQt5.QtWidgets.QRadioButton):
					if itm.text() == self.conf.getParam('docStruct', 'outNameSep'):
						itm.setChecked(True)
						found = True
			if not found:
				self.titoloui.rad_altro.setChecked(True)
			self.titoloui.lin_altro.setText(self.conf.getParam('docStruct', 'customSep'))
		except:
			self.log.critical("Titolo: Configurazione non accettata")
		
	def spawnAvanzate(self):
		self.log.debug("Mostro la finestra avanzate titolo")
		self.advtitolo.show()
		pass
	
	def applica(self):
		self.log.info("Applico impostazioni Titolo")
		c=self.conf
		c.setParam(('docStruct','outDate'),self.titoloui.chk_data.isChecked())
		c.setParam(('docStruct','outNumber'),self.titoloui.chk_docnum.isChecked())
		c.setParam(('docStruct','outTitle'),self.titoloui.chk_titolo.isChecked())
		if self.titoloui.rad_dataita.isChecked():
			c.setParam(('docStruct','outDateType'),'ita')
		elif self.titoloui.rad_datajpn.isChecked():
			c.setParam(('docStruct','outDateType'),'jpn')
		elif self.titoloui.rad_datausa.isChecked():
			c.setParam(('docStruct','outDateType'),'usa')
		c.setParam(('docStruct','maxTitleLen'), self.titoloui.spn_ncarat.value())
		c.setParam(('docStruct', 'customSep'),self.titoloui.lin_altro.text())
		for itmn in range(self.titoloui.lyt_sep.count()):
			itm=self.titoloui.lyt_sep.itemAt(itmn).widget()
			if isinstance(itm, PyQt5.QtWidgets.QRadioButton):
				if len(itm.text())==1 and itm.isChecked:
					c.setParam(('docStruct', 'outNameSep'), itm.text())				
	pass
	
class bananaTitoloAvanzate(PyQt5.QtWidgets.QWidget):
	def __init__(self, confloader=None, logger=None):
		PyQt5.QtWidgets.QWidget.__init__(self)
		self.titoloavui = Ui_advtitolo()
		self.titoloavui.setupUi(self)
		self.titoloavui.btn_OK.clicked.connect(self.returnOk)
		self.titoloavui.btn_annulla.clicked.connect(self.returnKo)
		
		self.titoloavui.rad_dataprimo.clicked.connect(self.gestisciBottoni)
		self.titoloavui.rad_datasecondo.clicked.connect(self.gestisciBottoni)
		self.titoloavui.rad_dataterzo.clicked.connect(self.gestisciBottoni)
		self.titoloavui.rad_numeroprimo.clicked.connect(self.gestisciBottoni)
		self.titoloavui.rad_numerosecondo.clicked.connect(self.gestisciBottoni)
		self.titoloavui.rad_numeroterzo.clicked.connect(self.gestisciBottoni)
		self.titoloavui.rad_titoloprimo.clicked.connect(self.gestisciBottoni)
		self.titoloavui.rad_titolosecondo.clicked.connect(self.gestisciBottoni)
		self.titoloavui.rad_titoloterzo.clicked.connect(self.gestisciBottoni)
		self.conf = confloader
		self.log = logger
		self.fillInterface()
		pass

	def fillInterface(self):
		try:
			#rimepi interfaccia
			self.titoloavui.rad_dataprimo.setChecked(self.conf.getParam('docStruct','datePos')==1)
			self.titoloavui.rad_datasecondo.setChecked(self.conf.getParam('docStruct','datePos')==2)
			self.titoloavui.rad_dataterzo.setChecked(self.conf.getParam('docStruct','datePos')==3)
			self.titoloavui.rad_titoloprimo.setChecked(self.conf.getParam('docStruct','titlePos')==1)
			self.titoloavui.rad_titolosecondo.setChecked(self.conf.getParam('docStruct','titlePos')==2)
			self.titoloavui.rad_titoloterzo.setChecked(self.conf.getParam('docStruct','titlePos')==3)
			self.titoloavui.rad_numeroprimo.setChecked(self.conf.getParam('docStruct','numberPos')==1)
			self.titoloavui.rad_numerosecondo.setChecked(self.conf.getParam('docStruct','numberPos')==2)
			self.titoloavui.rad_numeroterzo.setChecked(self.conf.getParam('docStruct','numberPos')==3)
			self.titoloavui.txt_prefisso.setText(self.conf.getParam('docStruct','outPrefix'))
			self.titoloavui.txt_suffisso.setText(self.conf.getParam('docStruct','outSuffix'))
		except:
			self.log.critical("AvanzateTitolo: Configurazione non accettata")

	def gestisciBottoni(self):
		#PRIMO
		if self.titoloavui.rad_numeroprimo.isChecked():
			self.titoloavui.rad_dataprimo.setChecked(False)
			self.titoloavui.rad_titoloprimo.setChecked(False)
			self.titoloavui.rad_numerosecondo.setChecked(False)
			self.titoloavui.rad_numeroterzo.setChecked(False)
		if self.titoloavui.rad_dataprimo.isChecked():
			self.titoloavui.rad_numeroprimo.setChecked(False)
			self.titoloavui.rad_titoloprimo.setChecked(False)
			self.titoloavui.rad_datasecondo.setChecked(False)
			self.titoloavui.rad_dataterzo.setChecked(False)
		if self.titoloavui.rad_titoloprimo.isChecked():
			self.titoloavui.rad_numeroprimo.setChecked(False)
			self.titoloavui.rad_dataprimo.setChecked(False)
			self.titoloavui.rad_titolosecondo.setChecked(False)
			self.titoloavui.rad_titoloterzo.setChecked(False)
		#secondo
		if self.titoloavui.rad_numerosecondo.isChecked():
			self.titoloavui.rad_datasecondo.setChecked(False)
			self.titoloavui.rad_titolosecondo.setChecked(False)
			self.titoloavui.rad_numeroprimo.setChecked(False)
			self.titoloavui.rad_numeroterzo.setChecked(False)
		if self.titoloavui.rad_datasecondo.isChecked():
			self.titoloavui.rad_numerosecondo.setChecked(False)
			self.titoloavui.rad_titolosecondo.setChecked(False)
			self.titoloavui.rad_dataprimo.setChecked(False)
			self.titoloavui.rad_dataterzo.setChecked(False)
		if self.titoloavui.rad_titolosecondo.isChecked():
			self.titoloavui.rad_numerosecondo.setChecked(False)
			self.titoloavui.rad_datasecondo.setChecked(False)
			self.titoloavui.rad_titoloprimo.setChecked(False)
			self.titoloavui.rad_titoloterzo.setChecked(False)
		#terzo
		if self.titoloavui.rad_numeroterzo.isChecked():
			self.titoloavui.rad_dataterzo.setChecked(False)
			self.titoloavui.rad_titoloterzo.setChecked(False)
			self.titoloavui.rad_numeroprimo.setChecked(False)
			self.titoloavui.rad_numerosecondo.setChecked(False)
		if self.titoloavui.rad_dataterzo.isChecked():
			self.titoloavui.rad_numeroterzo.setChecked(False)
			self.titoloavui.rad_titoloterzo.setChecked(False)
			self.titoloavui.rad_dataprimo.setChecked(False)
			self.titoloavui.rad_datasecondo.setChecked(False)
		if self.titoloavui.rad_titoloterzo.isChecked():
			self.titoloavui.rad_numeroterzo.setChecked(False)
			self.titoloavui.rad_dataterzo.setChecked(False)
			self.titoloavui.rad_titoloprimo.setChecked(False)
			self.titoloavui.rad_titolosecondo.setChecked(False)
		pass
	
	def returnOk(self):
		self.log.debug("Avanzate Titolo Accettate")
		self.applica()
		self.hide()
		pass
	
	def returnKo(self):
		self.log.debug("Avanzate Titolo Rifiutate")
		self.hide()
		pass
	
	def applica(self):
		c=self.conf
		#data
		if self.titoloavui.rad_dataprimo.isChecked():
			c.setParam(('docStruct', 'datePos'), 1)
		elif self.titoloavui.rad_datasecondo.isChecked():
			c.setParam(('docStruct', 'datePos'), 2)
		elif self.titoloavui.rad_dataterzo.isChecked():
			c.setParam(('docStruct', 'datePos'), 3)
		else:
			c.setParam(('docStruct', 'datePos'), -1)
		#numero	
		if self.titoloavui.rad_numeroprimo.isChecked():
			c.setParam(('docStruct', 'numberPos'), 1)
		elif self.titoloavui.rad_numerosecondo.isChecked():
			c.setParam(('docStruct', 'numberPos'), 2)
		elif self.titoloavui.rad_numeroterzo.isChecked():
			c.setParam(('docStruct', 'numberPos'), 3)
		else:
			c.setParam(('docStruct', 'numberPos'), -1)
		#titolo
		if self.titoloavui.rad_titoloprimo.isChecked():
			c.setParam(('docStruct', 'titlePos'), 1)
		elif self.titoloavui.rad_titolosecondo.isChecked():
			c.setParam(('docStruct', 'titlePos'), 2)
		elif self.titoloavui.rad_titoloterzo.isChecked():
			c.setParam(('docStruct', 'titlePos'), 3)	
		else:
			c.setParam(('docStruct', 'titlePos'), -1)
		#prefisso e suffisso
		c.setParam(('docStruct', 'outPrefix'), self.titoloavui.txt_prefisso.text())
		c.setParam(('docStruct', 'outSuffix'), self.titoloavui.txt_suffisso.text())
		
		
class bananaSelezOut(PyQt5.QtWidgets.QWidget):
	def __init__(self, confloader=None, logger=None):
		PyQt5.QtWidgets.QWidget.__init__(self)
		self.selezoutui = Ui_selezout()
		self.selezoutui.setupUi(self)
		self.conf = confloader
		self.log = logger
		if self.conf is not None:
			self.fillInterface()
		pass
	
	def fillInterface(self):
		try:
			pass
		except:
			self.log.critical("SelezUscita: Configurazione non accettata")
		pass
	
	def applica(self):
		pass

class bananaAdvOpt(PyQt5.QtWidgets.QWidget):
	def __init__(self, confloader=None, logger=None):
		PyQt5.QtWidgets.QWidget.__init__(self)
		self.advoptui = Ui_advoption()
		self.advoptui.setupUi(self)
		self.conf = confloader
		self.log = logger
		if self.conf is not None:
			self.fillInterface()
		pass
	
	def fillInterface(self):
		try:
			pass
		except:
			self.log.critical("AdvancedOptions: Configurazione non accettata")
		pass
	
	def applica(self):
		pass
	
class bananaSplitterInterface(PyQt5.QtWidgets.QWidget):
	def __init__(self, confloader=None, logger=None):
		PyQt5.QtWidgets.QWidget.__init__(self)
		pass
	
#############################################################
####################### MAIN ################################
#############################################################

if __name__ == '__main__':
	app = PyQt5.QtWidgets.QApplication(sys.argv)
	window = bananaMain()
	window.resize(window.sizeHint().width(), window.size().height())
	window.show()
	rv = app.exec()
	print("ExitCode: {}".format(rv))
	sys.exit(rv)
	pass