/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package Models.Reglement;

import Controllers.Traitement.contro;
import Models.FactureFrs.FactureFrs;
import Models.FactureFrs.FactureFrsDB;
import Models.Fournisseur.Fournisseur;
import Models.Fournisseur.FournisseurDB;
import Models.User.Profile;
import Models.User.ProfileDB;
import Models.User.User;
import Models.connexion;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.logging.Level;
import java.util.logging.Logger;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;

/**
 * @author Maher
 */
public class ReglementDB {
    
    connexion cnx = new connexion();
    contro clt = new contro();
    
    public Reglement setReglementDB(Reglement reglement){
        
        String ModePaiement = "NULL";
        if(reglement.getModePaiement() != null){
            ModePaiement = reglement.getModePaiement();
        }
        String Query = "INSERT INTO `reglement_frs` (`id_fourisseur`, `montant`, `date_creation`, `type_paiement`, `mode_paiement`, `etat_reglement`, `id_profile`)  VALUES  ('"+reglement.getFournisseur().getCode()+"', '"+reglement.getMontant().replace(",",".")+"', '"+reglement.getDateTimeCreation()+"', "+reglement.getTypePaiement()+", "+ModePaiement+", '"+reglement.getEtatReglement()+"', '"+User.idprofile+"');";
        String IdNumero = cnx.InsertGetLastId(Query);
        reglement.setNumero(IdNumero);
        
        
        String list_id_facture = "";
        for(FactureFrs facture : reglement.getListFacture() ) {
            list_id_facture += facture.getIdFactureFrs()+",";
        }
        list_id_facture = list_id_facture.substring(0, list_id_facture.length()-1) + "";
        String QueryUpFact = "UPDATE `facture_frs` SET `id_reglement_frs` = '"+IdNumero+"' WHERE `facture_frs`.`id_facture_frs` IN ("+list_id_facture+");";
        cnx.MettreAJour(QueryUpFact);
        
        if(reglement.getTypePaiement().equals("0")){
            if(reglement.getModePaiement().equals("1")){
                ChequeFrs Cheque = this.setChequeDB(reglement.getCheque(), IdNumero);
                reglement.setCheque(Cheque);
            }else if(reglement.getModePaiement().equals("2")){
                CarteElectroniqueFrs CarteElectronique = this.setCarteElectroniqueDB(reglement.getCarte(), IdNumero);
                reglement.setCarte(CarteElectronique);
            }
        }
        
        if(reglement.getTypePaiement().equals("1")){
            
            // 1 Cheque 
            if(reglement.getModePaiement().equals("1")){
                this.setListChequeDB(reglement.getListCheque(), IdNumero);
            
             // 3 Traite     
            }else if(reglement.getModePaiement().equals("3")){
                this.setListTraiteDB(reglement.getListTraite(), IdNumero);
            }
        }
        return reglement;
    }
    
    public  ObservableList<Reglement> SearchGestionReglementGestion(Integer debut, Integer nbr, String Numero, String IdFournisseur, String Montant, String DatePayer, String TypeRegement, String Paiement){
        
        ObservableList<Reglement> ListReglement = FXCollections.observableArrayList();
        
        String Where = "";
        
        if(!clt.isStringNull(Numero)){
            Where += " (R.`id_reglement_frs` = \""+Numero+"\") AND ";
        }
        
        if(!clt.isStringNull(IdFournisseur)){
            Where += " (R.`id_fourisseur` = \""+IdFournisseur+"\") AND ";
        }
        
        if(!clt.isStringNull(Montant)){
            Where += " (R.`montant` = \""+Montant+"\") AND ";
        }
        
        if(!clt.isStringNull(DatePayer)){
            Where += " (DATE(R.`date_creation`) = \""+DatePayer+"\") AND ";
        }
        
        if(!clt.isStringNull(TypeRegement)){
           Where += " (R.`type_paiement` = \""+TypeRegement+"\") AND ";
        }
        
        if(!clt.isStringNull(Paiement)){
           Where += " (R.`mode_paiement` = \""+Paiement+"\") AND ";
        }
        
        
        if(!Where.equals("")){
            Where = Where.substring(0, Where.length() - 4);
            Where = "WHERE (F.id_fourisseur = R.id_fourisseur) AND " + Where;
        }else{
            Where =" WHERE (F.id_fourisseur = R.id_fourisseur) ";
        }
        
        String req="SELECT  *, DATE_FORMAT(date_creation, '%d/%m/%Y %H:%i') as date_creat "
                + " FROM reglement_frs R, fournisseur F  "
                + Where
                + " ORDER BY id_reglement_frs DESC "
                + "LIMIT "+debut+" , "+nbr+" ;";
        
                    
        if(cnx.ouverture()){
            try{
               // Exécution d'une requête de lecture 
                ResultSet resultat = cnx.excutionquery(req);
                //on place le curseur sur le dernier tuple
                resultat.last();
                //on récupère le numéro de la ligne
                int nombreLignes = resultat.getRow();
                if(nombreLignes>0){
                    //on repace le curseur avant la première ligne
                    resultat.beforeFirst();
                    while ( resultat.next() ) {
                        Reglement reglement = new Reglement();
                        
                        reglement.setNumero(resultat.getString("id_reglement_frs"));
                        
                        Fournisseur fournisseur = new Fournisseur();
                        fournisseur.setCode(resultat.getString("id_fourisseur"));
                        fournisseur.setNom(resultat.getString("nom"));
                        fournisseur.setAdresse(resultat.getString("adresse"));
                        fournisseur.setFormes(resultat.getString("formes"));
                        fournisseur.setTele1(resultat.getString("tele1"));
                        fournisseur.setTele2(resultat.getString("tele2"));
                        fournisseur.setFax(resultat.getString("fax"));
                        fournisseur.setMail(resultat.getString("mail"));
                        fournisseur.setSiteWeb(resultat.getString("site_web"));
                        fournisseur.setSpecialite(resultat.getString("specialite"));
                        reglement.setFournisseur(fournisseur);
                        
                        reglement.setMontant(resultat.getString("montant"));
                        reglement.setDateTimeCreation(resultat.getString("date_creat"));
                        reglement.setTypePaiement(resultat.getString("type_paiement"));
                        reglement.setModePaiement(resultat.getString("mode_paiement"));
                        reglement.setEtatReglement(resultat.getString("etat_reglement"));
                        
                        Profile profile = new Profile();
                        profile.setIdprofile(resultat.getInt("id_profile"));
                        reglement.setProfile(profile);
                        
                        ListReglement.add(reglement);
                    }
                }
            }
            catch(SQLException ex){
                System.err.println("Erreur SQL ! \n"+ex.getMessage());
                System.out.println(req);
            }
        }
        return ListReglement;
    }
    
    public Integer nbrGestionReglementGestion(String Numero, String IdFournisseur, String Montant, String DatePayer, String TypeRegement, String Paiement)
    {
        String Where = "";
        
        if(!clt.isStringNull(Numero)){
            Where += " (`id_reglement_frs` = \""+Numero+"\") AND ";
        }
        
        if(!clt.isStringNull(IdFournisseur)){
            Where += " (`id_fourisseur` = \""+IdFournisseur+"\") AND ";
        }
        
        if(!clt.isStringNull(Montant)){
            Where += " (`montant` = \""+Montant+"\") AND ";
        }
        
        if(!clt.isStringNull(DatePayer)){
            Where += " (DATE(`date_creation`) = \""+DatePayer+"\") AND ";
        }
        
        if(!clt.isStringNull(TypeRegement)){
           Where += " (`type_paiement` = \""+TypeRegement+"\") AND ";
        }
        
        if(!clt.isStringNull(Paiement)){
           Where += " (`mode_paiement` = \""+Paiement+"\") AND ";
        }
        
        
        if(!Where.equals("")){
            Where = Where.substring(0, Where.length() - 4);
            Where = "WHERE  " + Where;
        }
        
        String req=" SELECT COUNT(`id_reglement_frs`) " 
                    + " FROM `facture_frs` "
                    + Where+ " ;"; 
        
        int sommme =0;
        
        if(cnx.ouverture()){
            try{
               /* Exécution d'une requête de lecture */
                ResultSet resultat = cnx.excutionquery(req);
                resultat.next();    // get the number of rows from the result set
                sommme = resultat.getInt(1);
            }
            catch(SQLException ex){
                System.err.println("Erreur SQL ! \n"+ex.getMessage());
                System.out.println(req);
            }
        }
        return sommme ;
    }
    
    /*public  ObservableList<Reglement> getDataReglement(String  tab,String  mot, Integer debut, Integer nbr){
        
        ObservableList<Reglement> ListReglement = FXCollections.observableArrayList();
        
        String Limit = "";
        if(debut != null || nbr!= null){
            Limit = "LIMIT "+debut+" , "+nbr;
        }
        String req="SELECT  *, DATE_FORMAT(date_creation, '%d/%m/%Y %H:%i') as date_creat FROM reglement_frs R, fournisseur F  WHERE (F.id_fourisseur = R.id_fourisseur) AND ("+tab+" "+mot+") ORDER BY id_reglement_frs DESC "+Limit+" ;";
        
                    
        if(cnx.ouverture()){
            try{
               // Exécution d'une requête de lecture 
                ResultSet resultat = cnx.excutionquery(req);
                //on place le curseur sur le dernier tuple
                resultat.last();
                //on récupère le numéro de la ligne
                int nombreLignes = resultat.getRow();
                if(nombreLignes>0){
                    //on repace le curseur avant la première ligne
                    resultat.beforeFirst();
                    while ( resultat.next() ) {
                        Reglement reglement = new Reglement();
                        
                        reglement.setNumero(resultat.getString("id_reglement_frs"));
                        
                        //Fournisseur Frs = new FournisseurDB().GetFournisseurDB(resultat.getString("id_fourisseur"));
                        //Facture.setFournisseur(Frs);
                        Fournisseur fournisseur = new Fournisseur();
                        fournisseur.setCode(resultat.getString("id_fourisseur"));
                        fournisseur.setNom(resultat.getString("nom"));
                        fournisseur.setAdresse(resultat.getString("adresse"));
                        fournisseur.setFormes(resultat.getString("formes"));
                        fournisseur.setTele1(resultat.getString("tele1"));
                        fournisseur.setTele2(resultat.getString("tele2"));
                        fournisseur.setFax(resultat.getString("fax"));
                        fournisseur.setMail(resultat.getString("mail"));
                        fournisseur.setSiteWeb(resultat.getString("site_web"));
                        fournisseur.setSpecialite(resultat.getString("specialite"));
                        reglement.setFournisseur(fournisseur);
                        
                        reglement.setMontant(resultat.getString("montant"));
                        reglement.setDateTimeCreation(resultat.getString("date_creat"));
                        reglement.setTypePaiement(resultat.getString("type_paiement"));
                        reglement.setModePaiement(resultat.getString("mode_paiement"));
                        reglement.setEtatReglement(resultat.getString("etat_reglement"));
                        
                        Profile profile = new Profile();
                        profile.setIdprofile(resultat.getInt("id_profile"));
                        reglement.setProfile(profile);
                        
                        ListReglement.add(reglement);
                    }
                }
            }
            catch(SQLException ex){
                System.err.println("Erreur SQL ! \n"+ex.getMessage());
                System.out.println(req);
            }
        }
        return ListReglement;
    }
    
    public String nbrReglementFrs(String  tab, String mot){
        
        String req = "SELECT count(*) FROM reglement_frs R, fournisseur F  WHERE (F.id_fourisseur = R.id_fourisseur) AND ("+tab+" "+mot+") ;";
        
        int sommme =0;
        if(cnx.ouverture()){
            try{
              
                ResultSet resultat = cnx.excutionquery(req);
                resultat.next();    // get the number of rows from the result set
                sommme= resultat.getInt(1);
            }
            catch(SQLException ex){
                System.err.println("Erreur SQL ! \n"+ex.getMessage());
                System.out.println(req);
            }
        }
       return  Integer.toString(sommme) ;
    }*/
    
    public Reglement getReglementDB(String IdReglement){
        Reglement reglement = new Reglement();
        if(cnx.ouverture()){
            try{
               ResultSet resultat = cnx.excutionquery("SELECT * FROM `reglement_frs` WHERE `id_reglement_frs` = "+IdReglement+" ;");
                //on place le curseur sur le dernier tuple
                resultat.last();
                //on récupère le numéro de la ligne
                int nombreLignes = resultat.getRow();
                if(nombreLignes>0){
                    reglement.setNumero(resultat.getString("id_reglement_frs"));
                    reglement.setMontant(resultat.getString("montant"));
                    reglement.setDateTimeCreation(resultat.getString("date_creation"));
                    reglement.setTypePaiement(resultat.getString("type_paiement"));
                    reglement.setModePaiement(resultat.getString("mode_paiement"));
                    reglement.setEtatReglement(resultat.getString("etat_reglement"));
                    
                    reglement.setFournisseur(new FournisseurDB().GetFournisseurDB(resultat.getString("id_fourisseur")));
                    reglement.setProfile(new ProfileDB().getpro(resultat.getInt("id_profile")));
                    
                    reglement.setListFacture(new FactureFrsDB().getFactureByIdReglement(resultat.getString("id_reglement_frs")));
                    
                    if(reglement.getTypePaiement().equals("0")){
                        if(reglement.getModePaiement().equals("1")){
                            reglement.setCheque(this.getChequeDB(IdReglement));
                        }else if(reglement.getModePaiement().equals("2")){
                            reglement.setCarte(this.getCarteElectroniqueDB(IdReglement));
                        }
                    }else if(reglement.getTypePaiement().equals("1")){
                        // 1 Cheque 
                        if(reglement.getModePaiement().equals("1")){
                            reglement.setListCheque(this.getListChequeDB(IdReglement));
                        
                        // 3 Traite 
                        }else if(reglement.getModePaiement().equals("3")){
                            reglement.setListTraite(this.getListTraiteDB(IdReglement));
                        }
                    }
                    
                }
            }
            catch(SQLException ex){
                System.err.println("Erreur SQL ! \n"+ex.getMessage());
            }
        }
        return reglement;
    }
    
    
    public void setListChequeDB(ObservableList<ChequeFrs> ListCheque, String IdReglement){
        String ListValue = "";
        for(ChequeFrs Cheque : ListCheque ) {
            String NomComplet = "NULL";
            if(Cheque.getNomCompletChequeFrs() != null){
                NomComplet = "'"+Cheque.getNomCompletChequeFrs()+"'";
            }
            ListValue += "('"+IdReglement+"', '"+Cheque.getNumeroChequeFrs()+"', '"+Cheque.getBanqueChequeFrs()+"', '"+Cheque.getMontantChequeFrs().replace(",",".")+"', "+NomComplet+", '"+Cheque.getDatePaiement()+"', CURTIME() ),";
        }
        ListValue = ListValue.substring(0, ListValue.length()-1) + ";";
        
        String Query = "INSERT INTO `cheque_frs` (`id_reglement_frs`, `numero`, `banque`, `montant`, `nom_complet`, `date_paiement`, `date_creation`) VALUES "+ListValue;
        
        cnx.insertion(Query);
    }
    
    public ObservableList<ChequeFrs> getListChequeDB(String IdReglement){
        ObservableList<ChequeFrs> ListCheque =  FXCollections.observableArrayList();
        String req = "SELECT * FROM `cheque_frs` WHERE `id_reglement_frs` = "+IdReglement+";";  //local avec la quel appartient l'utilisateur
        if(cnx.ouverture()){
            try{
               /* Exécution d'une requête de lecture */
                ResultSet resultat = cnx.excutionquery(req);
                resultat.last();//on place le curseur sur le dernier tuple
                int nombreLignes = resultat.getRow(); //on récupère le numéro de la ligne
                if(nombreLignes>0){
                    resultat.beforeFirst();//on repace le curseur avant la première ligne
                    while ( resultat.next() ) {
                        String CodeChequeFrs = resultat.getString("id_cheque_frs");
                        String NumeroChequeFrs = resultat.getString("numero");
                        String BanqueChequeFrs = resultat.getString("banque");
                        String MontantChequeFrs = resultat.getString("montant");
                        String NomCompletChequeFrs = resultat.getString("nom_complet");
                        String DatePaiement = resultat.getString("date_paiement");
                        String DateCreation = resultat.getString("date_creation");
                        ListCheque.add(new ChequeFrs(CodeChequeFrs, NumeroChequeFrs, BanqueChequeFrs, MontantChequeFrs, NomCompletChequeFrs, DatePaiement, DateCreation));
                    }
                }
            } catch (SQLException ex) {
                Logger.getLogger(ReglementDB.class.getName()).log(Level.SEVERE, null, ex);
            }
        }
        return ListCheque;
    }
    
    public void setListTraiteDB(ObservableList<TraiteFrs> ListTraite, String IdReglement){
        String ListValue = "";
        for(TraiteFrs Traite : ListTraite ) {
            ListValue += "('"+IdReglement+"', '"+Traite.getMontant().replace(",",".")+"', '"+Traite.getDatePaiement()+"', CURTIME()),";
        }
        ListValue = ListValue.substring(0, ListValue.length()-1) + ";";
        
        String Query = "INSERT INTO `traite_frs` (`id_reglement_frs`, `montant`, `date_paiement`, `date_creation`) VALUES "+ListValue;
        
        cnx.insertion(Query);
    }
    
    public ObservableList<TraiteFrs> getListTraiteDB(String IdReglement){
        ObservableList<TraiteFrs> ListTraite =  FXCollections.observableArrayList();
        String req = "SELECT * FROM `traite_frs` WHERE `id_reglement_frs` = "+IdReglement+";";  //local avec la quel appartient l'utilisateur
        if(cnx.ouverture()){
            try{
                ResultSet resultat = cnx.excutionquery(req); /* Exécution d'une requête de lecture */
                resultat.last();//on place le curseur sur le dernier tuple
                int nombreLignes = resultat.getRow(); //on récupère le numéro de la ligne
                if(nombreLignes>0){
                    resultat.beforeFirst();//on repace le curseur avant la première ligne
                    while ( resultat.next() ) {
                        String CodeTraiteClt = resultat.getString("id_traite_frs");
                        String DatePaiement = resultat.getString("date_paiement");
                        String DateCreation = resultat.getString("date_creation");
                        String Montant = resultat.getString("montant");
                        ListTraite.add(new TraiteFrs(CodeTraiteClt, DatePaiement, DateCreation, Montant, null));
                    }
                }
            } catch (SQLException ex) {
                System.err.println(req);
                System.err.println(ex.toString());
            }
        }
        return ListTraite;
    }

    public ChequeFrs setChequeDB(ChequeFrs Cheque, String IdReglement){
        String Query = "INSERT INTO `cheque_frs` (`id_reglement_frs`, `numero`, `banque`, `montant`, `nom_complet`, `date_paiement`, `date_creation`) VALUES ('"+IdReglement+"', '"+Cheque.getNumeroChequeFrs()+"', '"+Cheque.getBanqueChequeFrs()+"', '"+Cheque.getMontantChequeFrs().replace(",",".")+"', '"+Cheque.getNomCompletChequeFrs()+"', '"+Cheque.getDatePaiement()+"', CURTIME() )";
        String IdCheque= cnx.InsertGetLastId(Query);
        Cheque.setCodeChequeFrs(IdCheque);
        return Cheque;
    }
    
     public ChequeFrs getChequeDB(String IdReglement){
        ChequeFrs Cheque = new ChequeFrs();
        if(cnx.ouverture()){
            try{
               ResultSet resultat = cnx.excutionquery("SELECT * FROM `cheque_frs` WHERE `id_reglement_frs` = "+IdReglement+";");
                //on place le curseur sur le dernier tuple
                resultat.last();
                //on récupère le numéro de la ligne
                int nombreLignes = resultat.getRow();
                if(nombreLignes>0){
                    Cheque.setCodeChequeFrs(resultat.getString("id_cheque_frs"));
                    Cheque.setNumeroChequeFrs(resultat.getString("numero"));
                    Cheque.setBanqueChequeFrs(resultat.getString("banque"));
                    Cheque.setMontantChequeFrs(resultat.getString("montant"));
                    Cheque.setNomCompletChequeFrs(resultat.getString("nom_complet"));
                    Cheque.setDatePaiement(resultat.getString("date_paiement"));
                    Cheque.setDateCreation(resultat.getString("date_creation"));
                }
            }catch(SQLException ex){
                System.err.println("Erreur SQL ! \n"+ex.getMessage());
            }
        }
        
        return Cheque;
    }
     
    public CarteElectroniqueFrs setCarteElectroniqueDB(CarteElectroniqueFrs CarteElectronique, String IdReglement){
        String Query = "INSERT INTO `carte_electronique_frs` (`id_reglement_frs`, `numero_transaction`, `numero_carte`, `date_transaction`, `banque`, `montant`) VALUES ('"+IdReglement+"', '"+CarteElectronique.getNumeroTransaction()+"', '"+CarteElectronique.getCodeCarte()+"', '"+CarteElectronique.getDateTransaction()+" "+CarteElectronique.getHeurTransaction()+"', '"+CarteElectronique.getBanque()+"', '"+CarteElectronique.getMantant().replace(",",".")+"')";
        String IdCart = cnx.InsertGetLastId(Query);
        CarteElectronique.setCodeCarte(IdCart);
        return CarteElectronique;
    }
    
     public CarteElectroniqueFrs getCarteElectroniqueDB(String IdReglement){
        CarteElectroniqueFrs CarteElectronique = new CarteElectroniqueFrs();
        if(cnx.ouverture()){
            try{
               ResultSet resultat = cnx.excutionquery("SELECT *, DATE_FORMAT(date_transaction, '%d/%m/%Y') as date_trans, DATE_FORMAT(date_transaction, '%H:%i') as heur_trans  FROM `carte_electronique_frs` WHERE `id_reglement_frs` = "+IdReglement+";");
                //on place le curseur sur le dernier tuple
                resultat.last();
                //on récupère le numéro de la ligne
                int nombreLignes = resultat.getRow();
                if(nombreLignes>0){
                    CarteElectronique.setCodeCarte(resultat.getString("id_carte_electronique_frs"));
                    CarteElectronique.setNumeroTransaction(resultat.getString("numero_transaction"));
                    CarteElectronique.setNumeroCarte(resultat.getString("numero_carte"));
                    CarteElectronique.setHeurTransaction(resultat.getString("heur_trans"));
                    CarteElectronique.setDateTransaction(resultat.getString("date_trans"));
                    CarteElectronique.setBanque(resultat.getString("banque"));
                    CarteElectronique.setMantant(resultat.getString("montant"));
                }
            }catch(SQLException ex){
                System.err.println("Erreur SQL ! \n"+ex.getMessage());
            }
        }
        
        return CarteElectronique;
    }
    
}
