/*
 * 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 static Controllers.Traitement.Adaptateur.StringDeleZero;
import Controllers.Traitement.ParametreSystem;
import Controllers.Traitement.contro;
import Models.Produit.ListeProduit;
import Models.connexion;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;


public class StockDB {
    
    connexion cnx = new connexion();
    
    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 (DATE(`date_add`) >= '"+date_debut+"') ";
        }
        
        String req = " SELECT  *, DATE_FORMAT(date_add, '%d/%m/%Y %H:%i') 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+";";
        }
        
        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 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("Erreur SQL ! \n"+ex.getMessage());
                System.out.println(req);
            }
        }
        return ListMouvement;
    }
   
    public String getNbrStockDetail(String local, String reference, String date_debut){
        
        String WhereDate = "";
        if(!Controle.isStringNull(date_debut)){
            WhereDate = " AND (DATE(`date_add`) >= '"+date_debut+"') ";
        }
        
        String req = " SELECT  COUNT(*) ";
        req += " FROM stock_detail ";
        req += " WHERE (local_nom LIKE '"+local+"') ";
        req += WhereDate;
        req += " AND (reference_produit LIKE '"+reference+"'); ";
        
        int sommme =0;
        if(cnx.ouverture()){
            try{
               /* Exécution d'une requête de lecture */
                ResultSet resultat = cnx.excutionquery(req);
                resultat.next();    // get the number of rows from the result set
                sommme= resultat.getInt(1);
            }
            catch(SQLException ex){
                System.err.println("Erreur SQL ! \n"+ex.getMessage());
                System.out.println(req);
            }
        }
       return  Integer.toString(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 Query =  " 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; ";
        
        if(cnx.ouverture()){
            try{
                ResultSet resultat= cnx.FetchALL(Query);
                
                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("Erreur SQL ! \n"+ex.getMessage());
            }
        }
        
        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
        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 nomlocal=resultat.getString("nom");
                        listLocale.add(nomlocal);
                    }
                }
            }
            catch(SQLException ex){
                System.err.println("Erreur SQL ! \n"+ex.getMessage());
                System.out.println("req "+req);
            }
        }
        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
        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 nomlocal=resultat.getString("nom");
                        listLocale.add(nomlocal);
                    }
                }
            }
            catch(SQLException ex){
                System.err.println("Erreur SQL ! \n"+ex.getMessage());
                System.out.println("req "+req);
            }
        }
        return listLocale ;
    }
    
    
    public ArrayList<String> getListCategorie(){
        ArrayList<String> listCategorie = new  ArrayList<>();
        String req = "SELECT * FROM `categorie` ;"; 
        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 nomCategorie=resultat.getString("nomcategorie");
                        listCategorie.add(nomCategorie);
                    }
                }
            }
            catch(SQLException ex){
                System.err.println("Erreur SQL ! \n"+ex.getMessage());
                System.out.println("req "+req);
            }
        }
        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')";
        if(cnx.ouverture()){
            try{
               int nbr = cnx.executionupdate(req);
            }
            catch(SQLException ex){
                System.err.println("Erreur SQL ! \n"+ex.getMessage());
                System.out.println(req);
            }
        }
    }
}
