package Models.Produit;


import Controllers.Dialog.ShowDialog;
import Controllers.Traitement.Adaptateur;
import Controllers.Traitement.ParametreSystem;
import Controllers.Traitement.contro;
import Models.connexion;
import java.sql.ResultSet;
import java.sql.SQLException;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;

/**
 * @author Maher Ben Tili
 */
public class ProduitDB {
    
    connexion cnx = new connexion();
    ShowDialog SD = new ShowDialog();
    contro clt = new contro();
    
    public Produit getProduit (String ref)
    {
        Produit prod = new Produit();
        String req = "SELECT * FROM `produit` WHERE (`reference` LIKE '"+Adaptateur.addSlashes(ref)+"') OR (`code_barre` = '"+Adaptateur.addSlashes(ref)+"'); ";
        if(cnx.ouverture()){
            try{
               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() ) {
                        prod.setReference(resultat.getString("reference"));
                        prod.setCodebarre(resultat.getString("code_barre"));
                        prod.setCategorie(resultat.getString("nomcategorie_cate"));
                        prod.setDesignation(resultat.getString("designation"));
                        
                        prod.setCapacite(resultat.getString("capacite"));
                        prod.setCouleur(resultat.getString("couleur"));
                        prod.setDescription(resultat.getString("description"));
                        prod.setDimensions(resultat.getString("dimension"));
                        prod.setGarantie(resultat.getInt("garantie"));
                        
                        prod.setMarque(resultat.getString("marque"));
                        prod.setPoids(resultat.getString("poids"));
                        prod.setPuissance(resultat.getString("puissance"));
                        
                        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());
            }
        }
        return prod ;
    }
    public Integer UpdateProduit (Produit prod ,String ref)
    {
        String Garantie = "NULL";
        if(prod.getGarantie() != null){
            Garantie = "'"+prod.getGarantie()+"'";
        }
        //Adaptateur.addSlashes()
        String req = "UPDATE `produit` SET `reference`= '"+Adaptateur.addSlashes(prod.getReference())+"', `designation`= \""+Adaptateur.addSlashes(prod.getDesignation())+"\", `nomcategorie_cate` = '"+Adaptateur.addSlashes(prod.getCategorie())+"', `marque`= '"+Adaptateur.addSlashes(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` = '"+Adaptateur.addSlashes(prod.getDescription())+"', `poids` = '"+prod.getPoids()+"',  `couleur` = '"+prod.getCouleur()+"', `dimension` = '"+prod.getDimensions()+"',  `vitesse`= '"+prod.getVitesse()+"',  `puissance`= '"+prod.getPuissance()+"', `capacite`='"+prod.getCapacite()+"' WHERE `produit`.`reference` = '"+Adaptateur.addSlashes(ref)+"';" ;
        return cnx.MettreAJour(req);
    }
    
    /********************************** Search *******************************/
    
    public ObservableList<Produit>  SearchProduit(Integer debut, Integer nbr, Boolean stock, String Reference, String Category, String CodeBarre, 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(CodeBarre)){
            Where += " (p.code_barre = '"+Adaptateur.addSlashes(CodeBarre)+"') AND ";
        }
        
        if(!clt.isStringNull(Designation)){
            Where += " (p.designation LIKE \"%"+Adaptateur.addSlashes(Designation)+"%\") AND ";
        }
        
        
        
        String req="SELECT p.reference, p.code_barre, 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.code_barre, 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+"  ;";
        }
        
        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() ) {
                        String reference = resultat.getString("reference");
                        String code_barre = resultat.getString("code_barre");
                        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, code_barre, 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);
            }
        }
        else{
            SD.ShowAletDialog();
        }
       return data ;
        
    }
    
    
    public Integer nbrSearchProduit(Boolean stock, String Reference, String Category, String CodeBarre, 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(CodeBarre)){
            Where += " (p.code_barre = '"+Adaptateur.addSlashes(CodeBarre)+"') 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;
        if(cnx.ouverture()){
            try{
               /* Exécution d'une requête de lecture */
                ResultSet resultat = cnx.excutionquery(req);
                // get the number of rows from the result set
                resultat.next();
                sommme = resultat.getInt(1);
            }
            catch(SQLException ex){
                System.err.println("Erreur SQL ! \n"+ex.getMessage());
                System.out.println(req);
            }
        }
       return sommme ;
    }
    
    
    
    /******************************************************************************/
    public boolean addProduit(Produit prod)
    {
        String Garantie = "NULL";
        if(prod.getGarantie() != null){
            Garantie = "'"+prod.getGarantie()+"'";
        }
        String CodeBarre = "NULL";
        if(prod.getCodebarre()!= null){
            CodeBarre = "'"+prod.getCodebarre()+"'";
        }
        
        String req ="INSERT INTO `produit` (`reference`, `code_barre`, `designation`, `nomcategorie_cate`, `marque`, `garantie`, `prix_achat_ht`, `tva_achat`, `prix_achat_ttc`, `marge`, `prix_vente_ht`, `tva_vente`, `prix_vente_ttc`, `description`, `poids`, `couleur`, `dimension`, `vitesse`, `puissance`, `capacite`,`datecreation`) VALUES ('"+prod.getReference()+"', '"+prod.getCodebarre()+"', '"+Adaptateur.addSlashes(prod.getDesignation())+"', '"+prod.getCategorie()+"', '"+Adaptateur.addSlashes(prod.getMarque())+"', "+Garantie+", '"+prod.getPrixachatht().replace(',','.')+"', '"+prod.getTvaachat().replace(',','.')+"', '"+prod.getPrixachatttc().replace(',','.')+"', '"+prod.getMarge().replace(',','.')+"', '"+prod.getPrixventeht().replace(',','.')+"', '"+prod.getTvavente().replace(',','.')+"', '"+prod.getPrixventettc().replace(',','.')+"', '"+Adaptateur.addSlashes(prod.getDescription())+"', '"+prod.getPoids()+"', '"+prod.getCouleur()+"', '"+prod.getDimensions()+"', '"+prod.getVitesse()+"', '"+prod.getPuissance()+"', '"+prod.getCapacite()+"', CURDATE());";
        return cnx.insertion(req);
    }
    
    public boolean verifyReferenceProduit(String ref)
    {
        boolean result = false ;
        
        if(cnx.ouverture())
        {
            String sql="SELECT * FROM `produit` WHERE `reference` LIKE '"+Adaptateur.addSlashes(ref)+"';";
            
            try {
               ResultSet resultat = cnx.excutionquery(sql);
               resultat.last(); //on place le curseur sur le dernier tuple
               if(resultat.getRow()>0){
                  result= true ;
               }
            } 
            catch (SQLException ex) {
                result= false ;
                System.err.println("Erreur SQL ! \n"+ex.getMessage());
                System.out.println(sql);
            }
       
        }
        return result ;
    }
    
    public boolean verifyCodeBarreProduit(String code_barre)
    {
        boolean result = false ;
        
        if(cnx.ouverture())
        {
            String sql="SELECT * FROM `produit` WHERE `code_barre` = '"+Adaptateur.addSlashes(code_barre)+"';";
            
            try {
               ResultSet resultat = cnx.excutionquery(sql);
               resultat.last(); //on place le curseur sur le dernier tuple
               if(resultat.getRow()>0){
                  result= true ;
               }
            } 
            catch (SQLException ex) {
                result= false ;
                System.err.println("Erreur SQL ! \n"+ex.getMessage());
                System.out.println(sql);
            }
        }
        return result ;
    }
}
