package Models.FactureClt;

import Controllers.Traitement.Adaptateur;
import Models.Produit.ListeProduit;
import Controllers.Traitement.ParametreSystem;
import Controllers.Traitement.contro;
import Models.Caisse.CaisseClt;
import Models.Caisse.CaisseDB;
import Models.Caisse.CarteBancaireClt;
import Models.Caisse.CarteBancaireCltDB;
import Models.User.User;
import Models.ChequeClt.ChequeClt;
import Models.ChequeClt.ChequeCltDB;
import Models.Client.ClientDB;
import Models.Client.ClientEntrepriseDB;
import Models.Client.ClientPassagerDB;
import Models.CommandeClt.CommandeCltDB;
import Models.TraiteClt.TraiteClt;
import Models.TraiteClt.TraiteCltDB;
import Models.connexion;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;

/**
 *
 * @author Maher Ben Tili
 */
public class FactureCltDB {
    
    connexion cnx = new connexion();
    contro clt = new contro();
    
    public String AddFactureClt(FactureClt factureclt){
       
        CaisseClt Caisse = new CaisseClt();
        
        String totalhorstaxnet =factureclt.getTotalHorsTaxNet().replace(",", ".");
        String totaltva = factureclt.getTotalTVA().replace(",", ".");
        String netapayer = factureclt.getNetAPayer().replace(",", ".");
        
        String TotalRemise = "NULL";
        if(factureclt.getRemise() != null){
            TotalRemise = factureclt.getRemise().replace(",", ".");
        }
        
        String Devise = ParametreSystem.CurrencySign;
        String IdCommande = "NULL";
        String IdBonLivraisonClt = "NULL";
        String TypeFacilite = factureclt.getTypeFacilite();
        String Avance = "NULL";
        String TotalMontantTraites = "NULL";
        String NbrTraite = "NULL";
        String MontantInteret= "NULL";
        String TauxInteret= "NULL";
        
        
        //TypeRegement (0) ==> Facture payer en Comptent  |  (1) Facture payer par facilité
        Integer TypeReglement = factureclt.getTypeRegementInteger();
        
        
        //mode paiement Comptent:    0 :espace   1:cheque    2 :carte bancaire
        String ModePaiement =  "0"; 
        if(factureclt.getModePaiement() != null){
            ModePaiement =  factureclt.getModePaiement();
        }
        
        
        if(TypeReglement == 1){
            Caisse.setTypeMouvement("1");
            TypeFacilite = factureclt.getTypeFacilite();
            Avance = factureclt.getAvance().replace(",", ".");
            Caisse.setMontant(Avance);
            TotalMontantTraites = factureclt.getTotalMontantTraite().replace(",", ".");
            NbrTraite = factureclt.getNbrTraite();
            MontantInteret= factureclt.getMontantInteret().replace(",", ".");
            TauxInteret= factureclt.getTauxInteret().replace(",", ".");
        }
        
        
        if( factureclt.getIdBonLivraisonClt()!= null && !factureclt.getIdBonLivraisonClt().isEmpty() ){
            IdBonLivraisonClt = factureclt.getIdBonLivraisonClt();
        }
        
        if(!factureclt.getIdCommandeClt().isEmpty()){
            IdCommande = factureclt.getIdCommandeClt();
        }
        
        String sql = "";
        if(factureclt.getTypeClient()==0){
            String codeclientPersonne = factureclt.CltPersonne.getCodeclient().toString();
            sql = "INSERT INTO factureclt (`type_reglement`, `mode_paiement`, `date_facture`, `typeclt`, `idcltentreprise`, `idcltexiste`, `idcltpassageur`, `devise`, `total_h_t_net`, `total_tva`, `remise`, `timbre_loi`, `net_a_payer`, `type_facilite`, `avance`, `total_montant_traites`, `nbr_traite`, `montant_interet`, `taux_interet`, `idcommande_commandeclt`, id_bon_livraisonclt, `profile_idprofile`, `local_nom`) VALUES ('"+TypeReglement+"', '"+ModePaiement+"', CURTIME(), '"+factureclt.getTypeClient()+"', NULL, '"+codeclientPersonne+"', NULL, '"+Devise+"', "+totalhorstaxnet+", "+totaltva+", "+TotalRemise+", '"+ParametreSystem.Timbre+"', '"+netapayer+"', "+TypeFacilite+", "+Avance+", "+TotalMontantTraites+", "+NbrTraite+", "+MontantInteret+", "+TauxInteret+", "+IdCommande+", "+IdBonLivraisonClt+", "+User.idprofile+", '"+ParametreSystem.NomLocalPC+"');";
         }
        if(factureclt.getTypeClient()==1){
            String codeclientEntreprise = factureclt.CltEntreprise.getCode().toString();
            sql = "INSERT INTO factureclt (`type_reglement`, `mode_paiement`, `date_facture`, `typeclt`, `idcltentreprise`, `idcltexiste`, `idcltpassageur`, `devise`, `total_h_t_net`, `total_tva`, `remise`, `timbre_loi`, `net_a_payer`, `type_facilite`, `avance`, `total_montant_traites`, `nbr_traite`, `montant_interet`, `taux_interet`, `idcommande_commandeclt`, id_bon_livraisonclt, `profile_idprofile`, `local_nom`) VALUES ('"+TypeReglement+"', '"+ModePaiement+"', CURTIME(), '"+factureclt.getTypeClient()+"', '"+codeclientEntreprise+"', NULL, NULL, '"+Devise+"', "+totalhorstaxnet+", "+totaltva+", "+TotalRemise+", '"+ParametreSystem.Timbre+"', '"+netapayer+"', "+TypeFacilite+", "+Avance+", "+TotalMontantTraites+", "+NbrTraite+", "+MontantInteret+", "+TauxInteret+", "+IdCommande+", "+IdBonLivraisonClt+", "+User.idprofile+", '"+ParametreSystem.NomLocalPC+"');";
            }
        if(factureclt.getTypeClient()==2){
            //insertion de passager
            String codepassager =  factureclt.CltPassager.getCodeclient().toString();
            if(!codepassager.isEmpty()){
                sql = "INSERT INTO factureclt (`type_reglement`, `mode_paiement`, `date_facture`, `typeclt`, `idcltentreprise`, `idcltexiste`, `idcltpassageur`, `devise`, `total_h_t_net`, `total_tva`, `remise`, `timbre_loi`, `net_a_payer`, `type_facilite`, `avance`, `total_montant_traites`, `nbr_traite`, `montant_interet`, `taux_interet`, `idcommande_commandeclt`, id_bon_livraisonclt, `profile_idprofile`, `local_nom`) VALUES ('"+TypeReglement+"', '"+ModePaiement+"', CURTIME(), '"+factureclt.getTypeClient()+"', NULL, NULL, "+codepassager+", '"+Devise+"', '"+totalhorstaxnet+"', '"+totaltva+"', '"+TotalRemise+"', '"+ParametreSystem.Timbre+"', "+netapayer+", "+TypeFacilite+", "+Avance+", "+TotalMontantTraites+", "+NbrTraite+", "+MontantInteret+", "+TauxInteret+", '"+IdCommande+"', "+IdBonLivraisonClt+", "+User.idprofile+", '"+ParametreSystem.NomLocalPC+"');";
            }
        }
        
        String codeFactureclt = cnx.InsertGetLastId(sql);
        factureclt.setCodeFactureClt(codeFactureclt);
        
        
        //TypeRegement (0) ==> Facture payer en Comptent
        if(factureclt.getTypeRegementInteger() == 0)
        {
            Caisse.setTypeMouvement("0");
            Caisse.setMontant(netapayer);
            
            //ModePaiement 1:cheque 
            if(factureclt.getModePaiement() == "1")
            {
                ChequeClt ChequeClt = factureclt.getCheque();
                ChequeClt.setCodeFactureClt(codeFactureclt);
                new ChequeCltDB().AddChequeClt(ChequeClt);
            }
            //ModePaiement 2 :carte bancaire
            else if(factureclt.getModePaiement() == "2")
            {
                CarteBancaireClt CarteBancaire = factureclt.getCarteBancaire();
                CarteBancaire.setIdFactureClt(codeFactureclt);
                new CarteBancaireCltDB().SetCarteBancaire(CarteBancaire);
            }
        }
        
        if(!factureclt.getIdCommandeClt().isEmpty()){
            new CommandeCltDB().UpdateCommandeCltSetIdFacture(factureclt.getIdCommandeClt(), codeFactureclt);
        }
        
        Caisse.setCodeFactureClt(codeFactureclt);
        
        
        String req ; String PrixHT ; String Remise ; String TotalHT ; String TVA ; String TotalTTC ;
        for(ListeProduit listeprod : factureclt.getListeproduit()){
            PrixHT = listeprod.getPrixHT().replace(",",".");
            Remise= listeprod.getRemise().replace("%","").replace(",",".");
            TotalHT= listeprod.getTotalHT().replace(",",".");
            TVA=listeprod.getTVA().replace("%","").replace(",",".");
            TotalTTC= listeprod.getTotalTTC().replace(",","."); 
         
            req = "INSERT INTO `list_prod_factclt` (`idfactureclt_factureclt`, `produit_reference`, `designation_produit`, `quantite`, `p_u_h_t`, `remise`, `p_u_h_t_net`, `tva`, `montant`, `local_nom`) VALUES ('"+codeFactureclt+"', '"+listeprod.getReference()+"', \""+listeprod.getDesignation()+"\", "+listeprod.getQuantite()+", "+PrixHT+", '"+Remise+"', '"+TotalHT+"', '"+TVA+"', '"+TotalTTC+"', '"+ParametreSystem.NomLocalPC+"');";
          
            cnx.insertion(req);
        }
     
        
        ArrayList<TraiteClt> ListTraites = factureclt.getListeTraites();
        ArrayList<ChequeClt> ListCheque = factureclt.getListeCheques();
        
        if(ListTraites!=null){
            TraiteCltDB TraiteDB = new TraiteCltDB();
            TraiteDB.AddListeTraiteClt(ListTraites, codeFactureclt);
        }else if(ListCheque!=null){
            ChequeCltDB ChequeDB = new ChequeCltDB();
            ChequeDB.AddListeChequeClt(ListCheque, codeFactureclt);
        }
        
        
        
        
        Caisse.setLocalNom(ParametreSystem.NomLocalPC);
        Caisse.setIdProfile(User.idprofile);
        
        CaisseDB CaisseDB = new CaisseDB();
        CaisseDB.AddCaisse(Caisse);
        
        return codeFactureclt ;
    }
    
    public FactureClt getFactureClt(String codefacture){
        
        FactureClt factureClt = new FactureClt();
        String req = "SELECT *, DATE_FORMAT(date_facture, '%d/%m/%Y') as datefacture FROM factureclt WHERE (idfactureclt = "+codefacture+") AND (local_nom = '"+ParametreSystem.NomLocalPC+"') ;";
        
        if(cnx.ouverture()){
            try{
               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){                
                    factureClt.setCodeFactureClt(resultat.getString("idfactureclt"));
                    factureClt.setTypeRegement(resultat.getString("type_reglement"));
                    factureClt.setIdCommandeClt(resultat.getString("idcommande_commandeclt"));
                    factureClt.setIdBonLivraisonClt(resultat.getString("id_bon_livraisonclt"));
                    
                    //0 :espace     |  1:cheque    |   2 :carte bancaire   | 3: virement bancaire
                    factureClt.setModePaiement(resultat.getString("mode_paiement"));
                    
                    factureClt.setDateFacture(resultat.getString("date_facture"));
                    factureClt.setNetAPayer(resultat.getString("net_a_payer"));
                    factureClt.setTotalHorsTaxNet(resultat.getString("total_h_t_net"));
                    factureClt.setTotalTVA(resultat.getString("total_tva"));
                    factureClt.setRemise(resultat.getString("remise"));
                    factureClt.setTimbre(resultat.getString("timbre_loi"));
                    factureClt.setCodeUser(resultat.getInt("profile_idprofile"));
                    factureClt.setTypeClient(resultat.getInt("typeclt"));
                    factureClt.setTypeFacilite(resultat.getString("type_facilite"));
                    
                    if(factureClt.getTypeClient()==0)
                    {
                        String Codeclient = resultat.getString("idcltexiste");
                        factureClt.setCltPersonne(new ClientDB().getClient(Codeclient));
                    }
                    if(factureClt.getTypeClient()==1)
                    {
                        String Codeclient = resultat.getString("idcltentreprise");
                        factureClt.setCltEntreprise(new ClientEntrepriseDB().GetClientEtr(Codeclient));
                    }
                    if(factureClt.getTypeClient()==2)
                    {
                        String Codeclient = resultat.getString("idcltpassageur");
                        factureClt.setCltPassager(new ClientPassagerDB().getClient(Codeclient));
                    }
                    
                    cnx.ouverture();
                    String reqprod = "SELECT * FROM list_prod_factclt WHERE (idfactureclt_factureclt = "+codefacture+") AND (local_nom = '"+ParametreSystem.NomLocalPC+"');";
                    ResultSet resulist = cnx.excutionquery(reqprod);
                    //on repace le curseur avant la première ligne
                    resulist.beforeFirst();
                    ObservableList<ListeProduit> dataProdDev=FXCollections.observableArrayList();
                    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));
                    }
                    factureClt.setListeproduit(dataProdDev);
                    
                    //type reglement: 0  comptant 1  facilité
                    if(resultat.getString("type_reglement").equals("1") ){
                        factureClt.setTotalMontantTraite(resultat.getString("total_montant_traites"));
                        //List Traite factureClt True Traites
                        if(factureClt.getTypeFaciliteBoolean()){
                            cnx.ouverture();
                            String ReqListeTraite = "SELECT *, DATE_FORMAT(date_creation, '%d/%m/%Y') as DateCreation ,DATE_FORMAT(date_traite, '%d/%m/%Y') as DateTraite ,DATE_FORMAT(date_paiement, '%d/%m/%Y') as DatePaiement FROM traite_clt WHERE (id_factureclt = "+codefacture+") AND (local_nom = '"+ParametreSystem.NomLocalPC+"');";
                            ResultSet ResultListeTraite = cnx.excutionquery(ReqListeTraite);
                            ResultListeTraite.beforeFirst();
                            ArrayList<TraiteClt> ListTraites = new ArrayList();
                            while ( ResultListeTraite.next() ) {
                                TraiteClt Traite = new TraiteClt();
                                Traite.setCodeTraiteClt(ResultListeTraite.getString("id_traite"));
                                Traite.setDateCreationTraiteClt(ResultListeTraite.getString("DateCreation"));
                                Traite.setDateTraiteClt(ResultListeTraite.getString("DateTraite"));
                                Traite.setId_reglement(ResultListeTraite.getString("id_factureclt"));
                                Traite.setMontantTraiteClt(ResultListeTraite.getString("montant_traite"));
                                Traite.setDatePaiementTraiteClt(ResultListeTraite.getString("DatePaiement"));
                                ListTraites.add(Traite);
                            }
                            factureClt.setListeTraites(ListTraites);
                        }else if(factureClt.getTypeFaciliteBoolean() == false){
                            String ReqListeChequeClt = "SELECT id_chequeclt, numero, banque, montant, nom_complet, DATE_FORMAT(date_paiement, '%d/%m/%Y') AS DatePaiement, DATE_FORMAT(date_creation, '%d/%m/%Y') AS DateCreation , id_factureclt  FROM cheque_clt WHERE (id_factureclt = "+codefacture+") AND (local_nom = '"+ParametreSystem.NomLocalPC+"');";
                            ResultSet ResultListeChequeClt = cnx.excutionquery(ReqListeChequeClt);
                            ResultListeChequeClt.beforeFirst();
                            ArrayList<ChequeClt> ListChequeClt = new ArrayList();
                            while ( ResultListeChequeClt.next() ) {
                                 ChequeClt Cheque = new ChequeClt();
                                 Cheque.setCodeChequeClt(ResultListeChequeClt.getString("id_chequeclt"));
                                 Cheque.setNumeroChequeClt(ResultListeChequeClt.getString("numero"));
                                 Cheque.setBanqueChequeClt(ResultListeChequeClt.getString("banque"));
                                 Cheque.setMontantChequeClt(ResultListeChequeClt.getString("montant"));
                                 Cheque.setNomCompletChequeClt(ResultListeChequeClt.getString("nom_complet"));
                                 Cheque.setDatePaiement(ResultListeChequeClt.getString("DatePaiement"));
                                 Cheque.setDateCreation(ResultListeChequeClt.getString("DateCreation"));
                                 ListChequeClt.add(Cheque);
                            }
                            factureClt.setListeCheques(ListChequeClt);
                        }
                    }
                }
            }
            catch(SQLException ex){
                System.err.println("Erreur SQL ! \n"+ex.getMessage());
            }
        }
        return factureClt ;
    }
    
    /********************************** Initial *******************************/
    public ObservableList<FactureCltGestionList> SearchFactureCltGestion(Integer debut, Integer nbr, String CodeFacture, String CodeClient, String Reglement, String CodeCommande, String DateCreation)
    {
        ObservableList<FactureCltGestionList> data = FXCollections.observableArrayList();
        
        String Where = "";
        
        if(!clt.isStringNull(CodeFacture)){
            Where += " (idfactureclt LIKE \"%"+Adaptateur.addSlashes(CodeFacture)+"%\") AND ";
        }
        
        if(!clt.isStringNull(CodeClient)){
            Where += " ( idcltentreprise LIKE '%"+CodeClient+"%' OR idcltexiste LIKE '%"+CodeClient+"%' OR idcltpassageur LIKE '%"+CodeClient+"%' ) AND ";
        }
        
        if(!clt.isStringNull(Reglement)){
            Where += " (type_reglement = \""+Reglement+"\") AND ";
        }
        
        if(!clt.isStringNull(CodeCommande)){
            Where += " (idcommande_commandeclt LIKE \"%"+Adaptateur.addSlashes(CodeCommande)+"%\") AND ";
        }
        
        if(!clt.isStringNull(DateCreation)){
            Where += " (DATE(date_facture) =  \""+DateCreation+"\") AND ";
        }
        
        if(!Where.equals("")){
            Where = Where.substring(0, Where.length() - 4);
            Where = "WHERE  " + Where;
        }
        
        String req="SELECT idfactureclt,  typeclt, idcltentreprise, idcltexiste, idcltpassageur,  net_a_payer, type_reglement, idcommande_commandeclt,  DATE_FORMAT(date_facture, '%d/%m/%Y') as date_facture "+ 
                    "FROM factureclt " +
                    Where +
                    " ORDER BY date_facture DESC "+ 
                    " 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 code_facture = resultat.getString("idfactureclt");
                        
                        String type_client = "";
                        String code_client = "";
                        if(resultat.getString("typeclt").equals("0")){
                            type_client ="Exist Client";
                            code_client = resultat.getString("idcltexiste");
                        }else if(resultat.getString("typeclt").equals("1")){
                            type_client ="Entreprise";
                            code_client = resultat.getString("idcltentreprise");
                        }else if(resultat.getString("typeclt").equals("2")){
                            type_client ="Passager";
                            code_client = resultat.getString("idcltpassageur");
                        }
                        
                        String total_facture = Adaptateur.FloatToStringEspace(resultat.getFloat("net_a_payer"));
                        
                        String type_reglement = ""; //reglement
                        if(resultat.getString("type_reglement").equals("0")){
                            type_reglement = "Comptant";
                        }else if(resultat.getString("type_reglement").equals("1")){
                            type_reglement = "Facilité";
                        }
                       
                        String code_commande =resultat.getString("idcommande_commandeclt");
                        
                        String date_creation =resultat.getString("date_facture");
                        
                        data.add(new FactureCltGestionList(code_facture, type_client, code_client, type_reglement, total_facture, code_commande, date_creation));
                    }
                }
            }
            catch(SQLException ex){
                System.err.println("Erreur SQL ! \n"+ex.getMessage());
                System.out.println(req);
            }
        }
        
       return data ;
    }
    
    
    public Integer nbrFactureCltGestion(String CodeFacture, String CodeClient, String Reglement, String CodeCommande, String DateCreation)
    {
        String Where = "";
        
        if(!clt.isStringNull(CodeFacture)){
            Where += " (idfactureclt LIKE \"%"+Adaptateur.addSlashes(CodeFacture)+"%\") AND ";
        }
        
        if(!clt.isStringNull(CodeClient)){
            Where += " ( idcltentreprise LIKE '%"+CodeClient+"%' OR idcltexiste LIKE '%"+CodeClient+"%' OR idcltpassageur LIKE '%"+CodeClient+"%' ) AND ";
        }
        
        if(!clt.isStringNull(Reglement)){
            Where += " (type_reglement = \""+Reglement+"\") AND ";
        }
        
        if(!clt.isStringNull(CodeCommande)){
            Where += " (idcommande_commandeclt LIKE \"%"+Adaptateur.addSlashes(CodeCommande)+"%\") AND ";
        }
        
        if(!clt.isStringNull(DateCreation)){
            Where += " (DATE(date_facture) =  \""+DateCreation+"\") AND ";
        }
        
        if(!Where.equals("")){
            Where = Where.substring(0, Where.length() - 4);
            Where = "WHERE  " + Where;
        }
        
        String req=" SELECT COUNT(idfactureclt) "+ 
                    " FROM `factureclt` "+ 
                    Where+" ;"; 
        
        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 sommme ;
    }

}
