package Models.Caisse;

import Controllers.Traitement.Adaptateur;
import Controllers.Traitement.ParametreSystem;
import Models.ChequeClt.ChequeClt;
import Models.ChequeClt.ChequeCltDB;
import Models.FactureClt.FactureClt;
import Models.FactureClt.FactureCltDB;
import Models.TraiteClt.TraiteCltDB;
import Models.User.User;
import Models.VenteRapideClt.VenteSansFacture;
import Models.VenteRapideClt.VenteSansFactureDB;
import Models.connexion;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Map;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;



/**
 *
 * @author maher
 */
public class CaisseDB {
    
    connexion cnx = new connexion();
    
    public String AddCaisse(CaisseClt caisse){
        String req ="INSERT INTO caisseclt (date_mouvement, `type_mouvement`, id_traite_paiement_espace, id_traite_paiement_carte, id_traite_paiement_cheque, `id_factureclt`, `id_avoir_factclt`, `id_historique_cheque_clt`, `id_vente_sans_facture`, `montant`, `local_nom`, `id_profile`) VALUES (CURTIME(), "+caisse.getTypeMouvement()+", "+caisse.getIdTraitePaiementEspace()+", "+caisse.getIdTraitePaiementCarte()+", "+caisse.getIdTraitePaiementCheque()+", "+caisse.getCodeFactureClt()+", "+caisse.getIdAvoirFactClt()+", "+caisse.getIdHistoriqueCheque()+","+caisse.getIdVenteSansFactureClt()+",  "+caisse.getMontant()+", '"+ParametreSystem.NomLocalPC+"', "+User.idprofile+")";
        return cnx.InsertGetLastId(req);
    }
    
    public  ObservableList<CaisseSortieListe> GetDataCaisseFrsSortie(String Datedebut, String DateFin){
        
        ObservableList<CaisseSortieListe> DataReglementList = this.GetDataReglementFrs(Datedebut, DateFin);
        
        ObservableList<CaisseSortieListe> DataFraisList = this.GetDataFraisFrs(Datedebut, DateFin);
        
        ObservableList<CaisseSortieListe> DataTraiteList = this.GetDataTraiteFrs(Datedebut, DateFin);
        
        // supprimer une vente sans facture
        ObservableList<CaisseSortieListe> DataAvoirVSFList = this.GetDataAvoirVSF(Datedebut, DateFin);
        
        ObservableList<CaisseSortieListe> CaisseFrsSortieList = FXCollections.concat(DataReglementList, DataTraiteList, DataFraisList, DataAvoirVSFList);
       
       return CaisseFrsSortieList;
    }
    
    
    public  ObservableList<CaisseSortieListe> GetDataAvoirVSF(String DateDebut, String DateFin){
        
        ObservableList<CaisseSortieListe> DataAvoirVSFList = FXCollections.observableArrayList();
        
        String Query =  " SELECT VSF.*, C.numero, C.banque, B.num_transation, B.nom_banque, DATE_FORMAT(date_operation, '%d/%m/%Y %H:%i') as date_oper " +
                        " FROM `vente_sans_facture` VSF " +
                        " LEFT JOIN `cheque_clt` C ON (C.id_chequeclt = VSF.id_chequeclt) " +
                        " LEFT JOIN `carte_bancaire_clt` B ON (B.id_carte_bancaire = VSF.id_carte_bancaire) " +
                        " WHERE (VSF.operation = 1) AND (DATE(VSF.date_operation) BETWEEN '"+DateDebut+"' AND '"+DateFin+"'); ";
        
        if(cnx.ouverture()){
            try{
                ResultSet resultat= cnx.FetchALL(Query);
                
                while ( resultat.next() ) { 
                    
                    String id_vsf = resultat.getString("id_vente_sans_facture");
                    Float montant =  resultat.getFloat("montant");
                     
                    //0 :espace   1:Chèque    2 :carte bancaire
                    String mode_paiement = resultat.getString("paiement");
                    
                    String type_mouvement = "";
                    String cheque= "";
                    String carte_bancaire= "";
                    String type = "Avoir VSF";
                    String espece = "";
                    
                    if(mode_paiement.equals("0")){
                        type_mouvement = "Espèce";
                        espece =  resultat.getString("nom_prenom_client");
                    }else if(mode_paiement.equals("1")){
                        type_mouvement = "Chèque";
                        cheque = resultat.getString("numero")+"-"+resultat.getString("banque");
                    }else if(mode_paiement.equals("2")){
                        type_mouvement = "Carte Bancaire";
                        carte_bancaire = resultat.getString("num_transation")+"-"+resultat.getString("nom_banque");
                    }
                    
                    String date_oper = resultat.getString("date_oper");
                    
                    DataAvoirVSFList.add(new CaisseSortieListe(id_vsf, type_mouvement, type, date_oper, Adaptateur.FloatToStringEspace(montant), cheque, espece, carte_bancaire, montant));
                }
            }catch(SQLException ex){
                System.err.println("Erreur SQL ! \n"+ex.getMessage());
            }
        }
        return DataAvoirVSFList;
    }
    
    public  ObservableList<CaisseSortieListe> GetDataFraisFrs(String Datedebut, String DateFin){
        
        ObservableList<CaisseSortieListe> DataFraisList = FXCollections.observableArrayList();
        
        String Query =  " SELECT *, DATE_FORMAT(date_creation, '%d/%m/%Y %H:%i') as date_creat " +
                        " FROM frais " +
                        " WHERE (DATE(date_creation) BETWEEN '"+Datedebut+"' AND '"+DateFin+"') ";
        
        if(cnx.ouverture()){
            try{
                ResultSet resultat= cnx.FetchALL(Query);
                
                while ( resultat.next() ) { 
                    
                    String id_frais = resultat.getString("id_frais");
                     Float montant =  resultat.getFloat("montant");
                     
                    //0 :espece   1:Chèque    2 :carte bancaire
                    String mode_paiement = resultat.getString("mode_paiement");
                    
                    String type_mouvement = "";
                    String cheque= "";
                    String carte_bancaire= "";
                    String type = "Frais";
                    String espece = "";
                    
                    if(mode_paiement.equals("0")){
                        type_mouvement = "Espèce";
                        espece =  resultat.getString("object");
                    }else if(mode_paiement.equals("1")){
                        type_mouvement = "Chèque";
                        cheque = resultat.getString("numero")+"-"+resultat.getString("banque");
                    }else if(mode_paiement.equals("2")){
                        type_mouvement = "Carte Bancaire";
                        carte_bancaire = resultat.getString("numero")+"-"+resultat.getString("banque");
                    }
                    
                    String date_mouvement = resultat.getString("date_creat");
                    
                    DataFraisList.add(new CaisseSortieListe(id_frais, type_mouvement, type, date_mouvement,Adaptateur.FloatToStringEspace(montant), cheque, espece, carte_bancaire, montant));
                }
            }catch(SQLException ex){
                System.err.println("Erreur SQL ! \n"+ex.getMessage());
            }
        }
        return DataFraisList;
    }
    
    public  ObservableList<CaisseSortieListe> GetDataReglementFrs(String Datedebut, String DateFin){
        
        ObservableList<CaisseSortieListe> DataReglementList = FXCollections.observableArrayList();
        
        String Query =  " SELECT  R.*, F.id_fourisseur, F.nom, R.date_creation as datecreation, DATE_FORMAT(R.date_creation, '%d/%m/%Y %H:%i') as date_creat, " +
                        " C.numero, C.banque, C.montant, " +
                        " E.numero_transaction, E.banque, E.montant " +
                        " FROM reglement_frs R " +
                        " LEFT JOIN `fournisseur` F ON (F.id_fourisseur = R.id_fourisseur) " +
                        " LEFT JOIN `cheque_frs` C ON (C.id_reglement_frs = R.id_reglement_frs) " +
                        " LEFT JOIN `carte_electronique_frs` E ON (E.id_reglement_frs = R.id_reglement_frs) " +
                        " WHERE (DATE(R.date_creation) BETWEEN '"+Datedebut+"' AND '"+DateFin+"')" +
                        " AND (R.mode_paiement NOT LIKE '3'); ";
        
        if(cnx.ouverture()){
            try{
                ResultSet resultat= cnx.FetchALL(Query);
                
                while ( resultat.next() ) { 
                    
                    String id_reglement = resultat.getString("R.id_reglement_frs");
                    
                    //les traites est récupéer par la fonction GetDataTraiteFrs
                    
                    //0 :espace   1:Chèque    2 :carte bancaire    3: Traite
                    String mode_paiement = resultat.getString("R.mode_paiement");
                    String type_mouvement = "";
                    String cheque= "";
                    String carte_bancaire= "";
                    String type = "Achat";
                    Float montant = null;
                    String espece = "";
                    
                    if(mode_paiement.equals("0")){
                        type_mouvement = "Espèce";
                        montant = resultat.getFloat("R.montant");
                        espece =  resultat.getString("F.id_fourisseur")+"-"+resultat.getString("F.nom");
                    }else if(mode_paiement.equals("1")){
                        type_mouvement = "Chèque";
                        cheque = resultat.getString("C.numero")+"-"+resultat.getString("C.banque");
                        montant = resultat.getFloat("C.montant");
                    }else if(mode_paiement.equals("2")){
                        type_mouvement = "Carte Bancaire";
                        carte_bancaire = resultat.getString("E.numero_transaction")+"-"+resultat.getString("E.banque");
                        montant = resultat.getFloat("E.montant");
                    }
                    
                    String date_mouvement = resultat.getString("date_creat");
                    
                    DataReglementList.add(new CaisseSortieListe(id_reglement, type_mouvement, type, date_mouvement,Adaptateur.FloatToStringEspace(montant), cheque, espece, carte_bancaire, montant));
                }
            }catch(SQLException ex){
                System.err.println("Erreur SQL ! \n"+ex.getMessage());
            }
        }
        return DataReglementList;
    }
    
    public  ObservableList<CaisseSortieListe> GetDataTraiteFrs(String Datedebut, String DateFin){
        
        ObservableList<CaisseSortieListe> DataReglementList = FXCollections.observableArrayList();
        
        String Query =  " SELECT  *, " +
                        " DATE_FORMAT(T.date_creation, '%d/%m/%Y') as date_pai " +
                        " FROM traite_frs T, reglement_frs R, fournisseur F " +
                        " WHERE (T.id_reglement_frs = R.id_reglement_frs) " +
                        " AND (R.id_fourisseur = F.id_fourisseur) " +
                        " AND (T.date_paiement BETWEEN '"+Datedebut+"' AND '"+DateFin+"'); ";
        
        if(cnx.ouverture()){
            try{
                ResultSet resultat= cnx.FetchALL(Query);
                
                while ( resultat.next() ) { 
                    
                    String id_reglement = resultat.getString("T.id_traite_frs");
                    
                    Float montant = resultat.getFloat("T.montant");
                    String date_mouvement = resultat.getString("date_pai");
                    
                    String espece = resultat.getString("F.nom");
                    DataReglementList.add(new CaisseSortieListe(id_reglement, "Espèce", "Traite", date_mouvement, Adaptateur.FloatToStringEspace(montant), "", espece, "", montant));
                }
            }catch(SQLException ex){
                System.err.println("Erreur SQL ! \n"+ex.getMessage());
            }
        }
        return DataReglementList;
    }
    
    public  ObservableList<CaisseListe> GetDataCaisseCltEnter(String Datedebut, String DateFin){
        
        String Query =  " SELECT  id_caisseclt, DATE_FORMAT(date_mouvement, '%d/%m/%Y %H:%i') as date_mouvement, type_mouvement, id_factureclt, id_avoir_factclt, id_vente_sans_facture, montant, id_traite_paiement_espace, id_traite_paiement_carte, id_traite_paiement_cheque, id_historique_cheque_clt, id_profile, local_nom" +
                        " FROM caisseclt " +
                        " WHERE (DATE(date_mouvement) BETWEEN '"+Datedebut+"' AND '"+DateFin+"') " +
                        " AND (local_nom ='"+ParametreSystem.NomLocalPC+"') " +
                        " AND (type_mouvement IN (0,1,2,3,4,5)); ";
        
        ObservableList<CaisseListe> CaisseCltEnterList = FXCollections.observableArrayList();
        if(cnx.ouverture()){
            try{
                ResultSet resultat= cnx.FetchALL(Query);
                
                while ( resultat.next() ) { 
                    
                    //String id_caisseclt = resultat.getString("id_caisseclt");
                    float montant = resultat.getFloat("montant");
                    String id_profile = resultat.getString("id_profile"); 
                    String date_mouvement = resultat.getString("date_mouvement");
                    
                    // 0-Vente Comptant   |    1-Vente Facilité Avance  |   2 Vente Commande Avance | 3 traite clt |  4 ChequeClt  | 5 Vente Sans Facture | 6 Vente Avoir
                    String type_mouvement = resultat.getString("type_mouvement");
                    
                    String id_caisseclt = "";
                    String type = "";
                    String cheque_numero = "";
                    String cheque_banque = "";
                    String espace_nom  = "";
                    String espace_prenom = "";
                    String carte_numero = "";
                    String carte_banque = "";
                   
                    
                    if((type_mouvement.equals("0")) || (type_mouvement.equals("1")) || (type_mouvement.equals("2"))){
                       
                        String id_factureclt = resultat.getString("id_factureclt");
                        id_caisseclt = id_factureclt;
                        FactureClt Facture = new FactureCltDB().getFactureClt(id_factureclt);
                        String ModePaiement = Facture.getModePaiement();
                       
                        if(ModePaiement.equals("0")){//0 :espace
                            
                            if(Facture.getTypeClient() == 0){
                                espace_nom  = Facture.getCltPersonne().getNom();
                                espace_prenom = Facture.getCltPersonne().getPrenom();
                            }else if (Facture.getTypeClient() == 1){
                                espace_nom  = Facture.getCltEntreprise().getNom();
                                espace_prenom = Facture.getCltEntreprise().getMatricule();
                            }else if (Facture.getTypeClient() == 2){
                                espace_nom  = Facture.getCltPassager().getNom();
                                espace_prenom = Facture.getCltPassager().getPrenom();
                            }
                            
                        }else if (ModePaiement.equals("1")){//1:cheque
                            ChequeClt Cheque = new ChequeCltDB().getChequeCltByFacture(Facture.getCodeFactureClt());
                            cheque_numero = Cheque.getNumeroChequeClt();
                            cheque_banque = Cheque.getBanqueChequeClt();
                        }else if (ModePaiement.equals("2")){//3 :carte bancaire
                            CarteBancaireClt CarteBancaire = new CarteBancaireCltDB().getCarteBancaireByFactureClt(Facture.getCodeFactureClt());
                            carte_numero = CarteBancaire.getNumeroTransation();
                            carte_banque = CarteBancaire.getNomBanque();
                        }
                        

                        if(type_mouvement.equals("0")){
                            type = "Vente Comptant";
                        }else if (type_mouvement.equals("1")){
                            type = "Vente Facilité Avance";
                        }else if (type_mouvement.equals("2")){
                            type = "Vente Commande Avance";
                        }
                    }else if(type_mouvement.equals("3")){
                        type = "Traite";
                        String id_traite_paiement_espace = resultat.getString("id_traite_paiement_espace"); 
                        String id_traite_paiement_carte = resultat.getString("id_traite_paiement_carte");
                        String id_traite_paiement_cheque = resultat.getString("id_traite_paiement_cheque");
                        
                        if(id_traite_paiement_espace != null){
                            Map PaiementTraiteEspace = new TraiteCltDB().GetEspacePaiementTraite(id_traite_paiement_espace);
                            id_caisseclt = PaiementTraiteEspace.get("IdTraite").toString();
                            espace_nom  = PaiementTraiteEspace.get("Nom").toString();
                            espace_prenom = PaiementTraiteEspace.get("Prenom").toString();
                        }else if(id_traite_paiement_carte != null){
                            Map PaiementTraiteCarte = new TraiteCltDB().GetCartePaiementTraite(id_traite_paiement_carte);
                            id_caisseclt = PaiementTraiteCarte.get("IdTraite").toString();
                            carte_numero  = PaiementTraiteCarte.get("numero_carte").toString();
                            carte_banque = PaiementTraiteCarte.get("banque").toString();
                        }else if(id_traite_paiement_cheque != null){
                            Map PaiementTraiteCheque = new TraiteCltDB().GetChequePaiementTraite(id_traite_paiement_cheque);
                            id_caisseclt = PaiementTraiteCheque.get("IdTraite").toString();
                            cheque_numero  = PaiementTraiteCheque.get("numero").toString();
                            cheque_banque = PaiementTraiteCheque.get("banque").toString();
                        } 
                    }else if(type_mouvement.equals("4")){
                        type = "Chèque";
                       
                        String id_historique_cheque_clt = resultat.getString("id_historique_cheque_clt");
                        if(id_historique_cheque_clt != null){
                            ChequeClt Cheque = new ChequeCltDB().getChequeCltByIdHistorique(id_historique_cheque_clt);
                            // 0 cheque sans provision     1 Verser (Valider)   2 Contre chéque(espace)
                            id_caisseclt = Cheque.getNumeroChequeClt();
                            
                            if(Cheque.getLastEtat() == 1){
                                cheque_numero = Cheque.getNumeroChequeClt();
                                cheque_banque = Cheque.getBanqueChequeClt();
                            }else if(Cheque.getLastEtat() == 2){
                                if(Cheque.getTypeClient() == 0){
                                    espace_nom = Cheque.getCltPersonne().getNom();
                                    espace_prenom = Cheque.getCltPersonne().getPrenom();
                                }else if(Cheque.getTypeClient() == 1){
                                    espace_nom =  Cheque.getCltEntreprise().getNom();
                                    espace_prenom = Cheque.getCltEntreprise().getMail();
                                }else if(Cheque.getTypeClient() == 2){
                                    espace_nom = Cheque.getCltPassager().getNom();
                                    espace_prenom = Cheque.getCltPassager().getPrenom();
                                }
                            }
                        } 
                    }else if(type_mouvement.equals("5")){ //5 Vente Sans Facture
                        type = "Vente Sans Facture";
                        VenteSansFacture venteSansFacture = new VenteSansFactureDB().getVenteSansFacture(resultat.getString("id_vente_sans_facture"));
                        id_caisseclt = venteSansFacture.getIdVenteSansFacture();
                        if(venteSansFacture.getPaiement().equals("0")){
                            if(venteSansFacture.getOperation() != null){
                                espace_nom  = "Annuler:";
                                espace_prenom = Adaptateur.NormalDateTimeFormat(venteSansFacture.getDateOperation());
                            }else{
                                espace_nom  = venteSansFacture.getNomPrenomClient();
                                espace_prenom = venteSansFacture.getNomPrenomClient();
                            }
                        }else if (venteSansFacture.getPaiement().equals("1")){
                            if(venteSansFacture.getOperation()!= null){
                                cheque_numero = "Annuler";
                                cheque_banque = Adaptateur.NormalDateTimeFormat(venteSansFacture.getDateOperation());
                            }else{
                                cheque_numero = venteSansFacture.getCheque().getNumeroChequeClt();
                                cheque_banque = venteSansFacture.getCheque().getBanqueChequeClt();
                            }
                            
                        }else if (venteSansFacture.getPaiement().equals("2")){
                            if(venteSansFacture.getOperation() != null){
                                carte_numero = "Annuler";
                                carte_banque = Adaptateur.NormalDateTimeFormat(venteSansFacture.getDateOperation());
                            }else{
                                carte_numero = venteSansFacture.getCarteBancaire().getNumeroTransation();
                                carte_banque = venteSansFacture.getCarteBancaire().getNomBanque();
                            }
                        }
                    }
                    
                    CaisseCltEnterList.add(new CaisseListe(id_caisseclt, type_mouvement, type, date_mouvement, Adaptateur.FloatToStringEspace(montant), cheque_numero, cheque_banque, espace_nom, espace_prenom, carte_numero, carte_banque, montant));
                    
                }
            }catch(SQLException ex){
                System.err.println("Erreur SQL ! \n"+ex.getMessage());
            }
        }
        
        return CaisseCltEnterList;
    }
    
    
    
    
    
}
