/*
 * 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.BonReceptionFrs;

import Controllers.Traitement.Adaptateur;
import static Controllers.Traitement.Adaptateur.StringToFloat;
import Models.Fournisseur.Fournisseur;
import Models.Fournisseur.FournisseurDB;
import Models.Stock.StockDetail;
import Models.Stock.StockDetailDB;
import Models.User.Profile;
import Models.User.ProfileDB;
import Models.User.User;
import Models.connexion;
import java.sql.ResultSet;
import java.sql.SQLException;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;

/**
 *
 * @author Maher
 */
public class BonReceptionDB {
    
    connexion cnx = new connexion();
    
    
    
    public BonReceptionFrs setBonReceptionFrsDB(BonReceptionFrs BonReception){
        
        String Fournisseur = BonReception.getFournisseur().getCode();
        String Numero = BonReception.getNumero();
        String Transporteur = "NULL";
        if(BonReception.getTransporteur() != ""){
            Transporteur = "'"+BonReception.getTransporteur()+"'";
        }
        String NetPayer = BonReception.getNetPayer().replace(",", ".");
        
        String Heur = BonReception.getHeur();
        String Date = BonReception.getDate();
        String Local = BonReception.getLocal();
        String IdFactureFrs = "NULL";
        if(BonReception.getIdFactureFrs() != ""){
            IdFactureFrs = BonReception.getIdFactureFrs();
        }
        String PoidsProduits = "NULL";
        if(BonReception.getPoidsProduits()!= ""){
             PoidsProduits = BonReception.getPoidsProduits();
        }
        ObservableList<BonReceptionProduitList> ListProduit = BonReception.getListProduit();
        
        String Query = "INSERT INTO `bonreception_frs` (`numero`, `date_reception`, `transporteur`, `net_a_payer`, `id_fournisseur`, `local_reception`, `id_profile`, `id_facture_frs`) VALUES ('"+Numero+"', '"+Date+" "+Heur+"', "+Transporteur+", "+NetPayer+", '"+Fournisseur+"', '"+Local+"', '"+User.idprofile+"', "+IdFactureFrs+")";
        
        String IdBonReception = cnx.InsertGetLastId(Query);
        BonReception.setIdBonReception(IdBonReception);
        
        ObservableList<StockDetail> ListStockDetail = FXCollections.observableArrayList();
        
        String Req = "INSERT INTO `list_prod_reception_frs` (`id_bonreception_frs`, `reference`, `quantite`, `p_u_h_t`, `p_u_h_t_net`, `tva`, `montant`) VALUES ";
        for(int i=0; i<ListProduit.size(); i++){
            String Reference = ListProduit.get(i).getReference();
            String Quantite = ListProduit.get(i).getQuantite().replace(",",".");
            String PrixUnitaireHorsTaxe = ListProduit.get(i).getPrixUnitaireHorsTaxe().replace(",",".");
            String PrixUnitaireHorsTaxenNet = ListProduit.get(i).getPrixUnitaireHorsTaxenNet().replace(",",".");
            String TVA = ListProduit.get(i).getTva().replace(",",".").replace("%","");
            String Montant = ListProduit.get(i).getMontant().replace(",",".");
            Req = Req + "( "+IdBonReception+",  '"+Reference+"', '"+Quantite+"', '"+PrixUnitaireHorsTaxe+"', '"+PrixUnitaireHorsTaxenNet+"', '"+TVA+"', '"+Montant+"'),";
            
            ListStockDetail.add(new StockDetail(ListProduit.get(i).getReference(), StringToFloat(Quantite), null, null, null, IdBonReception, null, null));
        }
        if(Req != null){
            Req = Req.substring(0, Req.length()-1) + ";";
            cnx.insertion(Req);
            new StockDetailDB().InsertStockDetail(ListStockDetail);
        }
        
        return BonReception;
    }
    
    
    
    
    
    public BonReceptionFrs getBonReceptionFrs(String IdBonReception, String Numero, String IdFournisseur){
        
        BonReceptionFrs BonReception = new BonReceptionFrs();
        
        String Query = "SELECT `id_bonreception`, `numero`, DATE_FORMAT(date_reception, '%d/%m/%Y') as date_recep, DATE_FORMAT(date_reception, '%H:%i') as heur_recep,  `transporteur`, `net_a_payer`, `id_fournisseur`, `local_reception`, `id_profile`, `id_facture_frs` FROM `bonreception_frs` WHERE `id_bonreception` = "+IdBonReception+";";
        
        if(Numero!=null && IdFournisseur!=null){
            Query = "SELECT `id_bonreception`, `numero`, DATE_FORMAT(date_reception, '%d/%m/%Y') as date_recep, DATE_FORMAT(date_reception, '%H:%i') as heur_recep,  `transporteur`, `net_a_payer`, `id_fournisseur`, `local_reception`, `id_profile`, `id_facture_frs` FROM `bonreception_frs` WHERE (numero='"+Adaptateur.addSlashes(Numero)+"') AND (id_fournisseur="+IdFournisseur+");";
        }
        
        if(cnx.ouverture()){
            try{
               ResultSet resultat = cnx.excutionquery(Query);
                //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){    
                    BonReception.setIdBonReception(resultat.getString("id_bonreception"));
                    BonReception.setNumero(resultat.getString("numero"));
                    BonReception.setDate(resultat.getString("date_recep"));
                    BonReception.setHeur(resultat.getString("heur_recep"));
                    BonReception.setTransporteur(resultat.getString("transporteur"));
                    BonReception.setNetPayer(resultat.getString("net_a_payer").replace(".", ","));
                    Fournisseur Frs = new FournisseurDB().GetFournisseurDB(resultat.getString("id_fournisseur"));
                    BonReception.setFournisseur(Frs);
                    BonReception.setLocal(resultat.getString("local_reception"));
                    
                    Profile profile = new ProfileDB().getpro(resultat.getInt("id_profile"));
                    BonReception.setProfile(profile);
                    
                    BonReception.setListProduit(this.getBonReceptionProduitList(IdBonReception));
                }
            }catch(SQLException ex){
                System.err.println("Erreur SQL ! \n"+ex.getMessage());
                System.err.println(Query);
            }
        }
        return BonReception ;
    }
    
    
    
    public ObservableList<BonReceptionProduitList> getBonReceptionProduitList(String IdBonReception)
    {
        String Query = "SELECT * FROM `list_prod_reception_frs`, `produit`  WHERE (`id_bonreception_frs` = "+IdBonReception+") AND (list_prod_reception_frs.reference = produit.reference) ;";
        
        ObservableList<BonReceptionProduitList> ObservableListBonReceptionProduit= FXCollections.observableArrayList();
        
        if(cnx.ouverture())
        {
            try{
                ResultSet ResultListBonRecepProd = cnx.excutionquery(Query);
                ResultListBonRecepProd.beforeFirst();
                while (ResultListBonRecepProd.next() ) {
                    String id_achat = ResultListBonRecepProd.getString("id_achat");
                    String id_bon_reception = ResultListBonRecepProd.getString("id_bonreception_frs");
                    String designation = ResultListBonRecepProd.getString("designation");
                    String reference = ResultListBonRecepProd.getString("reference");
                    String quantite = ResultListBonRecepProd.getString("quantite");
                    String p_u_h_t = ResultListBonRecepProd.getString("p_u_h_t");
                    String p_u_h_t_net = ResultListBonRecepProd.getString("p_u_h_t_net");
                    String tva = ResultListBonRecepProd.getString("tva");
                    String montant = ResultListBonRecepProd.getString("montant");
                    ObservableListBonReceptionProduit.add(new BonReceptionProduitList(id_achat, id_bon_reception, reference, designation, quantite, p_u_h_t, p_u_h_t_net, tva, montant));
                }
            }catch(SQLException ex){
                System.err.println("Erreur SQL ! \n"+ex.getMessage());
                System.err.println(Query);
            }
        }
        return ObservableListBonReceptionProduit;
    } 
        

    public ObservableList<BonReceptionList> getBonReceptionNotFact(String KeyWordSearch)
    {
        String query = "SELECT BR.*, DATE_FORMAT(BR.date_reception, '%d/%m/%Y') as date_recep, DATE_FORMAT(BR.date_reception, '%H:%i') as heur_recep, F.nom "
                        + " FROM bonreception_frs BR, fournisseur F "
                        + " WHERE (BR.id_fournisseur = F.id_fourisseur) AND (id_facture_frs IS NULL) "+KeyWordSearch+" "
                        + " ORDER BY BR.id_bonreception DESC;";
        
        ObservableList<BonReceptionList> ObservableListBonReception= FXCollections.observableArrayList();
        if(cnx.ouverture())
        {
            try{
                ResultSet ResultListBonRecepProd = cnx.excutionquery(query);
                ResultListBonRecepProd.beforeFirst();
                while (ResultListBonRecepProd.next() ) {
                    String id_bon_reception = ResultListBonRecepProd.getString("id_bonreception");
                    String numero = ResultListBonRecepProd.getString("numero");
                    String date_recep = ResultListBonRecepProd.getString("date_recep");
                    String heur_recep = ResultListBonRecepProd.getString("heur_recep");
                    String transporteur = ResultListBonRecepProd.getString("transporteur");
                    String net_a_payer = ResultListBonRecepProd.getString("net_a_payer");
                    String id_frs = ResultListBonRecepProd.getString("id_fournisseur");
                    String nom_frs = ResultListBonRecepProd.getString("nom");
                    String local_reception = ResultListBonRecepProd.getString("local_reception");
                    ObservableListBonReception.add(new BonReceptionList(id_bon_reception, numero, date_recep, heur_recep, transporteur, id_frs+" - "+nom_frs, "", local_reception, net_a_payer));
                }
            }catch(SQLException ex){
                System.err.println("Erreur SQL ! \n"+ex.getMessage());
                System.out.println(query);
            }
        }
        return ObservableListBonReception;
    } 
    
    
    
    public ObservableList<BonReceptionFrs> getBonReceptionByFact(String IdFacture)
    {
        ObservableList<BonReceptionFrs> ObservableListBonReception= FXCollections.observableArrayList();
        
        String Query = "SELECT BR.*, DATE_FORMAT(BR.date_reception, '%d/%m/%Y') as date_recep, DATE_FORMAT(BR.date_reception, '%H:%i') as heur_recep, F.nom FROM bonreception_frs BR, fournisseur F WHERE (BR.id_fournisseur = F.id_fourisseur)  AND (id_facture_frs = "+IdFacture+")  ORDER BY BR.id_bonreception DESC;";
        
        if(cnx.ouverture()){
            try{
                ResultSet resultat = cnx.excutionquery(Query);
                resultat.beforeFirst();
                while (resultat.next() ) {
                    
                    BonReceptionFrs BonReception= new BonReceptionFrs();
                    
                    BonReception.setIdBonReception(resultat.getString("id_bonreception"));
                    BonReception.setNumero(resultat.getString("numero"));
                    BonReception.setDate(resultat.getString("date_recep"));
                    BonReception.setHeur(resultat.getString("heur_recep"));
                    BonReception.setTransporteur(resultat.getString("transporteur"));
                    BonReception.setNetPayer(resultat.getString("net_a_payer").replace(".", ","));
                    Fournisseur Frs = new FournisseurDB().GetFournisseurDB(resultat.getString("id_fournisseur"));
                    BonReception.setFournisseur(Frs);
                    BonReception.setLocal(resultat.getString("local_reception"));
                    
                    Profile profile = new ProfileDB().getpro(resultat.getInt("id_profile"));
                    BonReception.setProfile(profile);
                    
                    BonReception.setListProduit(this.getBonReceptionProduitList(resultat.getString("id_bonreception")));
                    
                    
                    ObservableListBonReception.add(BonReception);
                }
            }catch(SQLException ex){
                System.err.println("Erreur SQL ! \n"+ex.getMessage());
                System.err.println(Query);
            }
        }
        return ObservableListBonReception;
    }
    
}
