package Models.BonLivraisonClt;

import Controllers.Dialog.ShowDialog;
import Controllers.Traitement.Adaptateur;
import Models.Produit.ListeProduit;
import Controllers.Traitement.ParametreSystem;
import Controllers.Traitement.contro;
import Models.Client.ClientDB;
import Models.Client.ClientEntrepriseDB;
import Models.Client.ClientPassagerDB;
import Models.H2JDBC;
import Models.Stock.StockDetail;
import Models.Stock.StockDetailDB;
import Models.User.User;
import org.apache.log4j.Logger;
import java.sql.ResultSet;
import java.sql.SQLException;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;

/**
 * @author Maher Ben Tili
 */
public class BonLivraisonCltDB {
    
    H2JDBC h2jdbc = new H2JDBC();
    ShowDialog SD = new ShowDialog();
    Logger logger = Logger.getLogger(BonLivraisonCltDB.class.getName());
    contro clt = new contro();
    
    public BonLivraisonClt GetBonLivraisonClt(String id_bon_livraison)
    {
        BonLivraisonClt BonLivraison = new BonLivraisonClt();
        
        String req = "SELECT *, to_char(date_livraison_prevu, 'dd/mm/yyyy') as date_livraison, to_char(date_creation, 'dd/mm/yyyy') as creation FROM bon_livraisonclt WHERE (idbon_livraisonclt = "+id_bon_livraison+") AND (local_nom = '"+ParametreSystem.NomLocalPC+"') ;";
        
        try {
            ResultSet resultat = h2jdbc.selectFromDB(req);
            while (resultat.next()){
                BonLivraison.setIdBonLivrasionClt(resultat.getString("idbon_livraisonclt"));
                BonLivraison.setIdCommande(resultat.getString("id_commandeclt"));
                BonLivraison.setHeurLivraison(resultat.getString("heur_livraison"));
                BonLivraison.setDateLivraisonPreveu(resultat.getString("date_livraison"));
                BonLivraison.setAdresseLivraison(resultat.getString("adresse_livraison"));
                BonLivraison.setTransporteur(resultat.getString("transporteur"));
                BonLivraison.setFrais(resultat.getString("frais"));
                BonLivraison.setPoidProduit(resultat.getString("poids_produit"));
                BonLivraison.setTele1(resultat.getString("tele1"));
                BonLivraison.setTele2(resultat.getString("tele2"));
                BonLivraison.setDevise(resultat.getString("devise"));
                BonLivraison.setTotalHorsTaxNet(resultat.getString("total_h_t_net"));
                BonLivraison.setTotalTVA(resultat.getString("total_tva"));
                BonLivraison.setRemise(resultat.getString("remise"));
                BonLivraison.setNetAPayer(resultat.getString("net_a_payer"));
                BonLivraison.setIdProfileEditeur(resultat.getString("idprofile_editeur"));
                BonLivraison.setDateCreation(resultat.getString("creation"));
                BonLivraison.setLocalNom(resultat.getString("local_nom"));
                BonLivraison.setTypeClient(resultat.getInt("type_client"));
                if(BonLivraison.getTypeClient()==0){
                    String codeclient = resultat.getString("id_clt_existe");
                    BonLivraison.setCltPersonne(new ClientDB().getClient(codeclient));
                }else if(BonLivraison.getTypeClient()==1){
                    String codeEntreprise = resultat.getString("id_clt_entreprise");
                    BonLivraison.setCltEntreprise(new ClientEntrepriseDB().GetClientEtr(codeEntreprise));
                }else if(BonLivraison.getTypeClient()==2){
                    String codePassageur = resultat.getString("id_clt_passageur");
                    BonLivraison.setCltPassager(new ClientPassagerDB().getPassager(codePassageur));
                }
                
                String reqprod = "SELECT * FROM liste_prod_livraison WHERE (id_bon_livraison_clt = "+id_bon_livraison+") AND (local_nom = '"+ParametreSystem.NomLocalPC+"');";
                ObservableList<ListeProduit> dataProdDev=FXCollections.observableArrayList();
                try {
                    ResultSet resulist = h2jdbc.selectFromDB(reqprod);
                    while (resulist.next()){
                        String reference = resulist.getString("produit_reference");
                        String designation = resulist.getString("designation_produit");
                        String quantite=resulist.getString("quantite");
                        String PrixHT =resulist.getString("p_u_h_t");
                        String Remise =resulist.getString("remise");
                        String TotalHT =resulist.getString("p_u_h_t_net");
                        String TVA =resulist.getString("tva");
                        String TotalTTC =resulist.getString("montant");
                        dataProdDev.add(new ListeProduit(reference, designation, quantite, PrixHT, Remise, TotalHT, TVA, TotalTTC));
                    }
                    BonLivraison.setListeproduit(dataProdDev);
                } catch(SQLException ex){
                    System.err.println("GetBonLivraisonClt 2 Erreur SQL ! \n"+ex.getMessage());
                    System.out.println(req);
                    if(ParametreSystem.ErrorShowLogger)
                    {
                        logger.error("BonLivraisonCltDB  : GetBonLivraisonClt 2 :" + ex.getMessage());
                    }
                }    
            }
        } catch(SQLException ex){
            System.err.println("Erreur SQL ! \n"+ex.getMessage());
            System.out.println(req);
            if(ParametreSystem.ErrorShowLogger)
            {
                logger.error("BonLivraisonCltDB  : GetBonLivraisonClt 1 :" + ex.getMessage());
            }
        }
        return BonLivraison;
    }
    
    
    
    
    
    
    
    
    public String AddBonLivraisonClt(BonLivraisonClt bon_livraison)
    {
        String netapayer = bon_livraison.getNetAPayer().replace(",", ".");
        String totalhorstaxnet =bon_livraison.getTotalHorsTaxNet().replace(",", ".");
        String totaltva = bon_livraison.getTotalTVA().replace(",", ".");
        String TotalRemise = bon_livraison.getRemise().replace(",", ".");
        
        Integer TypeClient = bon_livraison.getTypeClient();
        String CodeClientPersonne = "NULL";     String CodeClientEntreprise = "NULL";   String CodePassager = "NULL";
        if(TypeClient == 0){
            CodeClientPersonne = bon_livraison.CltPersonne.getCodeclient().toString();
        }else if(TypeClient == 1 ){
            CodeClientEntreprise = bon_livraison.CltEntreprise.getCode().toString();
        }else if(TypeClient == 2){
            CodePassager =  bon_livraison.CltPassager.getCodeclient().toString();
        }
        
        String HeurLivraison = "'"+bon_livraison.getHeurLivraison()+"'";  
        if(clt.isStringNull(bon_livraison.getHeurLivraison())){
            HeurLivraison = "NULL";
        }
    
        String DateLivraison = "'"+bon_livraison.getDateLivraisonPreveu()+"'";
        if(clt.isStringNull(bon_livraison.getDateLivraisonPreveu())){
            DateLivraison = "now()"; 
        }
        
        String DateCreation = "'"+bon_livraison.getDateCreation()+"'";
        if(clt.isStringNull(bon_livraison.getDateCreation())){
            DateCreation = "now()"; 
        }
        
        String PoidsProduits = bon_livraison.getPoidProduit();
        if(clt.isStringNull(bon_livraison.getPoidProduit())){
            PoidsProduits = "NULL";
        }
        
        String Transporteur = "'"+bon_livraison.getTransporteur()+"'"; 
        if(clt.isStringNull(bon_livraison.getTransporteur())){
            Transporteur = "NULL";
        }
        
        String Frais = "'"+bon_livraison.getFrais()+"'"; 
        if(clt.isStringNull(bon_livraison.getFrais())){
            Frais = "NULL";
        }
        
        String sql = "INSERT INTO bon_livraisonclt (type_client, id_clt_entreprise,  id_clt_passageur, id_clt_existe, heur_livraison, date_livraison_prevu, adresse_livraison, transporteur, frais, poids_produit, tele1, tele2, devise, total_h_t_net, total_tva, remise, net_a_payer,  id_commandeclt, idprofile_editeur, date_creation, local_nom) VALUES ("+TypeClient+", "+CodeClientEntreprise+", "+CodePassager+", "+CodeClientPersonne+",  "+HeurLivraison+",  "+DateLivraison+", '"+Adaptateur.addSlashes(bon_livraison.getAdresseLivraison())+"',  "+Transporteur+",  "+Frais+", "+PoidsProduits+",  '"+bon_livraison.getTele1()+"',  '"+bon_livraison.getTele2()+"',  '"+ParametreSystem.CurrencySign+"',  '"+totalhorstaxnet+"',  '"+totaltva+"',  '"+TotalRemise+"',  '"+netapayer+"',  '"+bon_livraison.getIdCommande()+"',  '"+User.idprofile+"',  "+DateCreation+", '"+ParametreSystem.NomLocalPC+"');";
       
        String CodeBonLivraison = null;
        try {
            CodeBonLivraison = h2jdbc.InsertGetLastId(sql);
        }catch(SQLException ex){
            System.err.println("AddBonLivraisonClt Erreur SQL ! \n"+ex.getMessage());
            System.out.println(sql);
            if(ParametreSystem.ErrorShowLogger)
            {
                logger.error("BonLivraisonCltDB  : AddBonLivraisonClt :" + ex.getMessage());
            }
            if(ParametreSystem.ErrorShowDialog)
            {
                ShowDialog.setTitre("AddBonLivraisonClt Erreur SQL !");
                ShowDialog.setDetail(ex.getMessage()+"\n"+ex.getSQLState());
                SD.ShowAletDialog();
            }
        }
     
        if(CodeBonLivraison != null)
        {
            ObservableList<StockDetail> ListStockDetail=FXCollections.observableArrayList();
        
            String PrixHT ; String Remise ; String TotalHT ; String TVA ; String TotalTTC ;
            for(ListeProduit listeprod : bon_livraison.getListeproduit()){
                PrixHT = listeprod.getPrixHT().replace(",",".");
                Remise= listeprod.getRemise().replace("%","").replace(",",".");
                TotalHT= listeprod.getTotalHT().replace(",",".");
                TVA=listeprod.getTVA().replace("%","").replace(",",".");
                TotalTTC= listeprod.getTotalTTC().replace(",","."); 

                String Query = "INSERT INTO liste_prod_livraison (id_bon_livraison_clt, produit_reference, designation_produit, quantite, p_u_h_t, remise, p_u_h_t_net, tva, montant, local_nom) VALUES ('"+CodeBonLivraison+"', '"+listeprod.getReference()+"', '"+listeprod.getDesignation()+"', "+listeprod.getQuantite()+", "+PrixHT+", '"+Remise+"', '"+TotalHT+"', '"+TVA+"', '"+TotalTTC+"', '"+ParametreSystem.NomLocalPC+"');";
                
                int nbr = 0;
                try {
                    nbr = h2jdbc.InsertUpdateDeleteInTable(Query);
                    if(nbr>0){
                        ListStockDetail.add(new StockDetail(listeprod.getReference(), Adaptateur.StringToFloat(listeprod.getQuantite())* -1, null, null, CodeBonLivraison, null, null, null, bon_livraison.getDateCreation()));
                        new StockDetailDB().InsertStockDetail(ListStockDetail);
                    }
                }catch(SQLException ex){
                    System.err.println("AddBonLivraisonClt Erreur SQL ! \n"+ex.getMessage());
                    System.out.println(Query);
                    if(ParametreSystem.ErrorShowLogger)
                    {
                        logger.error("BonLivraisonCltDB  : AddBonLivraisonClt :" + ex.getMessage());
                    }
                    if(ParametreSystem.ErrorShowDialog)
                    {
                        ShowDialog.setTitre("Erreur SQL !");
                        ShowDialog.setDetail(ex.getMessage()+"\n"+ex.getSQLState());
                        SD.ShowAletDialog();
                    }
                }
            }
        }
        return CodeBonLivraison;
    }
    
    public  ObservableList<BonLivraisonCltProduitList> GetListBonLivraisonCltSotck(ObservableList<ListeProduit> DataListeproduit)
    {
        Integer indice = 0;
       
        String StringReference = "";
        while(indice<DataListeproduit.size()){
            StringReference += "'"+DataListeproduit.get(indice).getReference()+"',";
            indice ++;
        }
        StringReference= StringReference.substring(0, StringReference.length() - 1);
        
        ObservableList<BonLivraisonCltProduitList> BonLivraisonCltProduit = FXCollections.observableArrayList();
        
        String req = "SELECT P.reference, P.marque, P.nomcategorie_cate, S.local_nom, S.quantite FROM produit P LEFT JOIN stock S ON (P.reference = S.produit_reference) AND (local_nom LIKE '"+ParametreSystem.NomLocalPC+"') WHERE  P.reference IN ("+StringReference+"); ";
        
        try {
            ResultSet resultat = h2jdbc.selectFromDB(req);
            while (resultat.next()){
                String Reference = resultat.getString("reference");
                String Marque = resultat.getString("marque");
                String Category =resultat.getString("nomcategorie_cate");
                String QuantiteStock =resultat.getString("quantite");
                Float quantite_stock =resultat.getFloat("quantite");
                boolean search = true;
                indice = 0;
                while( (indice<DataListeproduit.size()) && (search) )
                {
                    if(DataListeproduit.get(indice).getReference().equals(Reference))
                    {
                        Float qauntite_prod = Adaptateur.StringToFloat(DataListeproduit.get(indice).getQuantite());;
                        String ProdDisponible = "1";
                        if(qauntite_prod > quantite_stock){
                            ProdDisponible = "0";
                        }
                        BonLivraisonCltProduit.add(new BonLivraisonCltProduitList(DataListeproduit.get(indice).getReference(), DataListeproduit.get(indice).getDesignation(),  Marque, Category, ProdDisponible,  DataListeproduit.get(indice).getQuantite(), QuantiteStock, DataListeproduit.get(indice).getTotalHT()));
                        search = false;
                    }
                    indice ++;
                }
            }
        } catch(SQLException ex){
            System.err.println("GetListBonLivraisonCltSotck Erreur SQL ! \n"+ex.getMessage());
            System.out.println(req);
            if(ParametreSystem.ErrorShowLogger)
            {
                logger.error("BonLivraisonCltDB  : GetListBonLivraisonCltSotck :" + ex.getMessage());
            }
            if(ParametreSystem.ErrorShowDialog)
            {
                ShowDialog.setTitre("Erreur SQL !");
                ShowDialog.setDetail(ex.getMessage()+"\n"+ex.getSQLState());
                SD.ShowAletDialog();
            }
        }
        return BonLivraisonCltProduit;
    }
    
    /********************************** Search *******************************/
    
    public ObservableList<BonLivraisonCltGestionList>  SearchBonLivraisonCltGestion(Integer debut, Integer nbr, String IdBonLivrasionClt, String DateLivraison, String CodeClient, String IdFactureClt, String Transporteur, String AdresseLivraison)
    {
        ObservableList<BonLivraisonCltGestionList> data = FXCollections.observableArrayList();
        
        String Where = "";
        
        if(!clt.isNumericNotnull(IdBonLivrasionClt)){
            Where += " (bl_clt.idbon_livraisonclt LIKE '%"+Adaptateur.addSlashes(IdBonLivrasionClt)+"%') AND ";
        }
        
        if(!clt.isStringNull(DateLivraison)){
            Where += " (bl_clt.date_livraison_prevu LIKE '"+DateLivraison+"') AND ";
        }
        
        if(!clt.isNumericNotnull(CodeClient)){
            Where += " ( (bl_clt.id_clt_existe = '"+CodeClient+"') OR (bl_clt.id_clt_entreprise = '"+CodeClient+"') OR (bl_clt.id_clt_passageur = '"+CodeClient+"') ) AND ";
        }
        
        
        if(!clt.isNumericNotnull(IdFactureClt)){
            Where += " (f_clt.idfactureclt LIKE '%"+Adaptateur.addSlashes(IdFactureClt)+"%') AND ";
        }
        
        if(!clt.isStringNull(Transporteur)){
            Where += " (bl_clt.transporteur LIKE '%"+Adaptateur.addSlashes(Transporteur)+"%') AND ";
        }
        
        if(!clt.isStringNull(AdresseLivraison)){
            Where += " (bl_clt.adresse_livraison LIKE '%"+Adaptateur.addSlashes(AdresseLivraison)+"%') AND ";
        }
        
        if(!Where.equals("")){
            Where = Where.substring(0, Where.length() - 4);
            Where = "WHERE  " + Where;
        }
        
        String req="SELECT "+ 
                        "bl_clt.idbon_livraisonclt, "+ 
                        "to_char(bl_clt.heur_livraison, 'hh:ii') AS heur_livraison, "+ 
                        "to_char(bl_clt.date_livraison_prevu, 'dd/mm/yyyy') AS date_livraison_prevu, "+ 
                        "bl_clt.adresse_livraison, "+ 
                        "bl_clt.transporteur, "+ 
                        "bl_clt.id_commandeclt AS IdCommandeClt, "+ 
                        "f_clt.idfactureclt AS IdFactureClt, "+ 
                    	"CASEWHEN(bl_clt.id_clt_entreprise IS NOT NULL, "+ 
                            "bl_clt.id_clt_entreprise, "+ 
                            "CASEWHEN(bl_clt.id_clt_existe IS NOT NULL, "+ 
                                "bl_clt.id_clt_existe, "+ 
                                "CASEWHEN(bl_clt.id_clt_passageur, "+ 
                                    "bl_clt.id_clt_passageur, "+ 
                                    "NULL))) AS CodeClt "+ 
                    " FROM bon_livraisonclt bl_clt "+ 
                    " LEFT JOIN factureclt f_clt ON f_clt.id_bon_livraisonclt = bl_clt.idbon_livraisonclt "+ 
                    Where + 
                    " ORDER BY bl_clt.date_creation DESC "+ 
                    " LIMIT "+debut+" , "+nbr+";";
        
        try {
            ResultSet resultat = h2jdbc.selectFromDB(req);
            while (resultat.next()){
                data.add(new BonLivraisonCltGestionList(
                resultat.getString("idbon_livraisonclt"), 
                resultat.getString("date_livraison_prevu")+" "+resultat.getString("heur_livraison"), 
                resultat.getString("adresse_livraison"), 
                resultat.getString("CodeClt"), 
                resultat.getString("IdFactureClt"), 
                resultat.getString("transporteur")
                ));
            }
        } catch(SQLException ex){
            System.err.println("Erreur SQL ! \n"+ex.getMessage());
            System.out.println(req);
            if(ParametreSystem.ErrorShowLogger)
            {
                logger.error("BonLivraisonCltDB  :  :" + ex.getMessage());
            }
            if(ParametreSystem.ErrorShowDialog)
            {
                ShowDialog.setTitre("Erreur SQL !");
                ShowDialog.setDetail(ex.getMessage()+"\n"+ex.getSQLState());
                SD.ShowAletDialog();
            }
        }
        return data ;
    }
    
    
    public Integer nbrSearchBonLivraisonCltGestion(String IdBonLivrasionClt, String DateLivraison, String CodeClient, String IdFactureClt, String Transporteur, String AdresseLivraison)
    {
        String Where = "";
        
        if(!clt.isNumericNotnull(IdBonLivrasionClt)){
            Where += " (bl_clt.idbon_livraisonclt LIKE '%"+Adaptateur.addSlashes(IdBonLivrasionClt)+"%') AND ";
        }
        
        if(!clt.isStringNull(DateLivraison)){
            Where += " (bl_clt.date_livraison_prevu LIKE '"+DateLivraison+"') AND ";
        }
        
        if(!clt.isNumericNotnull(CodeClient)){
            Where += " ( (bl_clt.id_clt_existe = '"+CodeClient+"') OR (bl_clt.id_clt_entreprise = '"+CodeClient+"') OR (bl_clt.id_clt_passageur = '"+CodeClient+"') ) AND ";
        }
        
        
        if(!clt.isNumericNotnull(IdFactureClt)){
            Where += " (f_clt.idfactureclt LIKE '%"+Adaptateur.addSlashes(IdFactureClt)+"%') AND ";
        }
        
        if(!clt.isStringNull(Transporteur)){
            Where += " (bl_clt.transporteur LIKE '%"+Adaptateur.addSlashes(Transporteur)+"%') AND ";
        }
        
        if(!clt.isStringNull(AdresseLivraison)){
            Where += " (bl_clt.adresse_livraison LIKE '%"+Adaptateur.addSlashes(AdresseLivraison)+"%') AND ";
        }
        
        if(!Where.equals("")){
            Where = Where.substring(0, Where.length() - 4);
            Where = "WHERE  " + Where;
        }
        
        String req=" SELECT COUNT(bl_clt.idbon_livraisonclt) "+ 
                    " FROM bon_livraisonclt bl_clt "+ 
                    " LEFT JOIN factureclt f_clt ON f_clt.id_bon_livraisonclt = bl_clt.idbon_livraisonclt "+ 
                    Where+" ;"; 
        
        int sommme =0;
        try {
            ResultSet resultat = h2jdbc.selectFromDB(req);
            resultat.next();
            sommme = resultat.getInt(1);
        } catch(SQLException ex){
            System.err.println("SearchBonLivraisonCltGestion Erreur SQL ! \n"+ex.getMessage());
            System.out.println(req);
            if(ParametreSystem.ErrorShowLogger)
            {
                logger.error("BonLivraisonCltDB  : SearchBonLivraisonCltGestion :" + ex.getMessage());
            }
            if(ParametreSystem.ErrorShowDialog)
            {
                ShowDialog.setTitre("Erreur SQL !");
                ShowDialog.setDetail(ex.getMessage()+"\n"+ex.getSQLState());
                SD.ShowAletDialog();
            }
        }
        return sommme ;
    }
}
