# Copyright (C) 2013-2022  EDF R&D
#
# This library is free software; you can redistribute it and/or
# modify it under the terms of the GNU Lesser General Public
# License as published by the Free Software Foundation; either
# version 2.1 of the License, or (at your option) any later version.
#
# This library is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
# Lesser General Public License for more details.
#
# You should have received a copy of the GNU Lesser General Public
# License along with this library; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
#
# See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
#

from qtsalome import QSqlQuery
import datetime

class TableDeBase :
    def __init__(self,nom):
        self.nom=nom

    def setField(self,FieldStringList):
        self.FieldStringList=FieldStringList
        self.idName=FieldStringList[0]

    def setTypeField(self,FieldTypeListe,clef):
        self.FieldTypeListe = FieldTypeListe
        self.clef=clef

    def getFields(self):
        return self.FieldStringList

    def insereLigne(self,valeurs,debug=False):
        if self.verifieExitenceId(valeurs[0])!=0 :
            print("impossible d inserer " , valeurs, "dans ", self.nom)
            print("l id est deja existant")
            return False
        texteQuery='insert into ' + self.nom + " values "+ str(valeurs)+ ';'
        maQuery=QSqlQuery()
        if debug : print(texteQuery, " " , maQuery.exec_(texteQuery))
        else     : maQuery.exec_(texteQuery)

    def insereLigneAutoId(self,valeurs,debug=False):
        texteQuery='insert into ' + self.nom + self.cols+ " values "+ str(valeurs)+ ';'
        maQuery=QSqlQuery()
        if debug : print(texteQuery, " " , maQuery.exec_(texteQuery))
        else     : maQuery.exec_(texteQuery)

    def insereOuRemplaceLigne(self,valeurs,debug=False):
        texteQuery='insert or replace into ' + self.nom + " values "+ str(valeurs)+ ';'
        maQuery=QSqlQuery()
        if debug : print(texteQuery, " " , maQuery.exec_(texteQuery))
        else     : maQuery.exec_(texteQuery)


    def verifieExitenceId(self,valeur):
# ne fonctionne pas correctement, il faudrait se servir de la clef
        texteQuery= "select * from " + self.nom + " where "+ self.idName+'='+str(valeur) +';'
        maQuery=QSqlQuery()
        maQuery.exec_(texteQuery)
        nb=0
        while(maQuery.next()): nb=nb+1
        return nb


    def remplit(self):
        print("Pas de remplissage sauf si cette methode est surchargee")

    def createSqlTable(self):
        print("Pas de creation par defaut : cette methode doit etre surchargee")

# On ne se sert pas du csv python entre autre parcequ'il ne gere pas les entetes
    def exportToCSV(self):
        aujourdhui=datetime.date.today()
        monFolder="ExportDB"+str(aujourdhui)
        monFichier=monFolder+"/Sauve_"+str(self.nom)+'.csv'
        texteQuery= "select * from " + self.nom +';'
        texteSauve=""
        for col in self.FieldStringList:
            texteSauve+=col+";"
        texteSauve=texteSauve[0:-1] # on enleve le dernier ";"
        texteSauve+="\n"

        maQuery=QSqlQuery()
        maQuery.exec_(texteQuery)
        asauver=0
        while(maQuery.next()):
            asauver=1
            for i in range(len(self.FieldStringList)):
                texteSauve+=str(maQuery.value(i).toString())+";"
            texteSauve=texteSauve[0:-1] # on enleve le dernier ";"
            texteSauve+="\n"

        if asauver == 0 :
            print("pas de sauvegarde de : " , self.nom , " table vide")
            return

        from Stats.utiles import writeFile
        Bok=writeFile(monFichier,texteSauve)
        if Bok :
            print("sauvegarde de : " , self.nom , " effectuee ")
        else :
            print("pas de sauvegarde de : " , self.nom , " IOerror")

    def importFromCSV(self,folder,force):
        monFichier=folder+"/Sauve_"+str(self.nom)+'.csv'
        try :
            f=open(monFichier,'r')
        except:
            print("Pas de chargement de la table ", self.nom)
            print("Impossible d'ouvrir le fichier ", monFichier)
            return 0
        lignes=f.readlines()
        enTete=tuple(lignes[0][0:-1].split(";"))
        if enTete!=self.FieldStringList:
            print("Pas de chargement de la table ", self.nom)
            print("les entetes ne correspondent pas")
            return 0
        for StrVal in lignes[1:]:
            listeVal=tuple(StrVal[0:-1].split(";"))
            listeValTypee=[]
            for i in range(len(listeVal)):
                if self.FieldTypeListe[i]=='int'  : listeValTypee.append(int(listeVal[i]))
                if self.FieldTypeListe[i]=='float': listeValTypee.append(float(listeVal[i]))
                if self.FieldTypeListe[i]=='str'  : listeValTypee.append(listeVal[i])
            if force==1 : self.insereOuRemplaceLigne(tuple(listeValTypee))
            if force==0 : self.insereLigne(tuple(listeValTypee))
