package Models.Stock;

import Controllers.Dialog.ShowDialog;
import Controllers.Stock.BondeSortieDetailController;
import Controllers.Stock.ListProduitBon;
import Controllers.Stock.ListProduitRech;
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 BondeSortieDB {
   
    H2JDBC h2jdbc = new H2JDBC();
    ShowDialog SD = new ShowDialog();
    Logger logger = Logger.getLogger(BondeSortieDB.class.getName());
    contro clt = new contro();
    
    public ObservableList<ListProduitRech> getdataProdBS(String  ref, String  desig, String  marq, 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 '%"+ref+"%'  AND p.nomcategorie_cate LIKE '%"+catego+"%' AND p.designation LIKE '%"+desig+"%' AND  p.marque LIKE '%"+marq+"%' 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 '%"+ref+"%'  AND p.nomcategorie_cate LIKE '%"+catego+"%' AND p.designation LIKE '%"+desig+"%' AND  p.marque LIKE '%"+marq+"%' 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 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("getdataProdBS Erreur SQL ! \n"+ex.getMessage());
            System.out.println(req);
            if(ParametreSystem.ErrorShowLogger)
            {
                logger.error("BondeSortieDB  : getdataProdBS :" + ex.getMessage());
            }
            if(ParametreSystem.ErrorShowDialog)
            {
                ShowDialog.setTitre("Erreur SQL !");
                ShowDialog.setDetail(ex.getMessage()+"\n"+ex.getSQLState());
                SD.ShowAletDialog();
            }
        }
        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 ;
        try {
            ResultSet resultat = h2jdbc.selectFromDB(req);
            resultat.next();
            q = resultat.getInt(1);
        } catch(SQLException ex){
            System.err.println("GetQuantiteStock Erreur SQL ! \n"+ex.getMessage());
            System.out.println(req);
            if(ParametreSystem.ErrorShowLogger)
            {
                logger.error("BondeSortieDB  : GetQuantiteStock :" + ex.getMessage());
            }
            if(ParametreSystem.ErrorShowDialog)
            {
                ShowDialog.setTitre("Erreur SQL !");
                ShowDialog.setDetail(ex.getMessage()+"\n"+ex.getSQLState());
                SD.ShowAletDialog();
            }
        }
        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+"' ;";
        
        try {
            ResultSet resultat = h2jdbc.selectFromDB(req);
            while (resultat.next()){
                bonsortie.setId(resultat.getString("id_sortie"));
                bonsortie.setDate(resultat.getString("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"));
            }
            
            String reqPro = "SELECT * FROM liste_produit_sortie , produit WHERE reference=reference_produit AND id_bon_sortie= "+id_BonSortie+" ;";
            ResultSet resultatListePro = h2jdbc.selectFromDB(reqPro);
            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("getBonSortie Erreur SQL ! \n"+ex.getMessage());
            System.out.println(req);
            if(ParametreSystem.ErrorShowLogger)
            {
                logger.error("BondeSortieDB  : getBonSortie :" + ex.getMessage());
            }
            if(ParametreSystem.ErrorShowDialog)
            {
                ShowDialog.setTitre("Erreur SQL !");
                ShowDialog.setDetail(ex.getMessage()+"\n"+ex.getSQLState());
                SD.ShowAletDialog();
            }
        }
        return bonsortie ;
    }
    
    
    
    public boolean addBonSortie(BonSortie mybe)
    {
        Boolean result= false ;
        int nbr = 0;
        
        String dateBonSortie = "'"+mybe.getDate()+"'";
        if(clt.isStringNull(mybe.getDate())){
            dateBonSortie = "now()"; 
        }
        
        String req = "INSERT INTO sortie (date, heur, local_emetteur, local_recepteur, transporteur) VALUES ("+dateBonSortie+", now(), '"+mybe.getLocal_emetteur()+"', '"+mybe.getLocal_recepteur()+"', '"+mybe.getTransporteur()+"');";
        try {
            String IdSortie = h2jdbc.InsertGetLastId(req);
            if(IdSortie != null)
            {
                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, mybe.getDate()));
                }
                Query = Query.substring(0, Query.length()-1)+";";
                
                nbr = h2jdbc.InsertUpdateDeleteInTable(Query);
        
                new StockDetailDB().InsertStockDetail(ListStockDetail);
                 
                BondeSortieDetailController.id_bonsortie = IdSortie ;
            }
        } catch(SQLException ex){
            System.err.println("addBonSortie Erreur SQL ! \n"+ex.getMessage());
            System.out.println(req);
            if(ParametreSystem.ErrorShowLogger)
            {
                logger.error("BondeSortieDB  : addBonSortie :" + ex.getMessage());
            }
            if(ParametreSystem.ErrorShowDialog)
            {
                ShowDialog.setTitre("Erreur SQL !");
                ShowDialog.setDetail(ex.getMessage()+"\n"+ex.getSQLState());
                SD.ShowAletDialog();
            }
        }
        return (nbr>0); 
    }
    
    
    
    
    
    
    
    
    
}
