package Models.Stock;

import Controllers.Dialog.ShowDialog;
import Controllers.Stock.BondeEntrerDetailController;
import Controllers.Stock.ListProduitBon;
import Controllers.Stock.ListProduitRech;
import static Controllers.Traitement.Adaptateur.StringToFloat;
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 BondeEntrerDB {
    
    H2JDBC h2jdbc = new H2JDBC();
    ShowDialog SD = new ShowDialog();
    Logger logger = Logger.getLogger(BondeEntrerDB.class.getName());
    contro clt = new contro();
    
    public ObservableList<ListProduitRech> getdataProdBE(String  ref,String  desig,String  marq,String  catego)
    {
        ObservableList<ListProduitRech> data = FXCollections.observableArrayList();
        
        String req = "SELECT * FROM produit WHERE reference LIKE '%"+ref+"%'  AND nomcategorie_cate LIKE '%"+catego+"%' AND designation LIKE '%"+desig+"%' AND  marque LIKE '%"+marq+"%' ORDER BY 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");
                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);
            if(ParametreSystem.ErrorShowLogger)
            {
                logger.error("BondeEntrerDB  : getdataProdBE :" + ex.getMessage());
            }
            if(ParametreSystem.ErrorShowDialog)
            {
                ShowDialog.setTitre("Erreur SQL !");
                ShowDialog.setDetail(ex.getMessage()+"\n"+ex.getSQLState());
                SD.ShowAletDialog();
            }
        }
       return data ;
    }
    
    
    public boolean VerifyIdBonEnter(String idbonenter)
    {
        //true id exsiste       false n'exsiste pas
        int nombreLignes = 0 ;
        
        String req="SELECT COUNT(*) FROM entre WHERE id_entre = "+idbonenter+" ;";
        
         try {
            ResultSet resultat = h2jdbc.selectFromDB(req);
            resultat.next();
            nombreLignes = resultat.getInt(1);
        } catch(SQLException ex){
            System.err.println("Erreur SQL ! \n"+ex.getMessage());
            System.out.println(req);
            if(ParametreSystem.ErrorShowLogger)
            {
                logger.error("BondeEntrerDB  : VerifyIdBonEnter :" + ex.getMessage());
            }
            if(ParametreSystem.ErrorShowDialog)
            {
                ShowDialog.setTitre("Erreur SQL !");
                ShowDialog.setDetail(ex.getMessage()+"\n"+ex.getSQLState());
                SD.ShowAletDialog();
            }
        }
        return (nombreLignes>0) ;
    }
    
    
    /******************************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)
    {
        int nbr = 0;
        
        String dateBonEnter = "'"+mybe.getDate()+"'";
        if(clt.isStringNull(mybe.getDate())){
            dateBonEnter = "now()"; 
        }
        
        String req = "INSERT INTO entre (id_entre, date, heur, local_emetteur, local_recepteur, transporteur) VALUES ('"+mybe.getId()+"', "+dateBonEnter+", now(), '"+mybe.getLocal_emetteur()+"', '"+mybe.getLocal_recepteur()+"', '"+mybe.getTransporteur()+"');";
        
        try {
            String IdEnter = h2jdbc.InsertGetLastId(req);
            if(IdEnter != null)
            {
                String Query = "INSERT INTO liste_produit_entre (id_bon_entre, reference_produit, designation ,quantite, tva, prix_vente_ttc) VALUES ";
	        
                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, mybe.getDate()));
                }
                Query = Query.substring(0, Query.length()-1)+";";
                
                try {
                    nbr = h2jdbc.InsertUpdateDeleteInTable(Query);
                    
                }catch(SQLException ex){
                    System.err.println("Erreur SQL ! \n"+ex.getMessage());
                    System.out.println(Query);
                    if(ParametreSystem.ErrorShowLogger)
                    {
                        logger.error("BondeEntrerDB  :  :" + ex.getMessage());
                    }
                    if(ParametreSystem.ErrorShowDialog)
                    {
                        ShowDialog.setTitre("Erreur SQL !");
                        ShowDialog.setDetail(ex.getMessage()+"\n"+ex.getSQLState());
                        SD.ShowAletDialog();
                    }
                }
                
                new StockDetailDB().InsertStockDetail(ListStockDetail);
                
                BondeEntrerDetailController.id_bondentree = mybe.getId() ;
            }
        }catch(SQLException ex){
            System.err.println("addBonEntrer Erreur SQL ! \n"+ex.getMessage());
            System.out.println(req);
            if(ParametreSystem.ErrorShowLogger)
            {
                logger.error("BondeEntrerDB  : addBonEntrer :" + ex.getMessage());
            }
            if(ParametreSystem.ErrorShowDialog)
            {
                ShowDialog.setTitre("Erreur SQL !");
                ShowDialog.setDetail(ex.getMessage()+"\n"+ex.getSQLState());
                SD.ShowAletDialog();
            }
        }
        return (nbr>0); 
    }
    
    
    /******************************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+" ;";
        
        try {
            ResultSet resultat = h2jdbc.selectFromDB(req);
            while (resultat.next()){
                bonenter.setId(resultat.getString("id_entre"));
                bonenter.setDate(resultat.getString("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"));
            }
            String reqPro = "SELECT * FROM liste_produit_entre , produit WHERE reference=reference_produit AND id_bon_entre= "+id_BonEntree+" ;";
            ObservableList<ListProduitBon> data = FXCollections.observableArrayList();
            try {
                ResultSet resultatListePro = h2jdbc.selectFromDB(reqPro);
                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("getBonEntree Erreur SQL ! \n"+ex.getMessage());
                System.out.println(reqPro);
                if(ParametreSystem.ErrorShowLogger)
                {
                    logger.error("BondeEntrerDB  : getBonEntree :" + ex.getMessage());
                }
                if(ParametreSystem.ErrorShowDialog)
                {
                    ShowDialog.setTitre("Erreur SQL !");
                    ShowDialog.setDetail(ex.getMessage()+"\n"+ex.getSQLState());
                    SD.ShowAletDialog();
                }
            }
        } catch(SQLException ex){
            System.err.println("getBonEntree Erreur SQL ! \n"+ex.getMessage());
            System.out.println(req);
            if(ParametreSystem.ErrorShowLogger)
            {
                logger.error("BondeEntrerDB  : getBonEntree :" + ex.getMessage());
            }
            if(ParametreSystem.ErrorShowDialog)
            {
                ShowDialog.setTitre("Erreur SQL !");
                ShowDialog.setDetail(ex.getMessage()+"\n"+ex.getSQLState());
                SD.ShowAletDialog();
            }
        }
        return bonenter ;
    }
    



}
