package Models.Stock;

import Controllers.Dialog.ShowDialog;
import static Controllers.Traitement.Adaptateur.StringDeleZero;
import Controllers.Traitement.ParametreSystem;
import Controllers.Traitement.contro;
import Models.H2JDBC;
import Models.Produit.ListeProduit;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import org.apache.log4j.Logger;


public class StockDB {
    
    H2JDBC h2jdbc = new H2JDBC();
    ShowDialog SD = new ShowDialog();
    Logger logger = Logger.getLogger(StockDB.class.getName());
    
    contro Controle = new contro();
    
    public  ObservableList<ListeMouvement> getDataStockDetail(String local, String reference, String date_debut, Integer debut, Integer nbr)
    {
        ObservableList<ListeMouvement> ListMouvement = FXCollections.observableArrayList();
        
        String WhereDate = "";
        if(!Controle.isStringNull(date_debut)){
            WhereDate = " AND (CAST(date_add AS DATE) >= '"+date_debut+"') ";
        }
        String req = " SELECT  *, to_char(date_add, 'dd/mm/yyyy hh:ii') as dateAdd ";
        req += " FROM stock_detail ";
        req += " WHERE (local_nom LIKE '"+local+"') ";
        req += " AND (reference_produit LIKE '"+reference+"') ";
        req += WhereDate;
        req += " ORDER BY date_add DESC ";
        
        if(debut!= null && nbr!=null){
           req += " LIMIT "+debut+" , "+nbr+";";
        }
        try {
            ResultSet resultat = h2jdbc.selectFromDB(req);
            while (resultat.next())
            {
                String quantite = StringDeleZero(resultat.getString("quantite"));
                float quantity = resultat.getFloat("quantite");
                
                String dateAdd = resultat.getString("dateAdd");
                
                String id_bon_entre = resultat.getString("id_bon_entre");
                String id_bon_sortie = resultat.getString("id_bon_sortie");
                String id_bon_livraison = resultat.getString("id_bon_livraison");
                String id_bon_reception = resultat.getString("id_bon_reception");
                String id_facture_frs = resultat.getString("id_facture_frs");
                String id_vente_sans_facture = resultat.getString("id_vente_sans_facture");
                
                String code = "";
                String type = "";
                
                String mouvement = "enter";
                if(quantity<0){ mouvement = "sortie";}
                
                if(!Controle.isStringNull(id_bon_entre)){
                    code = id_bon_entre;
                    type = "Bon d'entrée";
                }else if(!Controle.isStringNull(id_bon_sortie)){
                    code = id_bon_sortie;
                    type = "Bon de sortie";
                }else if(!Controle.isStringNull(id_bon_livraison)){
                    code = id_bon_livraison;
                    type = "Bon de livraison";
                }else if(!Controle.isStringNull(id_bon_reception)){
                    code = id_bon_reception;
                    type = "Bon de réception";
                }else if(!Controle.isStringNull(id_facture_frs)){
                    code = id_facture_frs;
                    type = "Facture FRS";
                }else if(!Controle.isStringNull(id_vente_sans_facture)){
                    code = id_vente_sans_facture;
                    type = "Vente sans facture";
                }
                ListMouvement.add(new ListeMouvement(code, type, mouvement, quantite, dateAdd));
            }
        } catch(SQLException ex){
            System.err.println("getDataStockDetail Erreur SQL ! \n"+ex.getMessage());
            System.out.println(req);
            if(ParametreSystem.ErrorShowLogger)
            {
                logger.error("StockDB  : getDataStockDetail :" + ex.getMessage());
            }
            if(ParametreSystem.ErrorShowDialog)
            {
                ShowDialog.setTitre("Erreur SQL !");
                ShowDialog.setDetail(ex.getMessage()+"\n"+ex.getSQLState());
                SD.ShowAletDialog();
            }
        }
        return ListMouvement;
    }
   
    public String getNbrStockDetail(String local, String reference, String date_debut)
    {
        String WhereDate = "";
        if(!Controle.isStringNull(date_debut)){
            WhereDate = " AND (CAST(date_add AS DATE) >= '"+date_debut+"') ";
        }
        
        String req = " SELECT  COUNT(*) ";
        req += " FROM stock_detail ";
        req += " WHERE (local_nom LIKE '"+local+"') ";
        req += WhereDate;
        req += " AND (reference_produit LIKE '"+reference+"'); ";
        
        String sommme = "0";
        try {
            ResultSet resultat = h2jdbc.selectFromDB(req);
            resultat.next();
            sommme  = resultat.getString(1);
        } catch(SQLException ex){
            System.err.println("getNbrStockDetail Erreur SQL ! \n"+ex.getMessage());
            System.out.println(req);
            if(ParametreSystem.ErrorShowLogger)
            {
                logger.error("StockDB  : getNbrStockDetail :" + ex.getMessage());
            }
            if(ParametreSystem.ErrorShowDialog)
            {
                ShowDialog.setTitre("Erreur SQL !");
                ShowDialog.setDetail(ex.getMessage()+"\n"+ex.getSQLState());
                SD.ShowAletDialog();
            }
        }
       return sommme ;
    }
    
    public ObservableList<ListeProduit> getProduitInStock(String Local, String Categorie, String Reference, String Designation)
    {
        ObservableList<ListeProduit> listProduits = FXCollections.observableArrayList();
        
        String WhereCategorie = "";
        if(!Controle.isStringNull(Categorie)){
            WhereCategorie = " AND (P.nomcategorie_cate LIKE '%"+Categorie.replaceAll("'","\\\\'")+"%') ";
        }
        
        String WhereReference = "";
        if(!Controle.isStringNull(Reference)){
            WhereReference = " AND (S.produit_reference LIKE '%"+Reference.replaceAll("'","\\\\'")+"%') ";
        }
        
        String WhereDesignation = "";
        if(!Controle.isStringNull(Designation)){
            WhereDesignation = " AND (P.designation LIKE '%"+Designation.replaceAll("'","\\\\'")+"%') ";
        }
        
        String req =  " SELECT S.produit_reference, S.quantite, P.designation " +
                        " FROM stock S, produit P " +
                        " WHERE (S.local_nom = '"+Local+"') AND (P.reference = S.produit_reference) "+
                        WhereCategorie+
                        WhereReference+
                        WhereDesignation+
                        " ORDER BY S.quantite DESC; ";
        try {
            ResultSet resultat = h2jdbc.selectFromDB(req);
            while (resultat.next()){
                String reference = resultat.getString("produit_reference");
                String designation =  resultat.getString("designation");
                String quantity =  resultat.getString("quantite");
                listProduits.add(new ListeProduit(reference, designation, quantity, "", "", "", "", ""));
            }
        } catch(SQLException ex){
            System.err.println("getProduitInStock Erreur SQL ! \n"+ex.getMessage());
            System.out.println(req);
            if(ParametreSystem.ErrorShowLogger)
            {
                logger.error("StockDB  : getProduitInStock :" + ex.getMessage());
            }
            if(ParametreSystem.ErrorShowDialog)
            {
                ShowDialog.setTitre("Erreur SQL !");
                ShowDialog.setDetail(ex.getMessage()+"\n"+ex.getSQLState());
                SD.ShowAletDialog();
            }
        }
        return listProduits;
    }
    
    
    //methode qui permet de récupére la liste des locals souf le local qui appartin l'utilisateur
    public ArrayList<String> getAllListLocal()
    {
        ArrayList<String> listLocale = new  ArrayList<>();
        String req = "SELECT * FROM local ;";  //local avec la quel appartient l'utilisateur
        try {
            ResultSet resultat = h2jdbc.selectFromDB(req);
            while (resultat.next()){
                listLocale.add(resultat.getString("nom"));
            }
        } catch(SQLException ex){
            System.err.println("getAllListLocal Erreur SQL ! \n"+ex.getMessage());
            System.out.println(req);
            if(ParametreSystem.ErrorShowLogger)
            {
                logger.error("StockDB  : getAllListLocal :" + ex.getMessage());
            }
            if(ParametreSystem.ErrorShowDialog)
            {
                ShowDialog.setTitre("Erreur SQL !");
                ShowDialog.setDetail(ex.getMessage()+"\n"+ex.getSQLState());
                SD.ShowAletDialog();
            }
        }
        return listLocale ;
    }
    
    //methode qui permet de récupére la liste des locals souf le local qui appartin l'utilisateur
    public ArrayList<String> getListLocal()
    {
        ArrayList<String> listLocale = new  ArrayList<>();
        String req = "SELECT * FROM local WHERE nom != '"+ParametreSystem.NomLocalPC+"' ;";  //local avec la quel appartient l'utilisateur
        try {
            ResultSet resultat = h2jdbc.selectFromDB(req);
            while (resultat.next()){
                listLocale.add(resultat.getString("nom"));
            }
        } catch(SQLException ex){
            System.err.println("getListLocal Erreur SQL ! \n"+ex.getMessage());
            System.out.println(req);
            if(ParametreSystem.ErrorShowLogger)
            {
                logger.error("StockDB  : getListLocal :" + ex.getMessage());
            }
            if(ParametreSystem.ErrorShowDialog)
            {
                ShowDialog.setTitre("Erreur SQL !");
                ShowDialog.setDetail(ex.getMessage()+"\n"+ex.getSQLState());
                SD.ShowAletDialog();
            }
        }
        return listLocale ;
    }
    
    
    public ArrayList<String> getListCategorie()
    {
        ArrayList<String> listCategorie = new  ArrayList<>();
        String req = "SELECT * FROM categorie ;"; 
        try {
            ResultSet resultat = h2jdbc.selectFromDB(req);
            while (resultat.next()){
                listCategorie.add(resultat.getString("nomcategorie"));
            }
        } catch(SQLException ex){
            System.err.println("getListCategorie Erreur SQL ! \n"+ex.getMessage());
            System.out.println(req);
            if(ParametreSystem.ErrorShowLogger)
            {
                logger.error("StockDB  : getListCategorie :" + ex.getMessage());
            }
            if(ParametreSystem.ErrorShowDialog)
            {
                ShowDialog.setTitre("Erreur SQL !");
                ShowDialog.setDetail(ex.getMessage()+"\n"+ex.getSQLState());
                SD.ShowAletDialog();
            }
        }
        return listCategorie ;
    }
    
    /*********************supprimer les produit dans la table  stock *****************************************/
    //Méthode  qui pérmet de supprimer la liste du produit dont la quantite est égale a 0
    public void DeleteProdStock()
    {
        String req = "DELETE FROM stock WHERE (local_nom='"+ParametreSystem.NomLocalPC+"') AND (quantite ='0')";
        try {
            h2jdbc.InsertUpdateDeleteInTable(req);
        }catch(SQLException ex){
            System.err.println("DeleteProdStock Erreur SQL ! \n"+ex.getMessage());
            System.out.println(req);
            if(ParametreSystem.ErrorShowLogger)
            {
                logger.error("StockDB  : DeleteProdStock :" + ex.getMessage());
            }
            if(ParametreSystem.ErrorShowDialog)
            {
                ShowDialog.setTitre("Erreur SQL !");
                ShowDialog.setDetail(ex.getMessage()+"\n"+ex.getSQLState());
                SD.ShowAletDialog();
            }
        }
    }
}
