/*
 * 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.BondeSortieDetailController;
import Controllers.Stock.ListProduitBon;
import Controllers.Stock.ListProduitRech;
import Controllers.Traitement.Adaptateur;
import Controllers.Traitement.ParametreSystem;
import Models.connexion;
import java.sql.ResultSet;
import java.sql.SQLException;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;

/**
 *
 * @author Maher
 */
public class BondeSortieDB {
   
    connexion cnx = new connexion();
    
    
    public ObservableList<ListProduitRech> getdataProdBS(String ref, String desig, String codeBarre, String catego, boolean StockNegative){
        ObservableList<ListProduitRech> data=FXCollections.observableArrayList();
        
        String req="SELECT p.reference, p.designation, p.marque, p.nomcategorie_cate,  p.tva_vente, p.nomcategorie_cate, p.prix_vente_ttc, s.quantite "
                + "FROM stock AS s , produit AS p "
                + "WHERE p.reference = s.produit_reference AND  local_nom = '"+ParametreSystem.NomLocalPC+"' AND (s.quantite > 0) AND (p.reference LIKE '%"+Adaptateur.addSlashes(ref)+"%')  AND (p.nomcategorie_cate LIKE '%"+Adaptateur.addSlashes(catego)+"%') AND (p.designation LIKE '%"+Adaptateur.addSlashes(desig)+"%') AND  (p.code_barre = '"+Adaptateur.addSlashes(codeBarre)+"') ORDER BY p.datecreation DESC ;";
        
        if(StockNegative){
                req="SELECT p.reference, p.designation, p.marque, p.nomcategorie_cate,  p.tva_vente, p.nomcategorie_cate, p.prix_vente_ttc, IFNULL(s.quantite,0) AS quantite " +
                    "FROM  produit p LEFT JOIN stock s ON  p.reference = s.produit_reference " +
                    "WHERE  p.reference LIKE '%"+Adaptateur.addSlashes(ref)+"%'  AND p.nomcategorie_cate LIKE '%"+Adaptateur.addSlashes(catego)+"%' AND p.designation LIKE '%"+Adaptateur.addSlashes(desig)+"%' AND  (p.code_barre = '"+Adaptateur.addSlashes(codeBarre)+"') ORDER BY p.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");
                        String quantite =resultat.getString("quantite");
                        data.add(new ListProduitRech(reference, designation, marque, nomcategorie, prixttc, TVA, quantite));
                    }
                }
            }
            catch(SQLException ex){
                System.err.println("Erreur SQL ! \n"+ex.getMessage());
                System.out.println(req);
            }
        }
       return data ;
    }
    
    public int GetQuantiteStock(String Reference){
        String req = "SELECT quantite FROM stock WHERE produit_reference = '"+Reference+"' AND local_nom = '"+ParametreSystem.NomLocalPC+"' ;";
        Integer q = 0 ;
        if(cnx.ouverture()){
            try {
               ResultSet resultat = cnx.excutionquery(req);
               resultat.last(); //on place le curseur sur le dernier tuple
               if(resultat.getRow()>0){
                  q = resultat.getInt("quantite");
               }
            } 
            catch (SQLException ex) {
                System.err.println("Erreur SQL ! \n"+ex.getMessage());
                System.out.println(req);
            }
        }
        return q ;
    }
    
    /******************************get Bon de Sortie************************************************/
    
    public BonSortie getBonSortie(String id_BonSortie){
        BonSortie bonsortie = new BonSortie();
        
        String req = "SELECT * FROM `sortie` WHERE `id_sortie` = "+id_BonSortie+" AND local_emetteur = '"+ParametreSystem.NomLocalPC+"' ;";
        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
                
                //on récupère le numéro de la ligne
                int nombreLignes = resultat.getRow();
                
                if(nombreLignes>0){
                   
                    bonsortie.setId(resultat.getString("id_sortie"));
                    bonsortie.setDate(resultat.getDate("date"));
                    bonsortie.setHeur(resultat.getTime("heur"));
                    bonsortie.setLocal_emetteur(resultat.getString("local_emetteur"));
                    bonsortie.setLocal_recepteur(resultat.getString("local_recepteur"));
                    bonsortie.setTransporteur(resultat.getString("transporteur"));
                   
                    ///Pour La liste des Produits
                    String reqPro = "SELECT * FROM `liste_produit_sortie` , `produit` WHERE `reference`=`reference_produit` AND `id_bon_sortie`= "+id_BonSortie+" ;";
                    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");
                        Integer quantite =resultatListePro.getInt("quantite");
                        quantite = quantite * -1 ;
                        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.toString(), tva));
                    }
                    bonsortie.setListe_prod(data);
                }
                
            }
            catch(SQLException ex){
                System.err.println("Erreur SQL ! \n"+ex.getMessage());
                System.out.println(req);
            }
        }
        return bonsortie ;
    }
    
    
    
    public boolean addBonSortie(BonSortie mybe){
        Boolean result= false ;
        String req = "INSERT INTO `sortie` (`date`, `heur`, `local_emetteur`, `local_recepteur`, `transporteur`) VALUES ('"+mybe.getDate().toString()+"', CURTIME(), '"+mybe.getLocal_emetteur()+"', '"+mybe.getLocal_recepteur()+"', '"+mybe.getTransporteur()+"');";
        if(cnx.ouverture()){
            String IdSortie = cnx.InsertGetLastId(req);
            if(!IdSortie.isEmpty()){
                
                String Query = "INSERT INTO liste_produit_sortie (id_bon_sortie, reference_produit, designation, quantite, tva, prix_vente_ttc) VALUES ";
	        
                ObservableList<StockDetail> ListStockDetail=FXCollections.observableArrayList();
                    
                for(ListProduitBon listeprod : mybe.getListe_prod()){
                    String TVA =listeprod.getTva().replace("%","").replace(",",".");
                    String TotalTTC= listeprod.getPrixttc().replace(",",".");
                    Float NewQuantite= Adaptateur.StringToFloat(listeprod.getQuantite()) * -1;
                    Query = Query + "("+IdSortie+", '"+listeprod.getReference()+"', \""+listeprod.getDesignaton()+"\", "+NewQuantite+", "+TVA+", '"+TotalTTC+"'),";
                    
                    ListStockDetail.add(new StockDetail(listeprod.getReference(), NewQuantite, null, IdSortie, null, null, null, null));
                    
                }
                Query = Query.substring(0, Query.length()-1)+";";
                
                result = cnx.insertion(Query);
                
                new StockDetailDB().InsertStockDetail(ListStockDetail);
                 
                BondeSortieDetailController.id_bonsortie = IdSortie ;
            }
        }
        
        return result; 
    }
    
    
    
    
    
    
    
    
    
}
