package Models.Produit;


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

/**
 * @author Maher Ben Tili
 */
public class ProduitDB {
    
    H2JDBC h2jdbc = new H2JDBC();
    ShowDialog SD = new ShowDialog();
    contro clt = new contro();
    
    Logger logger = Logger.getLogger(ProduitDB.class.getName());
    
    public Produit getProduit (String ref)
    {
        Produit prod = new Produit();
        String req = "SELECT * FROM produit WHERE reference LIKE '"+ref+"' ; ";
        
        try {
            ResultSet resultat = h2jdbc.selectFromDB(req);
            while (resultat.next()){
                prod.setCapacite(resultat.getString("capacite"));
                prod.setCategorie(resultat.getString("nomcategorie_cate"));
                prod.setCouleur(resultat.getString("couleur"));
                prod.setDescription(resultat.getString("description"));
                prod.setDesignation(resultat.getString("designation"));
                prod.setDimensions(resultat.getString("dimension"));
                prod.setGarantie(resultat.getInt("garantie"));
                
                prod.setQualiteString(resultat.getString("qualite"));
                prod.setMarque(resultat.getString("marque"));
                prod.setPoids(resultat.getString("poids"));
                prod.setPuissance(resultat.getString("puissance"));
                prod.setReference(resultat.getString("reference"));
                
                prod.setPrixachatht(Adaptateur.ArrondStringToString(resultat.getString("prix_achat_ht")));
                prod.setTvaachat(Adaptateur.ArrondStringToString(resultat.getString("tva_achat")));
                prod.setPrixachatttc(Adaptateur.ArrondStringToString(resultat.getString("prix_achat_ttc")));
                
                prod.setMarge(Adaptateur.ArrondStringToString(resultat.getString("marge")));
                
                prod.setPrixventeht(Adaptateur.ArrondStringToString(resultat.getString("prix_vente_ht")));
                prod.setTvavente(Adaptateur.ArrondStringToString(resultat.getString("tva_vente")));
                prod.setPrixventettc(Adaptateur.ArrondStringToString(resultat.getString("prix_vente_ttc")));
                
                prod.setVitesse(resultat.getString("vitesse"));
            }
        } catch(SQLException ex){
            System.err.println("Erreur SQL ! \n"+ex.getMessage());
            System.out.println(req);
            if(ParametreSystem.ErrorShowLogger)
            {
                logger.error("ProduitDB  : getProduit :" + ex.getMessage());
            }
            if(ParametreSystem.ErrorShowDialog)
            {
                ShowDialog.setTitre("Erreur SQL !");
                ShowDialog.setDetail(ex.getMessage()+"\n"+ex.getSQLState());
                SD.ShowAletDialog();
            }
        }
        return prod ;
    }
    
    public Integer UpdateProduit (Produit prod, String ref)
    {
        String Garantie = "NULL";
        if(prod.getGarantie() != null){
            Garantie = "'"+prod.getGarantie()+"'";
        }
        
        String sql = "UPDATE produit SET reference= '"+prod.getReference()+"', designation= '"+prod.getDesignation()+"', nomcategorie_cate = '"+prod.getCategorie()+"', marque= '"+prod.getMarque()+"', garantie= "+Garantie+", prix_achat_ht = '"+prod.getPrixachatht()+"', tva_achat = '"+prod.getTvaachat()+"', prix_achat_ttc = '"+prod.getPrixachatttc()+"', marge = '"+prod.getMarge()+"', prix_vente_ht = '"+prod.getPrixventeht()+"', tva_vente = '"+prod.getTvavente()+"', prix_vente_ttc = '"+prod.getPrixventettc()+"', description = '"+prod.getDescription()+"', poids = '"+prod.getPoids()+"',  couleur = '"+prod.getCouleur()+"', dimension = '"+prod.getDimensions()+"',  vitesse= '"+prod.getVitesse()+"',  puissance= '"+prod.getPuissance()+"', capacite='"+prod.getCapacite()+"' WHERE produit.reference = '"+ref+"';" ;
        
        int nbr = 0;
        try {
            nbr = h2jdbc.InsertUpdateDeleteInTable(sql);
        }catch(SQLException ex){
            System.err.println("Erreur SQL ! \n"+ex.getMessage());
            System.out.println(sql);
            if(ParametreSystem.ErrorShowLogger)
            {
                logger.error("ProduitDB  : UpdateProduit :" + ex.getMessage());
            }
            if(ParametreSystem.ErrorShowDialog)
            {
                ShowDialog.setTitre("Erreur SQL !");
                ShowDialog.setDetail(ex.getMessage()+"\n"+ex.getSQLState());
                SD.ShowAletDialog();
            }
        }
        return nbr;
    }
    
    /********************************** Search *******************************/
    
    public ObservableList<Produit>  SearchProduit(Integer debut, Integer nbr, Boolean stock, String Reference, String Category, String Marque, String Designation)
    {
        ObservableList<Produit> data =FXCollections.observableArrayList();
        
        String Where = "";
        
        if(!clt.isStringNull(Reference)){
            Where += " (p.reference LIKE '%"+Adaptateur.addSlashes(Reference)+"%') AND ";
        }
        
        if(!clt.isStringNull(Category)){
            Where += " (p.nomcategorie_cate LIKE '%"+Adaptateur.addSlashes(Category)+"%') AND ";
        }
        
        if(!clt.isStringNull(Marque)){
            Where += " (p.marque LIKE '%"+Adaptateur.addSlashes(Marque)+"%') AND ";
        }
        
        if(!clt.isStringNull(Designation)){
            Where += " (p.designation LIKE '%"+Adaptateur.addSlashes(Designation)+"%') AND ";
        }
        
        String req="SELECT p.reference, p.designation, p.marque, p.nomcategorie_cate, p.marge, p.tva_vente, p.nomcategorie_cate, p.prix_vente_ttc, IFNULL(s.quantite,0) AS quantite, IFNULL(p.prix_vente_ht,0) AS prix_vente_ht, IFNULL(p.prix_vente_ttc,0) AS prix_vente_ttc, IFNULL(p.tva_vente,0) AS tva_vente, IFNULL(p.prix_achat_ht,0) AS prix_achat_ht, IFNULL(p.prix_achat_ttc,0) AS prix_achat_ttc, IFNULL(p.tva_achat,0) AS tva_achat " +
                    "FROM  produit p, stock s " +
                    "WHERE  " + Where +
                    " (p.reference = s.produit_reference) AND (s.local_nom = '"+ParametreSystem.NomLocalPC+"') "+
                    "ORDER BY p.datecreation DESC "+
                    "LIMIT "+debut+" , "+nbr ;
        //true stock négative (vente produit en négatif)
        if(stock){
            if(!Where.equals("")){
                Where = Where.substring(0, Where.length() - 4);
                Where = "WHERE  " + Where;
            }
            
            req= "SELECT p.reference, p.designation, p.marque, p.nomcategorie_cate, p.marge, p.tva_vente, p.nomcategorie_cate, p.prix_vente_ttc, IFNULL(s.quantite,0) AS quantite, IFNULL(p.prix_vente_ht,0) AS prix_vente_ht, IFNULL(p.prix_vente_ttc,0) AS prix_vente_ttc, IFNULL(p.tva_vente,0) AS tva_vente, IFNULL(p.prix_achat_ht,0) AS prix_achat_ht, IFNULL(p.prix_achat_ttc,0) AS prix_achat_ttc, IFNULL(p.tva_achat,0) AS tva_achat  " +
                    "FROM  produit p " +
                    "LEFT JOIN stock s ON  p.reference = s.produit_reference " +
                    Where +
                    "ORDER BY p.datecreation DESC " +
                    "LIMIT "+debut+" , "+nbr+"  ;";
        }
        
        try {
            ResultSet resultat = h2jdbc.selectFromDB(req);
            while (resultat.next()){
                String reference = resultat.getString("reference");
                String designation=resultat.getString("designation");
                String marque =resultat.getString("marque");
                String nomcategorie =resultat.getString("nomcategorie_cate");
                String quantite = Adaptateur.ArrondStringToString(resultat.getString("quantite"));
                
                String prix_vente_ht = Adaptateur.ArrondStringToString(resultat.getString("prix_vente_ht")); 
                String prix_vente_ttc= Adaptateur.ArrondStringToString(resultat.getString("prix_vente_ttc")); 
                String tva_vente= Adaptateur.ArrondStringToString(resultat.getString("tva_vente"));
                
                String marge = Adaptateur.ArrondStringToString(resultat.getString("marge"));
                
                String prix_achat_ht = Adaptateur.ArrondStringToString(resultat.getString("prix_achat_ht")); 
                String prix_achat_ttc = Adaptateur.ArrondStringToString(resultat.getString("prix_achat_ttc")); 
                String tva_achat = Adaptateur.ArrondStringToString(resultat.getString("tva_achat"));
                
                data.add(new Produit(reference, designation, marque, nomcategorie, quantite, prix_vente_ht, prix_vente_ttc, tva_vente, marge, prix_achat_ht, prix_achat_ttc, tva_achat));
            }
        } catch(SQLException ex){
            System.err.println("Erreur SQL ! \n"+ex.getMessage());
            System.out.println(req);
            if(ParametreSystem.ErrorShowLogger)
            {
                logger.error("ProduitDB  :  :" + ex.getMessage());
            }
            if(ParametreSystem.ErrorShowDialog)
            {
                ShowDialog.setTitre("Erreur SQL !");
                ShowDialog.setDetail(ex.getMessage()+"\n"+ex.getSQLState());
                SD.ShowAletDialog();
            }
        }
        return data ;
    }
    
    
    public Integer nbrSearchProduit(Boolean stock, String Reference, String Category, String Marque, String Designation)
    {
        String Where = "";
        
        if(!clt.isStringNull(Reference)){
            Where += " (p.reference LIKE '%"+Adaptateur.addSlashes(Reference)+"%') AND ";
        }
        
        if(!clt.isStringNull(Category)){
            Where += " (p.nomcategorie_cate LIKE '%"+Adaptateur.addSlashes(Category)+"%') AND ";
        }
        
        if(!clt.isStringNull(Marque)){
            Where += " (p.marque LIKE '%"+Adaptateur.addSlashes(Marque)+"%') AND ";
        }
        
        if(!clt.isStringNull(Designation)){
            Where += " (p.designation LIKE '%"+Adaptateur.addSlashes(Designation)+"%') AND ";
        }
        
        String req="SELECT COUNT(p.reference) " +
                    "FROM  produit p, stock s " +
                    "WHERE  " + Where +
                    " (p.reference = s.produit_reference) AND (s.local_nom = '"+ParametreSystem.NomLocalPC+"') ;";
        
        //true stock négative (vente produit en négatif)
        if(stock){
            if(!Where.equals("")){
                Where = Where.substring(0, Where.length() - 4);
                Where = "WHERE  " + Where;
            }
            req = "SELECT count(*) FROM produit p "+ Where + " ;";
        }
        
        int sommme =0;
        try {
            ResultSet resultat = h2jdbc.selectFromDB(req);
            resultat.next();
            sommme = resultat.getInt(1);
        } catch(SQLException ex){
            System.err.println("Erreur SQL ! \n"+ex.getMessage());
            System.out.println(req);
            if(ParametreSystem.ErrorShowLogger)
            {
                logger.error("ProduitDB  : nbrSearchProduit :" + ex.getMessage());
            }
            if(ParametreSystem.ErrorShowDialog)
            {
                ShowDialog.setTitre("Erreur SQL !");
                ShowDialog.setDetail(ex.getMessage()+"\n"+ex.getSQLState());
                SD.ShowAletDialog();
            }
        }
        return sommme ;
    }
    
    
    
    /******************************************************************************/
    public boolean addProduit(Produit prod)
    {
        String Garantie = "NULL";
        if(prod.getGarantie() != null){
            Garantie = "'"+prod.getGarantie()+"'";
        }
        String Qualite = "NULL";
        if(prod.getQualite()!= null){
            Qualite = "'"+prod.getQualite()+"'";
        }
        
        String req ="INSERT INTO produit (reference, designation, nomcategorie_cate, marque, garantie, prix_achat_ht, tva_achat, prix_achat_ttc, marge, prix_vente_ht, tva_vente, prix_vente_ttc, description, qualite, poids, couleur, dimension, vitesse, puissance, capacite,datecreation) VALUES ('"+prod.getReference()+"', '"+prod.getDesignation()+"', '"+prod.getCategorie()+"', '"+prod.getMarque()+"', "+Garantie+", '"+prod.getPrixachatht().replace(',','.')+"', '"+prod.getTvaachat().replace(',','.')+"', '"+prod.getPrixachatttc().replace(',','.')+"', '"+prod.getMarge().replace(',','.')+"', '"+prod.getPrixventeht().replace(',','.')+"', '"+prod.getTvavente().replace(',','.')+"', '"+prod.getPrixventettc().replace(',','.')+"', '"+prod.getDescription().replaceAll("'", "\\\\'")+"', "+Qualite+", '"+prod.getPoids()+"', '"+prod.getCouleur()+"', '"+prod.getDimensions()+"', '"+prod.getVitesse()+"', '"+prod.getPuissance()+"', '"+prod.getCapacite()+"', now());";
        
        int nbr = 0;
        try {
            nbr = h2jdbc.InsertUpdateDeleteInTable(req);
        }catch(SQLException ex){
            System.err.println("Erreur SQL ! \n"+ex.getMessage());
            System.out.println(req);
            if(ParametreSystem.ErrorShowLogger)
            {
                logger.error("ProduitDB  : addProduit :" + ex.getMessage());
            }
            if(ParametreSystem.ErrorShowDialog)
            {
                ShowDialog.setTitre("Erreur SQL !");
                ShowDialog.setDetail(ex.getMessage()+"\n"+ex.getSQLState());
                SD.ShowAletDialog();
            }
        }
        return (nbr>0);
    }
    
    public boolean verifyReferenceProduit(String ref)
    {
        String req = "SELECT COUNT(*) FROM produit WHERE reference LIKE '"+ref+"';";
        int nbr = 0;
        try {
            ResultSet resultat = h2jdbc.selectFromDB(req);
            resultat.last();
            nbr = resultat.getRow();
        } catch(SQLException ex){
            System.err.println("Erreur SQL ! \n"+ex.getMessage());
            System.out.println(req);
            if(ParametreSystem.ErrorShowLogger)
            {
                logger.error("ProduitDB  : verifyReferenceProduit :" + ex.getMessage());
            }
            if(ParametreSystem.ErrorShowDialog)
            {
                ShowDialog.setTitre("Erreur SQL !");
                ShowDialog.setDetail(ex.getMessage()+"\n"+ex.getSQLState());
                SD.ShowAletDialog();
            }
        }
        return (nbr>0) ;
    }
    
    
    public ObservableList<Produit>  getAllProduits()
    {
        ObservableList<Produit> data =FXCollections.observableArrayList();
        
        String req="SELECT *  FROM  produit p ORDER BY p.datecreation DESC";
        
        try {
            ResultSet resultat = h2jdbc.selectFromDB(req);
            while (resultat.next()){
                String reference = resultat.getString("reference");
                String designation=resultat.getString("designation");
                String marque =resultat.getString("marque");
                String nomcategorie =resultat.getString("nomcategorie_cate");
                
                String prix_vente_ht = Adaptateur.ArrondStringToString(resultat.getString("prix_vente_ht")); 
                String prix_vente_ttc= Adaptateur.ArrondStringToString(resultat.getString("prix_vente_ttc")); 
                String tva_vente= Adaptateur.ArrondStringToString(resultat.getString("tva_vente"));
                
                String marge = Adaptateur.ArrondStringToString(resultat.getString("marge"));
                
                String prix_achat_ht = Adaptateur.ArrondStringToString(resultat.getString("prix_achat_ht")); 
                String prix_achat_ttc = Adaptateur.ArrondStringToString(resultat.getString("prix_achat_ttc")); 
                String tva_achat = Adaptateur.ArrondStringToString(resultat.getString("tva_achat"));
                
                data.add(new Produit(reference, designation, marque, nomcategorie, "0", prix_vente_ht, prix_vente_ttc, tva_vente, marge, prix_achat_ht, prix_achat_ttc, tva_achat));
            }
        } catch(SQLException ex){
            System.err.println("Erreur SQL ! \n"+ex.getMessage());
            System.out.println(req);
            if(ParametreSystem.ErrorShowLogger)
            {
                logger.error("ProduitDB  :  :" + ex.getMessage());
            }
        }
        return data ;
    }
    
}
