package Models.Fournisseur;

import Controllers.Traitement.Adaptateur;
import Controllers.Traitement.ParametreSystem;
import Controllers.Traitement.contro;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import Controllers.Dialog.ShowDialog;
import org.apache.log4j.Logger;
import Models.H2JDBC;

/**
 * @author Maher Ben Tili
 */
public class FournisseurDB {
    
    H2JDBC h2jdbc = new H2JDBC();
    ShowDialog SD = new ShowDialog();
    Logger logger = Logger.getLogger(FournisseurDB.class.getName());
    contro clt = new contro();
    
    //methode qui permet de récupére la liste des locals souf le local qui appartin l'utilisateur
    public ArrayList<String> getIdNomFournisseur()
    {
        ArrayList<String> listFournisseur = new  ArrayList<>();
        String req = "SELECT CONCAT(id_fournisseur,' - ',nom) AS nameFrs FROM fournisseur ORDER BY id_fournisseur DESC;";  //local avec la quel appartient l'utilisateur
        try {
            ResultSet resultat = h2jdbc.selectFromDB(req);
            while (resultat.next()){
                listFournisseur.add(resultat.getString("nameFrs"));
            }
        } catch(SQLException ex){
            System.err.println("getAllFournisseur Erreur SQL ! \n"+ex.getMessage());
            System.out.println(req);
            if(ParametreSystem.ErrorShowLogger)
            {
                logger.error("FournisseurDB  : getAllFournisseur :" + ex.getMessage());
            }
            if(ParametreSystem.ErrorShowDialog)
            {
                ShowDialog.setTitre("Erreur SQL !");
                ShowDialog.setDetail(ex.getMessage()+"\n"+ex.getSQLState());
                SD.ShowAletDialog();
            }
        }
        return listFournisseur ;
    }
    
    //methode qui permet de récupére la liste des locals souf le local qui appartin l'utilisateur
    public ArrayList<String> getAllFournisseur(String colonne)
    {
        ArrayList<String> listFournisseur = new  ArrayList<>();
        String req = "SELECT "+colonne+" FROM fournisseur ORDER BY id_fournisseur DESC;";  //local avec la quel appartient l'utilisateur
        try {
            ResultSet resultat = h2jdbc.selectFromDB(req);
            while (resultat.next()){
                listFournisseur.add(resultat.getString(colonne));
            }
        } catch(SQLException ex){
            System.err.println("getAllFournisseur Erreur SQL ! \n"+ex.getMessage());
            System.out.println(req);
            if(ParametreSystem.ErrorShowLogger)
            {
                logger.error("FournisseurDB  : getAllFournisseur :" + ex.getMessage());
            }
            if(ParametreSystem.ErrorShowDialog)
            {
                ShowDialog.setTitre("Erreur SQL !");
                ShowDialog.setDetail(ex.getMessage()+"\n"+ex.getSQLState());
                SD.ShowAletDialog();
            }
        }
        return listFournisseur ;
    }
    
    
    public Fournisseur GetFournisseurDB(String CodeFrs)
    {
        Fournisseur fournisseur= new Fournisseur();
        
        String req = "SELECT * FROM fournisseur WHERE (id_fournisseur = "+CodeFrs+");";
        try {
            ResultSet resultat = h2jdbc.selectFromDB(req);
            while (resultat.next()){
                fournisseur.setCode(CodeFrs);
                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"));
                
                FournisseurContactDB FournisseurContact = new FournisseurContactDB();
                fournisseur.setContactFrs(FournisseurContact.GetListFournisseurContact(CodeFrs));
            }
        } catch(SQLException ex){
            System.err.println("GetFournisseurDB Erreur SQL ! \n"+ex.getMessage());
            System.out.println(req);
            if(ParametreSystem.ErrorShowLogger)
            {
                logger.error("FournisseurDB  : GetFournisseurDB :" + ex.getMessage());
            }
            if(ParametreSystem.ErrorShowDialog)
            {
                ShowDialog.setTitre("Erreur SQL !");
                ShowDialog.setDetail(ex.getMessage()+"\n"+ex.getSQLState());
                SD.ShowAletDialog();
            }
        }
        return fournisseur;
    }
    
    public Fournisseur SetFournisseurDB(Fournisseur Frs)
    {
        String Tele2 = "null"; if(!clt.isStringNull(Frs.getTele2())){ Tele2 = Frs.getTele2();}
        String Fax = "null";if(!clt.isStringNull(Frs.getFax())){ Fax = Frs.getFax();}      
        String Mail = "null"; if(!clt.isStringNull(Frs.getMail())){ Mail = "'"+Frs.getMail().replace("'", "''")+"'";}
        String SiteWeb = "null"; if(!clt.isStringNull(Frs.getSiteWeb())){ SiteWeb = "'"+Frs.getSiteWeb()+"'";}     
        String Specialite = "null";  if(!clt.isStringNull(Frs.getSpecialite())){ Specialite = "'"+Frs.getSpecialite().replace("'", "''")+"'";}    
        
        String req = "INSERT INTO fournisseur (nom, adresse, formes, tele1, tele2, fax, mail, site_web, specialite) VALUES ('"+Frs.getNom().replace("'", "''")+"', '"+Frs.getAdresse().replace("'", "''")+"', '"+Frs.getFormes().replace("'", "''")+"', "+Frs.getTele1()+", "+Tele2+", "+Fax+", "+Mail+", "+SiteWeb+", "+Specialite+");";

        try {
            String CodeFrs = h2jdbc.InsertGetLastId(req);
            Frs.setCode(CodeFrs);
            int SizeContactFrs = Frs.getContactFrs().size();
            if(SizeContactFrs > 0){
                FournisseurContactDB FrsContactDB= new FournisseurContactDB();
                FrsContactDB.SetListFournisseurContact(Frs.getContactFrs(), CodeFrs);
            }
        }catch(SQLException ex){
            System.err.println("SetFournisseurDB Erreur SQL ! \n"+ex.getMessage());
            System.out.println(req);
            if(ParametreSystem.ErrorShowLogger)
            {
                logger.error("FournisseurDB  : SetFournisseurDB :" + ex.getMessage());
            }
            if(ParametreSystem.ErrorShowDialog)
            {
                ShowDialog.setTitre("Erreur SQL !");
                ShowDialog.setDetail(ex.getMessage()+"\n"+ex.getSQLState());
                SD.ShowAletDialog();
            }
        }
        return Frs;
    }
    
    
    public boolean UpdFournisseurDB(Fournisseur Frs)
    {
        contro clt= new contro();
        String Tele2 = "null"; if(!clt.isStringNull(Frs.getTele2())){ Tele2 = Frs.getTele2();}
        String Fax = "null";if(!clt.isStringNull(Frs.getFax())){ Fax = Frs.getFax();}      
        String Mail = "null"; if(!clt.isStringNull(Frs.getMail())){ Mail = "'"+Frs.getMail().replace("'", "''")+"'";}
        String SiteWeb = "null"; if(!clt.isStringNull(Frs.getSiteWeb())){ SiteWeb = "'"+Frs.getSiteWeb()+"'";}     
        String Specialite = "null";  if(!clt.isStringNull(Frs.getSpecialite())){ Specialite = "'"+Frs.getSpecialite().replace("'", "''")+"'";}    
        
        String req = "UPDATE fournisseur SET nom = '"+Frs.getNom().replace("'", "''")+"', adresse = '"+Frs.getAdresse().replace("'", "''")+"', formes = '"+Frs.getFormes().replace("'", "''")+"', Tele1 = '"+Frs.getTele1()+"', Tele2 = "+Tele2+", fax = "+Fax+", mail = "+Mail+", site_web = "+SiteWeb+", specialite = "+Specialite+" WHERE id_fournisseur = "+Frs.getCode()+" ;";
        boolean Result = false;
        int nbr = 0;
        try {
            nbr = h2jdbc.InsertUpdateDeleteInTable(req);
            Result = (nbr>0);
        }catch(SQLException ex){
            System.err.println("UpdFournisseurDB Erreur SQL ! \n"+ex.getMessage());
            System.out.println(req);
            if(ParametreSystem.ErrorShowLogger)
            {
                logger.error("FournisseurDB  : UpdFournisseurDB :" + ex.getMessage());
            }
            if(ParametreSystem.ErrorShowDialog)
            {
                ShowDialog.setTitre("Erreur SQL !");
                ShowDialog.setDetail(ex.getMessage()+"\n"+ex.getSQLState());
                SD.ShowAletDialog();
            }
        }
        return Result;
    }
    
    
    
    /********************************** Initial *******************************/
    
    
    public ObservableList<FournisseurGestionList> SearchFournisseurGestion(Integer debut, Integer nbr, String CodeFournisseur, String NomFournisseur, String AdresseFournisseur, String  TeleFournisseur, String FaxFournisseur, String MailFournisseur)
    {
        ObservableList<FournisseurGestionList> data =FXCollections.observableArrayList();
        
        String Where = "";
        
        if(!clt.isNumericNotnull(CodeFournisseur)){
            Where += " (id_fournisseur = '"+CodeFournisseur+"') AND ";
        }
        
        if(!clt.isStringNull(NomFournisseur)){
            Where += " (nom LIKE '%"+Adaptateur.addSlashes(NomFournisseur)+"%') AND ";
        }
        
        if(!clt.isStringNull(AdresseFournisseur)){
            Where += " (adresse LIKE '%"+Adaptateur.addSlashes(AdresseFournisseur)+"%') AND ";
        }
        
        if(!clt.isStringNull(TeleFournisseur)){
            Where += " (tele1 LIKE '%"+Adaptateur.addSlashes(TeleFournisseur)+"%') AND ";
        }
        
        if(!clt.isStringNull(FaxFournisseur)){
            Where += " (fax LIKE '%"+Adaptateur.addSlashes(FaxFournisseur)+"%') AND ";
        }
        
        if(!clt.isStringNull(MailFournisseur)){
            Where += " (mail LIKE '%"+Adaptateur.addSlashes(MailFournisseur)+"%') AND ";
        }
        
        if(!Where.equals("")){
            Where = Where.substring(0, Where.length() - 4);
            Where = "WHERE  " + Where;
        }
        
        String req="SELECT id_fournisseur, nom, adresse, formes, tele1, tele2, fax, mail, site_web, specialite  "
                + "FROM fournisseur "
                + Where
                + "ORDER BY id_fournisseur DESC "
                + "LIMIT "+debut+" , "+nbr+" ;";
        try {
            ResultSet resultat = h2jdbc.selectFromDB(req);
            while (resultat.next()){
                String id_fournisseur = resultat.getString("id_fournisseur");
                String nom = resultat.getString("nom");
                String adresse = resultat.getString("adresse");
                String type_organisation = resultat.getString("formes");
                String tele1 = resultat.getString("tele1");
                String tele2 = resultat.getString("tele2");
                String fax = resultat.getString("fax");
                String mail = resultat.getString("mail");
                String site_web = resultat.getString("site_web");
                String specialite = resultat.getString("specialite");
                
                data.add(new FournisseurGestionList(id_fournisseur,  nom,  adresse,  type_organisation,  tele1, tele2,  fax,  mail,  site_web,  specialite));
            }
        } catch(SQLException ex){
            System.err.println("SearchFournisseurGestion Erreur SQL ! \n"+ex.getMessage());
            System.out.println(req);
            if(ParametreSystem.ErrorShowLogger)
            {
                logger.error("FournisseurDB  : SearchFournisseurGestion :" + ex.getMessage());
            }
            if(ParametreSystem.ErrorShowDialog)
            {
                ShowDialog.setTitre("Erreur SQL !");
                ShowDialog.setDetail(ex.getMessage()+"\n"+ex.getSQLState());
                SD.ShowAletDialog();
            }
        }
        return data ;
    }
    
    public Integer nbrFournisseurGestion(String CodeFournisseur, String NomFournisseur, String AdresseFournisseur, String  TeleFournisseur, String FaxFournisseur, String MailFournisseur)
    {
        String Where = "";
        
        if(!clt.isNumericNotnull(CodeFournisseur)){
            Where += " (id_fournisseur = '"+CodeFournisseur+"') AND ";
        }
        
        if(!clt.isStringNull(NomFournisseur)){
            Where += " (nom LIKE '%"+Adaptateur.addSlashes(NomFournisseur)+"%') AND ";
        }
        
        if(!clt.isStringNull(AdresseFournisseur)){
            Where += " (adresse LIKE '%"+Adaptateur.addSlashes(AdresseFournisseur)+"%') AND ";
        }
        
        if(!clt.isStringNull(TeleFournisseur)){
            Where += " (tele1 LIKE '%"+Adaptateur.addSlashes(TeleFournisseur)+"%') AND ";
        }
        
        if(!clt.isStringNull(FaxFournisseur)){
            Where += " (fax LIKE '%"+Adaptateur.addSlashes(FaxFournisseur)+"%') AND ";
        }
        
        if(!clt.isStringNull(MailFournisseur)){
            Where += " (mail LIKE '%"+Adaptateur.addSlashes(MailFournisseur)+"%') AND ";
        }
        
        if(!Where.equals("")){
            Where = Where.substring(0, Where.length() - 4);
            Where = "WHERE  " + Where;
        }
        
        String req=" SELECT COUNT(id_fournisseur) " 
                    + " FROM fournisseur  "
                    + Where+ " ;"; 
        
        int sommme =0;
        try {
            ResultSet resultat = h2jdbc.selectFromDB(req);
            resultat.next();
            sommme = resultat.getInt(1);
        } catch(SQLException ex){
            System.err.println("nbrFournisseurGestion Erreur SQL ! \n"+ex.getMessage());
            System.out.println(req);
            if(ParametreSystem.ErrorShowLogger)
            {
                logger.error("FournisseurDB  : nbrFournisseurGestion :" + ex.getMessage());
            }
            if(ParametreSystem.ErrorShowDialog)
            {
                ShowDialog.setTitre("Erreur SQL !");
                ShowDialog.setDetail(ex.getMessage()+"\n"+ex.getSQLState());
                SD.ShowAletDialog();
            }
        }
        return sommme ;
    }
    
    public ObservableList<Fournisseur> getAllFournisseurs()
    {
        ObservableList<Fournisseur> data =FXCollections.observableArrayList();
        
        String req="SELECT id_fournisseur, nom, adresse, formes, tele1, tele2, fax, mail, site_web, specialite  "
                + "FROM fournisseur "
                + "ORDER BY id_fournisseur DESC ;";
        try {
            ResultSet resultat = h2jdbc.selectFromDB(req);
            while (resultat.next()){
                Fournisseur fournisseur = new Fournisseur();
                fournisseur.setCode(resultat.getString("id_fournisseur"));
                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"));
                data.add(fournisseur);
            }
        } catch(SQLException ex){
            System.err.println("SearchFournisseurGestion Erreur SQL ! \n"+ex.getMessage());
            System.out.println(req);
            if(ParametreSystem.ErrorShowLogger)
            {
                logger.error("FournisseurDB  : SearchFournisseurGestion :" + ex.getMessage());
            }
        }
        return data ;
    }
    
}
