/*
 * 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.Stock;


import Controllers.Stock.BondeEntrerDetailController;
import Controllers.Stock.ListProduitBon;
import Controllers.Stock.ListProduitRech;
import Controllers.Traitement.Adaptateur;
import static Controllers.Traitement.Adaptateur.StringToFloat;
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 BondeEntrerDB {
    
    connexion cnx = new connexion();
    
    contro clt = new contro();
    
    public ObservableList<ListProduitRech> getdataProdBE(String Reference, String Designation, String CodeBarre, String  Category)
    {
        ObservableList<ListProduitRech> data= FXCollections.observableArrayList();
        
        String Where = "";
        
        if(!clt.isStringNull(Reference)){
            Where += " (reference LIKE \"%"+Adaptateur.addSlashes(Reference)+"%\") AND ";
        }
        
        if(!clt.isStringNull(Category)){
            Where += " (nomcategorie_cate LIKE \"%"+Adaptateur.addSlashes(Category)+"%\") AND ";
        }
        
        if(!clt.isStringNull(CodeBarre)){
            Where += " (code_barre = '"+Adaptateur.addSlashes(CodeBarre)+"') AND ";
        }
        
        if(!clt.isStringNull(Designation)){
            Where += " (designation LIKE \"%"+Adaptateur.addSlashes(Designation)+"%\") AND ";
        }
        
        if(!Where.equals("")){
            Where = Where.substring(0, Where.length() - 4);
            Where = "WHERE  " + Where;
        }
        
        String req = "SELECT * FROM `produit` "+Where+" ORDER BY `datecreation` DESC ;";
     
        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 designation=resultat.getString("designation");
                        String marque =resultat.getString("marque");
                        String nomcategorie =resultat.getString("nomcategorie_cate");
                        String prixttc =resultat.getString("prix_vente_ttc");
                        String TVA =resultat.getString("tva_vente");
                        data.add(new ListProduitRech(reference, designation, marque, nomcategorie, prixttc, TVA, ""));
                        
                    }
                }
            }
            catch(SQLException ex){
                System.err.println("Erreur SQL ! \n"+ex.getMessage());
                System.out.println(req);
            }
        }
       return data ;
    }
    
    
    public boolean VerifyIdBonEnter(String idbonenter){
        //true id exsiste       false n'exsiste pas
        boolean result = false ;
        if(cnx.ouverture()){
            String sql="SELECT * FROM `entre` WHERE `id_entre` = "+idbonenter+" ;";
            
            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) {
                System.err.println("Erreur SQL ! \n"+ex.getMessage());
                System.out.println(sql);
            }
        }
        return result ;
    }
    
    
    /******************************Insertion Bon d'entrée************************************************/
    // 1) il faut insérer la bon enter table "enter"
    // 2) il faut insérer la liste des produits qui corsponder à la bon d'enter table "liste_produit_entre"
    // 3) appéle à la fonction PLSQL "addBonEntrer" qui se charge a insérer les données à les table suivant:
    // 3.1) insertion dans la table "liste_produit_entre"
    // 3.2) insertion dans la table "detail_stock"
    // 3.2) insertion dans la table "detail_entre" les données 'idBonEnter', LAST_INSERT_ID de 'detail_stock'
    // 3.3) update ou insertion les produit à la table "stock"
    // 3.4) Si le traitement est effectuer comme prévu la fonction "addBonEntrer" retourne 4
    
    public boolean addBonEntrer(BonEntree mybe, ObservableList<ListProduitBon> data){
        Boolean result= false ;
        String req = "INSERT INTO `entre` (`id_entre`, `date`, `heur`, `local_emetteur`, `local_recepteur`, `transporteur`) VALUES ('"+mybe.getId()+"', '"+mybe.getDate().toString()+"', CURTIME(), '"+mybe.getLocal_emetteur()+"', '"+mybe.getLocal_recepteur()+"', '"+mybe.getTransporteur()+"');";
        if(cnx.ouverture()){
            String  IdEnter = cnx.InsertGetLastId(req);
            if(IdEnter != null){
                
                String Query = "INSERT INTO liste_produit_entre (id_bon_entre, reference_produit, designation ,quantite, tva, prix_vente_ttc) VALUE ";
	        
                ObservableList<StockDetail> ListStockDetail=FXCollections.observableArrayList();
                
                for(ListProduitBon listeprod : data){
                    String TVA =listeprod.getTva().replace("%","").replace(",",".");
                    String TotalTTC= listeprod.getPrixttc().replace(",",".");
                    Query = Query + "("+IdEnter+", '"+listeprod.getReference()+"', \""+listeprod.getDesignaton()+"\", "+listeprod.getQuantite()+", "+TVA+", '"+TotalTTC+"'),";
                    
                    ListStockDetail.add(new StockDetail(listeprod.getReference(), StringToFloat(listeprod.getQuantite()), IdEnter, null, null, null, null, null));
                }
                Query = Query.substring(0, Query.length()-1)+";";
                
                result = cnx.insertion(Query);
                
                new StockDetailDB().InsertStockDetail(ListStockDetail);
                
                BondeEntrerDetailController.id_bondentree = mybe.getId() ;
            }
        }
        
        return result; 
    }
    
    
    /******************************get Bon d'entrée************************************************/
    
    public BonEntree getBonEntree(String id_BonEntree){
        BonEntree bonenter = new BonEntree();
        String req = "SELECT * FROM `entre` WHERE `id_entre` = "+id_BonEntree+" ;";
        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() ) {
                        bonenter.setId(resultat.getString("id_entre"));
                        bonenter.setDate(resultat.getDate("date"));
                        bonenter.setHeur(resultat.getTime("heur"));
                        bonenter.setLocal_emetteur(resultat.getString("local_emetteur"));
                        bonenter.setLocal_recepteur(resultat.getString("local_recepteur"));
                        bonenter.setTransporteur(resultat.getString("transporteur"));
                    }
                   
                    ///Pour La liste des Produits
                    String reqPro = "SELECT * FROM `liste_produit_entre` , `produit` WHERE `reference`=`reference_produit` AND `id_bon_entre`= "+id_BonEntree+" ;";
                    ResultSet resultatListePro = cnx.excutionquery(reqPro);
                    resultatListePro.last();
                    resultatListePro.beforeFirst();
                    ObservableList<ListProduitBon> data=FXCollections.observableArrayList();
                    while ( resultatListePro.next() ) {
                        String reference = resultatListePro.getString("reference_produit");
                        String designation=resultatListePro.getString("designation");
                        String quantite =resultatListePro.getString("quantite");
                        String marque =resultatListePro.getString("marque");
                        String nomcategorie =resultatListePro.getString("nomcategorie_cate");
                        String tva =resultatListePro.getString("tva_vente");
                        String prix_vente_ttc =resultatListePro.getString("prix_vente_ttc"); 
                        data.add(new ListProduitBon(reference, designation, marque, nomcategorie, prix_vente_ttc, quantite, tva));
                        
                    }
                    bonenter.setListe_prod(data);
                }
            }
            catch(SQLException ex){
                System.err.println("Erreur SQL ! \n"+ex.getMessage());
                System.out.println(req);
            }
        }
        return bonenter ;
    }
    



}
