package Controllers.VenteRapideClt;

import Controllers.Dialog.Dialog;
import Controllers.Dialog.DialogSuccessController;
import Controllers.Dialog.ShowDialog;
import Controllers.Produit.RechercherProduitController;
import Controllers.Traitement.Adaptateur;
import Controllers.Traitement.MyWindow;
import Controllers.Traitement.ParametreSystem;
import Controllers.Traitement.contro;
import Models.Caisse.CarteBancaireClt;
import Models.ChequeClt.ChequeClt;
import Models.Produit.ListeProduit;
import Models.Produit.Produit;
import Models.Produit.ProduitDB;
import Models.User.User;
import Models.VenteRapideClt.ListeVenteSansFacture;
import Models.VenteRapideClt.VenteSansFacture;
import Models.VenteRapideClt.VenteSansFactureDB;
import javafx.scene.control.ProgressBar;
import java.io.IOException;
import java.net.URL;
import java.util.ResourceBundle;
import org.apache.log4j.Logger;
import javafx.beans.property.SimpleBooleanProperty;
import javafx.beans.value.ChangeListener;
import javafx.beans.value.ObservableValue;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.concurrent.Service;
import javafx.concurrent.Task;
import javafx.concurrent.WorkerStateEvent;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.fxml.FXML;
import javafx.fxml.FXMLLoader;
import javafx.fxml.Initializable;
import javafx.scene.Group;
import javafx.scene.Node;
import javafx.scene.Parent;
import javafx.scene.control.Button;
import javafx.scene.control.ChoiceBox;
import javafx.scene.control.DatePicker;
import javafx.scene.control.Label;
import javafx.scene.control.RadioButton;
import javafx.scene.control.TableCell;
import javafx.scene.control.TableColumn;
import javafx.scene.control.TableView;
import javafx.scene.control.TextField;
import javafx.scene.control.cell.PropertyValueFactory;
import javafx.scene.control.cell.TextFieldTableCell;
import javafx.scene.image.Image;
import javafx.scene.image.ImageView;
import javafx.scene.input.KeyCode;
import javafx.scene.input.KeyEvent;
import javafx.scene.input.MouseEvent;
import javafx.scene.layout.AnchorPane;
import javafx.scene.layout.GridPane;
import javafx.scene.layout.HBox;
import javafx.scene.text.Font;
import javafx.scene.text.FontWeight;
import javafx.scene.text.Text;
import javafx.util.Callback;

/**
 * FXML Controller class
 * @author Maher Ben Tili
 */
public class VenteSansFactureCltController implements Initializable {

    Logger logger = Logger.getLogger(VenteSansFactureCltController.class.getName());
    
    @FXML private AnchorPane PaneVenteSansFacture;
    
    @FXML private GridPane GridPaneCheque;
    @FXML private GridPane GridPaneCarteBancaire;
    
    @FXML private TextField TextFieldNumeroCheque;
    @FXML private TextField TextFieldBanqueCheque;
    @FXML private TextField TextFieldNomCompletCheque;
    @FXML private DatePicker DatePickerDateCheque;
    
    @FXML private Text TextControlNumeroCheque;
    @FXML private Text TextControlBanqueCheque;
    @FXML private Text TextControlNomCompletCheque;
    @FXML private Text TextControlDateCheque;
    
    @FXML private TextField TextFieldTransationCarte;
    @FXML private TextField TextFieldBanqueCarte;
    @FXML private TextField TextFieldNumeroCateCarte;
    
    @FXML private Text TextControlTransationCarte;
    @FXML private Text TextControlNumeroCate;
    
    @FXML private RadioButton RadioButtonEspece;
    @FXML private RadioButton RadioButtonCheque;
    @FXML private RadioButton RadioButtonCarteBancaire;
    
    @FXML private TextField TextFieldClient;
    
    @FXML private Text TextMontant;
    
    @FXML public TableView<ListeProduit> TableViewListeProduit ;
    @FXML public TableColumn<ListeProduit ,String> TabColReference;
    @FXML public TableColumn<ListeProduit ,String> TabColDesignation;
    @FXML public TableColumn<ListeProduit ,String> TabColQuantite ;
    @FXML public TableColumn<ListeProduit ,String> TabColPrixHT;
    @FXML public TableColumn<ListeProduit ,String> TabColRemise;
    @FXML public TableColumn<ListeProduit ,String> TabColTotalHT;
    @FXML public TableColumn<ListeProduit ,String> TabColTVA;
    @FXML public TableColumn<ListeProduit ,String> TabColTotalTTC;
    @FXML public TableColumn<ListeProduit ,Boolean> TabColAddAction ;
    
    public ObservableList<ListeProduit> data = FXCollections.observableArrayList();
    Produit produit=  new Produit();
    ProduitDB produitDB= new ProduitDB();
    
    VenteSansFacture Vente = new VenteSansFacture();

    float netaPayer = 0;
    
    @FXML public TableView<ListeVenteSansFacture> TableViewVenteSansFacture ;
    @FXML public TableColumn<ListeVenteSansFacture ,String> TabColCode;
    @FXML public TableColumn<ListeVenteSansFacture ,String> TabColDate;
    @FXML public TableColumn<ListeVenteSansFacture ,String> TabColNbrProd;
    @FXML public TableColumn<ListeVenteSansFacture ,String> TabColPaiement;
    @FXML public TableColumn<ListeVenteSansFacture ,String> TabColNomPrenomClient;
    @FXML public TableColumn<ListeVenteSansFacture ,String> TabColMontant;
    @FXML public TableColumn<ListeVenteSansFacture ,Boolean> TabColOperationAction ;
    
    @FXML private ProgressBar ProgressBarVenteSansFacture;
    
    @FXML private TextField TextFieldCode;
    @FXML private TextField TextFieldMontant;
    
    @FXML private DatePicker DatePickerDateVente;
    
    @FXML private Text ActuellePage ;
    @FXML private Text NbrPage ;
    @FXML private Group nextgroupe ;
    @FXML private Group avancergroupe ;
    @FXML private Group lastgroupe ;        
    @FXML private Group retourgroupe ;
    @FXML private Label LabelCount;
    @FXML private ChoiceBox NbrLigne ;
    
    ObservableList cursors = FXCollections.observableArrayList("10","15","20");
    private Integer nbrligne = 10 ;
    private Integer totalcount = 0;
    private Integer nbrpage = 0;
    private Integer actuellepage = 1;
    Integer position = 0;
    
    contro clt = new contro();
    
    private Service<Void> ThreadSearchVenteSansFacture;
    
    /**
     * Initializes the controller class.
     */
    @Override
    public void initialize(URL url, ResourceBundle rb) {
        
        NbrLigne.setItems(cursors);
        NbrLigne.getSelectionModel().selectFirst();
        
        Vente.setPaiement("0");
        
        TabColReference.setCellValueFactory(new PropertyValueFactory<ListeProduit, String>("reference"));
        TabColDesignation.setCellValueFactory(new PropertyValueFactory<ListeProduit, String>("designation"));

        TabColQuantite.setCellValueFactory(new PropertyValueFactory<ListeProduit, String>("quantite"));
        TabColQuantite.setStyle( "-fx-alignment: CENTER; -fx-font-weight:bold; -fx-font-size: 10pt;");
        TabColQuantite.getStyleClass().add("Center");

        TabColPrixHT.setCellValueFactory(new PropertyValueFactory<ListeProduit, String>("PrixHT"));
        TabColPrixHT.setStyle( "-fx-alignment: CENTER;");
        TabColPrixHT.getStyleClass().add("Center");

        TabColRemise.setCellValueFactory(new PropertyValueFactory<ListeProduit, String>("Remise"));
        TabColRemise.setStyle( "-fx-alignment: CENTER;");
        TabColRemise.getStyleClass().add("Center");

        TabColTotalHT.setCellValueFactory(new PropertyValueFactory<ListeProduit, String>("TotalHT"));
        TabColTotalHT.setStyle( "-fx-alignment: CENTER;");
        TabColTotalHT.getStyleClass().add("Center");

        TabColTVA.setCellValueFactory(new PropertyValueFactory<ListeProduit, String>("TVA"));
        TabColTVA.setStyle( "-fx-alignment: CENTER;");
        TabColTVA.getStyleClass().add("Center");

        TabColTotalTTC.setCellValueFactory(new PropertyValueFactory<ListeProduit, String>("TotalTTC"));
        TabColTotalTTC.setStyle( "-fx-alignment: CENTER; -fx-font-weight:bold; -fx-font-size: 10pt;");
        TabColTotalTTC.getStyleClass().add("Center");

        TabColReference.setCellFactory(TextFieldTableCell.<ListeProduit>forTableColumn());
        TabColQuantite.setCellFactory(TextFieldTableCell.<ListeProduit>forTableColumn());
        TabColRemise.setCellFactory(TextFieldTableCell.<ListeProduit>forTableColumn());
        
        this.ReferenceMouseClick();
        this.QantiteMouseClick();
        this.RemiseMouseClick();
        
        TabColAddAction.setSortable(true);
        TabColAddAction.setStyle( "-fx-alignment: CENTER; -fx-font-weight:bold; -fx-font-size: 10pt;");
        TabColAddAction.getStyleClass().add("Center");
        TabColAddAction.setCellValueFactory(new Callback<TableColumn.CellDataFeatures<ListeProduit, Boolean>, 
            ObservableValue<Boolean>>() {
            @Override
            public ObservableValue<Boolean> call(TableColumn.CellDataFeatures<ListeProduit, Boolean> p) {
                return new SimpleBooleanProperty(p.getValue() != null);
            }
        });
        
        // create a cell value factory with an add button for each row in the table.
        TabColAddAction.setCellFactory(new Callback<TableColumn<ListeProduit, Boolean>, TableCell<ListeProduit, Boolean>>() {
              @Override 
              public TableCell<ListeProduit, Boolean> call(TableColumn<ListeProduit, Boolean> personBooleanTableColumn) {
                return new VenteSansFactureCltController.ButtonCell();
              }
        });
        
        TableViewListeProduit.setItems(data);
        CalculeListeProduit();

        //Ajouter une ligne vide clors ce que en click sur la tableview
        TableViewListeProduit.setOnMouseClicked(new EventHandler<javafx.scene.input.MouseEvent>(){
            public void handle(MouseEvent event){
                int nbrligne = TableViewListeProduit.getItems().size() ;
                if(nbrligne == 0){
                    data.add(new ListeProduit("","","","","","","",""));
                    TableViewListeProduit.setItems(data);
                }
                else{
                    ListeProduit Liste =  TableViewListeProduit.getItems().get(nbrligne - 1);
                    if(!Liste.getTotalTTC().isEmpty()){
                       data.add(new ListeProduit("","","","","","","",""));
                       TableViewListeProduit.setItems(data); 
                       TableViewListeProduit.getSelectionModel().select(nbrligne);
                    }
                }    
            }
        });
        
        
        RadioButtonEspece.setOnMouseClicked(new EventHandler<MouseEvent>() {
            public void handle(MouseEvent me) {
                GridPaneCheque.setVisible(false);
                GridPaneCarteBancaire.setVisible(false);
                Vente.setPaiement("0");
            }
        });
        RadioButtonCheque.setOnMouseClicked(new EventHandler<MouseEvent>() {
            public void handle(MouseEvent me) {
                GridPaneCheque.setVisible(true);
                GridPaneCarteBancaire.setVisible(false);
                Vente.setPaiement("1");
            }
        });
        RadioButtonCarteBancaire.setOnMouseClicked(new EventHandler<MouseEvent>() {
            public void handle(MouseEvent me) {
                GridPaneCheque.setVisible(false);
                GridPaneCarteBancaire.setVisible(true);
                Vente.setPaiement("2");
            }
        });
        
        
        /**************************Pour TableView Supprimer Vente Sans Facture****************************************/
        TabColCode.setCellValueFactory(new PropertyValueFactory<ListeVenteSansFacture, String>("Code"));
        TabColCode.setStyle( "-fx-alignment: CENTER; -fx-font-weight:bold; -fx-font-size: 10pt;");
        TabColCode.getStyleClass().add("Center");
        
        TabColDate.setCellValueFactory(new PropertyValueFactory<ListeVenteSansFacture, String>("Date"));
        TabColDate.setStyle( "-fx-alignment: CENTER; -fx-font-weight:bold; -fx-font-size: 10pt;");
        TabColDate.getStyleClass().add("Center");
        
        TabColNbrProd.setCellValueFactory(new PropertyValueFactory<ListeVenteSansFacture, String>("NbrProd"));
        TabColNbrProd.setStyle( "-fx-alignment: CENTER; -fx-font-weight:bold; -fx-font-size: 10pt;");
        TabColNbrProd.getStyleClass().add("Center");
        
        TabColPaiement.setCellValueFactory(new PropertyValueFactory<ListeVenteSansFacture, String>("Paiement"));
        TabColPaiement.setStyle( "-fx-alignment: CENTER; -fx-font-weight:bold; -fx-font-size: 10pt;");
        TabColPaiement.getStyleClass().add("Center");
        TabColPaiement.setCellFactory(new Callback<TableColumn<ListeVenteSansFacture,String>,TableCell<ListeVenteSansFacture,String>>(){        
            @Override
            public TableCell<ListeVenteSansFacture, String> call(TableColumn<ListeVenteSansFacture, String> param) {                
                TableCell<ListeVenteSansFacture, String> cell = new TableCell<ListeVenteSansFacture, String>(){
                    @Override
                    public void updateItem(String item, boolean empty) {
                         //0 :espace  |   1:Chèque   |   2 :carte bancaire
                        if(item!= null && item.equals("0")){
                            Text text = new Text("Espace");
                            text.setFont(Font.font("Arial", FontWeight.NORMAL, 14));
                            setGraphic(text);
                        }else if(item!= null && item.equals("1")){
                            Text text = new Text("Chèque");
                            text.setFont(Font.font("Arial", FontWeight.NORMAL, 14));
                            setGraphic(text);
                        }else if(item!= null && item.equals("2")){
                            Text text = new Text("Carte Bancaire");
                            text.setFont(Font.font("Arial", FontWeight.NORMAL, 14));
                            setGraphic(text);
                        }else if(item!= null && item.equals("3")){
                            Text text = new Text("Traite");
                            text.setFont(Font.font("Arial", FontWeight.NORMAL, 14));
                            setGraphic(text);
                        }else{
                            setGraphic(null);
                        }
                    }
                };                           
                return cell;
            }
        });
        
        TabColNomPrenomClient.setCellValueFactory(new PropertyValueFactory<ListeVenteSansFacture, String>("NomPrenomClient"));
        TabColNomPrenomClient.setStyle( "-fx-alignment: CENTER; -fx-font-weight:bold; -fx-font-size: 10pt;");
        TabColNomPrenomClient.getStyleClass().add("Center");
        
        TabColMontant.setCellValueFactory(new PropertyValueFactory<ListeVenteSansFacture, String>("Montant"));
        TabColMontant.setStyle( "-fx-alignment: CENTER; -fx-font-weight:bold; -fx-font-size: 10pt;");
        TabColMontant.getStyleClass().add("Center");
        
        
        TabColOperationAction.setSortable(true);
        TabColOperationAction.setStyle( "-fx-alignment: CENTER; -fx-font-weight:bold; -fx-font-size: 10pt;");
        TabColOperationAction.getStyleClass().add("Center");
        TabColOperationAction.setCellValueFactory(new Callback<TableColumn.CellDataFeatures<ListeVenteSansFacture, Boolean>, 
            ObservableValue<Boolean>>() {
            @Override
            public ObservableValue<Boolean> call(TableColumn.CellDataFeatures<ListeVenteSansFacture, Boolean> p) {
                return new SimpleBooleanProperty(p.getValue() != null);
            }
        });
        
        // create a cell value factory with an add button for each row in the table.
        TabColOperationAction.setCellFactory(new Callback<TableColumn<ListeVenteSansFacture, Boolean>, TableCell<ListeVenteSansFacture, Boolean>>() {
              @Override 
              public TableCell<ListeVenteSansFacture, Boolean> call(TableColumn<ListeVenteSansFacture, Boolean> personBooleanTableColumn) {
                return new VenteSansFactureCltController.ButtonCellOperation();
              }
              
        });
        
        PaneVenteSansFacture.setOnKeyPressed(new EventHandler<KeyEvent>() {
            @Override
            public void handle(KeyEvent ke) {
                if (ke.getCode().equals(KeyCode.ENTER)) {
                    SearchVenteSansFacture();
                }
            }
        });
        
        GestionSearchVenteSansFacture();
    }
    
    
    
    @FXML
    private void AddLigneButtonAction(ActionEvent event) throws IOException {
        int nbrligne = TableViewListeProduit.getItems().size() ;
        if(nbrligne == 0){
            data.add(new ListeProduit("","","","","","","",""));
            TableViewListeProduit.setItems(data);
        }
        else{
            ListeProduit Liste =  TableViewListeProduit.getItems().get(nbrligne - 1);
            if(!Liste.getTotalTTC().isEmpty()){
               data.add(new ListeProduit("","","","","","","",""));
               TableViewListeProduit.setItems(data); 
               TableViewListeProduit.getSelectionModel().select(nbrligne);
            }
        }
    }
    
    @FXML
    private void RechercheProduitButtonAction(ActionEvent event) throws IOException {
        
       final RechercherProduitController rechercheproduit = new RechercherProduitController(false);
       
       rechercheproduit.ArrayObjectDataSave = this.getDefaultSaveDataImport();
       
       rechercheproduit.Show();
       
       rechercheproduit.TabColAction.setCellFactory(new Callback<TableColumn<Produit, String>, TableCell<Produit, String>>() {
	@Override
	public TableCell<Produit, String> call(TableColumn<Produit, String> paramP) {
            return new TableCell<Produit, String>() {
            final Button cellButton = new Button("");
            {
                cellButton.getStyleClass().add("btn-icon-primary");
                Image coffeeImage = new Image(getClass().getResourceAsStream("/Public/icon/iconaffecter.png"));
                ImageView buttonGraphic = new ImageView();
                buttonGraphic.setImage(coffeeImage);
                cellButton.setGraphic(buttonGraphic);

                cellButton.setOnAction(new EventHandler<ActionEvent>() {
                @Override
                public void handle(ActionEvent arg0) {
                    try {
                        // get Selected ItemButtonCell
                        rechercheproduit.ArrayObjectDataSave[6] = ((Produit)getTableRow().getItem());
                        
                        FXMLLoader fxmlLoader = new FXMLLoader(getClass().getResource("/Views/VenteRapideClt/VenteSansFactureClt.fxml"));
                        Parent ParentBonReceptionAjouterFXML = (Parent) fxmlLoader.load();
                        
                        VenteSansFactureCltController VenteSansFactureClt = fxmlLoader.getController();
                        
                        VenteSansFactureClt.SetDefaultSaveDataImport(rechercheproduit.ArrayObjectDataSave);
                        
                        
                        MyWindow mywindows = new MyWindow();
                        mywindows.Refresh(ParentBonReceptionAjouterFXML, 2);
                        
                    
                    } catch (Exception ex) {
                        System.out.println("VenteSansFactureClt.RechercheProduitButtonAction"+ex.getMessage());
                    }
                    
                    }
                });
            }
            @Override
            protected void updateItem(String paramT, boolean isEmpty) {
                super.updateItem(paramT, isEmpty);
                if (!isEmpty) {
                    setGraphic(cellButton);
		} else {
			setGraphic(null);
                    }
		}
            };
	}
	});
    }

    @FXML
    private void SaveVenteButtonAction(ActionEvent event) throws IOException {
        
        if(data.size() == 0){
            ShowDialog SD = new ShowDialog();
            SD.setTitre("Liste produits");
            SD.setDetail("Vous devez ajouter au moins un produit");
            SD.ShowAletDialog();
        }else{
            if(SetVenteSansFacture()){
                Vente = new VenteSansFactureDB().SetVenteSansFacture(Vente);
            }
        }
        
        
        if(Vente.getIdVenteSansFacture() != null){
            final DialogSuccessController DialogSuccess = new DialogSuccessController();
            DialogSuccess.Valider.setOnAction(new EventHandler<ActionEvent>() {
                    @Override
                    public void handle(ActionEvent event) {
                        try {
                            DialogSuccess.PaneDialog.setVisible(false);
                            FXMLLoader fxmlLoader = new FXMLLoader(getClass().getResource("/Views/VenteRapideClt/VenteSansFactureClt.fxml"));
                            Parent NodeVenteSansFactureClt = (Parent)fxmlLoader.load();
                            PaneVenteSansFacture.getChildren().clear();
                            PaneVenteSansFacture.getChildren().add(NodeVenteSansFactureClt);
                        } catch (IOException ex) {
                            logger.error("VenteSansFactureCltController  : SaveVenteButtonAction :" + ex.getMessage());
                        }
                    }
                });
            DialogSuccess.Show();
        }     
    }
    
    
    private void ReferenceMouseClick(){
        TabColReference.setOnEditCommit(new EventHandler<TableColumn.CellEditEvent<ListeProduit, String>>() {
        @Override
        public void handle(TableColumn.CellEditEvent<ListeProduit, String> t) {
            produit = produitDB.getProduit(t.getNewValue());
            if(produit.getReference() != null){
                ListeProduit Liste = new ListeProduit(produit.getReference(),produit.getDesignation(),"1",produit.getPrixventeht(),"0","",produit.getTvavente(),"0");
                AffectationTableView(Liste,t.getTablePosition().getRow()) ;
            }
            else{
                AffectationTableView(new ListeProduit("","","","","","","",""),t.getTablePosition().getRow()) ;
            }
             
        }
     });
    }
    
    private void QantiteMouseClick(){
        TabColQuantite.setOnEditCommit(new EventHandler<TableColumn.CellEditEvent<ListeProduit, String>>() {
        @Override
        public void handle(TableColumn.CellEditEvent<ListeProduit, String> t) {
            String newquantite = t.getNewValue() ;
            try{
                newquantite = newquantite.replace(',','.');
                if(Float.parseFloat(newquantite)<1){
                    newquantite = "1";
                }
            }
            catch(NumberFormatException nfe){
                newquantite = "1";
            }
            
            ListeProduit Liste = t.getRowValue() ;
             
            if(Liste.getReference().isEmpty()){ //le cas en ajoute un quantité dans un ligne vide
                TableViewListeProduit.getColumns().get(t.getTablePosition().getRow()).setVisible(false);
                TableViewListeProduit.getColumns().get(t.getTablePosition().getRow()).setVisible(true);
            }
            else{
                Liste.setQuantite(newquantite);
                ListeProduit NewList = new ListeProduit(Liste.getReference(),Liste.getDesignation(), newquantite,Liste.getPrixHT(), Liste.getRemise(),"",Liste.getTVA(),"");
                //NewList = CalculeProduit(NewList);
                AffectationTableView(NewList,t.getTablePosition().getRow()) ;
           
            }
        }
     });
    }
    
    private void AffectationTableView(ListeProduit ListeProd, int EmplacementLigne){
        boolean result = false ;    
        int indise=0;
        int Position = 0;

        if(data.size()>0){
            do{ //Vérifier si le produit exsiste deja 
                if(data.get(indise).getReference().equals(ListeProd.getReference())){
                    result = true ;
                    Position = indise ;
                    //System.out.println("existe Position:"+indise);
                }
                indise++;
            }while(data.size()>indise && !result);

            if(result){ //si la ligne exsite déja
                if(EmplacementLigne!= -1){
                    if(Position == EmplacementLigne){
                        data.set(Position, ListeProd);
                    }
                    else{
                        data.set(EmplacementLigne, new ListeProduit("","","","","","","",""));
                    }
                }
            }
            else{
                if(EmplacementLigne!= -1){
                    data.set(EmplacementLigne, ListeProd);
                }
                else{
                    data.add(ListeProd);
                }
            }
        }
        else{
            data.add(ListeProd);
        }

        CalculeListeProduit();
        TableViewListeProduit.setItems(data);
        TableViewListeProduit.refresh();
    }
    
    

    
    public void SetProduit(Produit produit){
        
        //Supprimer les igne vide
        if((data.size()>0) && (data.get(data.size()-1).getReference().isEmpty())){
            data.remove(data.size()-1);
        }
        
        if(produit != null){
            ListeProduit ListeProd = new ListeProduit(produit.getReference(),produit.getDesignation(),"1",produit.getPrixachatht(),"0",produit.getPrixachatttc(),produit.getTvaachat(),"0");
            AffectationTableView(ListeProd,-1);
        }
    
    }
    
    private void RemiseMouseClick(){
        TabColRemise.setOnEditCommit(new EventHandler<TableColumn.CellEditEvent<ListeProduit, String>>() {
        @Override
        public void handle(TableColumn.CellEditEvent<ListeProduit, String> t) {
            String newRemise = t.getNewValue() ;
            try{
                newRemise = newRemise.replace(',','.');
                if(Float.parseFloat(newRemise)<0){
                    newRemise = "0";
                }
            }
            catch(NumberFormatException nfe){
                newRemise = "0";
            }
            
            ListeProduit Liste = t.getRowValue() ;
            
            if(Liste.getReference().isEmpty()){ //le cas en ajoute un remise dans un ligne vide
                TableViewListeProduit.getColumns().get(t.getTablePosition().getRow()).setVisible(false);
                TableViewListeProduit.getColumns().get(t.getTablePosition().getRow()).setVisible(true);
            }
            else{
                Liste.setRemise(newRemise);
                ListeProduit NewList = new ListeProduit(Liste.getReference(),Liste.getDesignation(), Liste.getQuantite(),Liste.getPrixHT(), newRemise, "", Liste.getTVA(), "");
                AffectationTableView(NewList, t.getTablePosition().getRow());
            }
            
        }
     });
    }
    
    private void CalculeListeProduit(){ //calculer et afficher la détail des produits
        
        float  Remises = 0;
        float  totalTVA = 0;
        float  total_H_T_Net= 0;
        
        TextMontant.setText("");
        
        //calcule
        for(ListeProduit liste : data){
            float totaht = Adaptateur.StringToFloat(liste.getTotalHT()) ;
            float prix_U_H_T = Adaptateur.StringToFloat(liste.getPrixHT()) ;
            float remises = Adaptateur.StringToFloat(liste.getRemise().replace("%", "")) ;
            float tva = Adaptateur.StringToFloat(liste.getTVA().replace("%", ""));
            float qte = Adaptateur.StringToFloat(liste.getQuantite());
            
            totalTVA = totalTVA + ((totaht *  tva) /100) ;
            
            Remises =  Remises + (prix_U_H_T * remises)/100 ;
            
            total_H_T_Net = total_H_T_Net + totaht ;
            
        }

        if(total_H_T_Net>0){
            float timbre = Adaptateur.StringToFloat(ParametreSystem.Timbre);
            netaPayer = total_H_T_Net + totalTVA + timbre ;
            Vente.setFMontant(netaPayer);
            TextMontant.setText(Adaptateur.FloatToStringEspaceCurrency(netaPayer));
        }
    }
    
    //Define the button cell
    private class ButtonCell extends TableCell<ListeProduit, Boolean> {
        
        final Button cellButton = new Button();
        
        ButtonCell(){
            cellButton.getStyleClass().add("btn-danger");
            Image coffeeImage = new Image(getClass().getResourceAsStream("/Public/icon/icondelete.png"));
            ImageView buttonGraphic = new ImageView();
            buttonGraphic.setImage(coffeeImage);
            cellButton.setGraphic(buttonGraphic);

            //Action when the button is pressed
            cellButton.setOnAction(new EventHandler<ActionEvent>(){
                @Override
                public void handle(ActionEvent t) {
                    int selectdIndex = getTableRow().getIndex();
                    data.remove(selectdIndex);
                    CalculeListeProduit();
                    TableViewListeProduit.setStyle(".table-row-cell:selected{ -fx-background-color:transparent ;}");
                    
                }
            });
        }
        //Display button if the row is not empty
        @Override
        protected void updateItem(Boolean t, boolean empty) {
            if(!empty){
                setGraphic(cellButton);
            } else {
                setGraphic(null);
            }
        }
    }
    
    
    public boolean SetVenteSansFacture()
    {
        this.Vente.setNomPrenomClient(TextFieldClient.getText());
        this.Vente.setListProduit(data);
        this.Vente.setFMontant(netaPayer);
        String Montant = this.Vente.getMontant().replace(",",".");
        if(this.Vente.getPaiement().equals("0"))
        {
            return true;
        }
        else if(this.Vente.getPaiement().equals("1"))
        {
            ChequeClt Cheque = new ChequeClt();
            Cheque.setNumeroChequeClt(TextFieldNumeroCheque.getText());
            Cheque.setBanqueChequeClt(TextFieldBanqueCheque.getText());
            Cheque.setNomCompletChequeClt(TextFieldNomCompletCheque.getText());
            if(DatePickerDateCheque.getValue() != null){
               Cheque.setDatePaiement(DatePickerDateCheque.getValue().toString());
            }
            Cheque.setLocalNom(ParametreSystem.NomLocalPC);
            Cheque.setMontantChequeClt(Montant);
            this.Vente.setCheque(Cheque);
                
            if( clt.ContrNull(TextFieldBanqueCheque, TextControlBanqueCheque) && 
                clt.ContrNull(TextFieldNomCompletCheque, TextControlNomCompletCheque) && 
                clt.ContrNumeriqueNotnull(TextFieldNumeroCheque, TextControlNumeroCheque) &&
                clt.ContrNullDatePicker(DatePickerDateCheque, TextControlDateCheque))
            {
                return true;
            }
            
        }else if(this.Vente.getPaiement().equals("2"))
        {
            CarteBancaireClt CarteBancaire = new CarteBancaireClt();
            CarteBancaire.setNumeroCarte(TextFieldNumeroCateCarte.getText());
            CarteBancaire.setNomBanque(TextFieldBanqueCarte.getText());
            CarteBancaire.setNumeroTransation(TextFieldTransationCarte.getText());
            CarteBancaire.setIdProfile(User.idprofile);
            CarteBancaire.setLocalNom(ParametreSystem.NomLocalPC);
            CarteBancaire.setMontant(Montant);
            this.Vente.setCarteBancaire(CarteBancaire);
            if( clt.ContrNull(TextFieldTransationCarte, TextControlTransationCarte) &&
                clt.ContrNumerique(TextFieldNumeroCateCarte, TextControlNumeroCate) )
            {
                return true;
            }
        }
        
        return false;
    }
    
    public void SetDefaultSaveDataImport(Object[] ArrayObject){
        
        if(ArrayObject[0] != null){
            this.data = (ObservableList<ListeProduit>) ArrayObject[0];
            this.CalculeListeProduit();
            this.TableViewListeProduit.setItems(data);
        }
        
        
        if(ArrayObject[1] != null){
            this.Vente = (VenteSansFacture) ArrayObject[1];
            if(this.Vente.getPaiement().equals("1"))
            {
                if(this.Vente.getCheque() != null){
                    TextFieldNumeroCheque.setText(this.Vente.getCheque().getNumeroChequeClt());
                    TextFieldBanqueCheque.setText(this.Vente.getCheque().getBanqueChequeClt());
                    TextFieldNomCompletCheque.setText(this.Vente.getCheque().getNomCompletChequeClt());
                    if(this.Vente.getCheque().getDatePaiement() != null){
                        DatePickerDateCheque.setValue(Adaptateur.StringToLocalDate(this.Vente.getCheque().getDatePaiement()));
                    }
                }
                
                GridPaneCheque.setVisible(true);
                RadioButtonCheque.setSelected(true);
            }else if(this.Vente.getPaiement().equals("2"))
            {
                if(this.Vente.getCarteBancaire() != null){
                    TextFieldTransationCarte.setText(this.Vente.getCarteBancaire().getNumeroTransation());
                    TextFieldBanqueCarte.setText(this.Vente.getCarteBancaire().getNomBanque());
                    TextFieldNumeroCateCarte.setText(this.Vente.getCarteBancaire().getNumeroCarte());
                }
                GridPaneCarteBancaire.setVisible(true);
                RadioButtonCarteBancaire.setSelected(true);
            }else{
                RadioButtonEspece.setSelected(true);
            }
        }
        
        if(ArrayObject[6] != null){
            this.SetProduit( (Produit) ArrayObject[6] );
        }
    
    }
    
    public Object[]  getDefaultSaveDataImport(){
        Object[] ArrayObject = new Object[10];
        ArrayObject[0] = this.data;
        
        SetVenteSansFacture();
        
        ArrayObject[1] = this.Vente;
        return ArrayObject;
    }
    
    
    
    
    /*********************************************************************************/
    //Define the button cell
    private class ButtonCellOperation extends TableCell<ListeVenteSansFacture, Boolean> {
        
        final Button cellButtonSupprimer = new Button();
        
        final Button cellButtonDetail = new Button();
        
        ButtonCellOperation(){
            cellButtonSupprimer.getStyleClass().add("btn-danger");
            Image coffeeImageSupprimer = new Image(getClass().getResourceAsStream("/Public/icon/icondelete.png"));
            ImageView buttonGraphicSupprimer = new ImageView();
            buttonGraphicSupprimer.setImage(coffeeImageSupprimer);
            cellButtonSupprimer.setGraphic(buttonGraphicSupprimer);

            //Action when the button is pressed
            cellButtonSupprimer.setOnAction(new EventHandler<ActionEvent>(){
                @Override
                public void handle(ActionEvent t) {
                   
                    final int selectdIndex = getTableRow().getIndex();
                        
                    ListeVenteSansFacture ListVSF = (ListeVenteSansFacture)getTableRow().getItem();
                    final String IdVenteSansFacture = ListVSF.getCode();
                    
                    final VenteSansFacture VSF = new VenteSansFactureDB().getVenteSansFacture(IdVenteSansFacture);
                    
                    
                    final Dialog MyDialog= new Dialog();
                    Node node = MyDialog.DialogAlert();
                    MyDialog.Titre.setText("Suppression");
                    MyDialog.Message.setText("êtes-vous sûr de vouloir supprimer cette vente");
                    MyDialog.DefaultAnnuler();
                    MyDialog.Titre.setText("Supprimer");
                    MyDialog.Valider.setOnAction(new EventHandler<ActionEvent>() {
                        @Override
                        public void handle(ActionEvent event) {
                            boolean resultDelete = new VenteSansFactureDB().DeleteVenteSansFacture(VSF);
                            if(resultDelete){
                                ObservableList<ListeVenteSansFacture> ListTempVSF = TableViewVenteSansFacture.getItems();
                                ListTempVSF.remove(selectdIndex);
                                TableViewVenteSansFacture.setItems(ListTempVSF);
                                TableViewVenteSansFacture.refresh();
                            }
                            MyDialog.PaneDialog.setVisible(false);
                        }
                    });
                    MyDialog.Show(node);
                 }
            });
            
            
            
            cellButtonDetail.getStyleClass().add("btn-primary");
            Image coffeeImageDetail = new Image(getClass().getResourceAsStream("/Public/icon/detailbutton.png"));
            ImageView buttonGraphicDetail = new ImageView();
            buttonGraphicDetail.setImage(coffeeImageDetail);
            cellButtonDetail.setGraphic(buttonGraphicDetail);

            //Action when the button is pressed
            cellButtonDetail.setOnAction(new EventHandler<ActionEvent>(){
                @Override
                public void handle(ActionEvent t) {
                    ListeVenteSansFacture VenteSansFacture = (ListeVenteSansFacture)getTableRow().getItem();
                    String IdVenteSansFacture = VenteSansFacture.getCode();
                    
                    VenteSansFactureCltDetailController VenteSansFactureCltDetail = new VenteSansFactureCltDetailController();
                    VenteSansFactureCltDetail.Show();
                    VenteSansFactureCltDetail.SetIdVenteSansFacture(IdVenteSansFacture);
                }
            });
        }
        //Display button if the row is not empty
        @Override
        protected void updateItem(Boolean t, boolean empty) {
            if(!empty){
                ListeVenteSansFacture ListVSF = (ListeVenteSansFacture)getTableRow().getItem();
                if(ListVSF != null){
                    if(ListVSF.getOperation() != null){
                        setGraphic(cellButtonDetail);
                    }else{
                        HBox hbox = new HBox(5); // spacing = 8
                        hbox.getChildren().addAll(cellButtonSupprimer, cellButtonDetail);
                        setGraphic(hbox);
                    }
                }
            } else {
                setGraphic(null);
            }
        }
    }
    
    
    
    
/******************************************************************************                                                                             *
 *                                                                              *
 *        Methode last Next TableView                                           *
 * *                                                                            *
 ******************************************************************************/  
    
    private void SearchVenteSansFacture()
    {
        ProgressBarVenteSansFacture.setVisible(true);
        
        ThreadSearchVenteSansFacture = new Service<Void>(){
            @Override
            protected Task<Void> createTask(){
                return new Task<Void>(){
                    @Override
                    protected Void call() throws Exception{
                        
                        position = 0;
                        
                        actuellepage = 1;
                        
                        String DateVente = "";
                        if(DatePickerDateVente.getValue() != null){
                            DateVente = DatePickerDateVente.getValue().toString();
                        }   
                        
                        ObservableList<ListeVenteSansFacture> ListVSF = new VenteSansFactureDB().SearchVenteSansFactureGestion(
                                position, 
                                nbrligne, 
                                TextFieldCode.getText(), 
                                TextFieldMontant.getText(), 
                                DateVente
                        );
                        
                        TableViewVenteSansFacture.setItems(ListVSF);
                        
                        totalcount = new VenteSansFactureDB().nbrVenteSansFactureGestion(TextFieldCode.getText(), TextFieldMontant.getText(), DateVente);
                        
                        if(totalcount > 0){
                            ActuellePage.setText("1");
                        }else{
                            ActuellePage.setText("0");
                        }
                        
                        if(totalcount % nbrligne==0){ 
                            nbrpage = totalcount / nbrligne ;
                        }
                        else{ 
                            nbrpage = (totalcount / nbrligne) + 1 ; 
                        }
                        NbrPage.setText(Integer.toString(nbrpage));
                        
                        return null;
                    }
                };
            }
	};
        
        ThreadSearchVenteSansFacture.setOnSucceeded(new EventHandler<WorkerStateEvent>(){
            @Override
            public void handle(WorkerStateEvent event){
                ProgressBarVenteSansFacture.setVisible(false);
                LabelCount.setText(totalcount.toString());
                
            }
        });
        ThreadSearchVenteSansFacture.start();
    }
    
    
    private void NextLastSearchVenteSansFacture(Integer ParmPosition, Integer ParamNbrligne)
    {
        ProgressBarVenteSansFacture.setVisible(true);
        
        ThreadSearchVenteSansFacture = new Service<Void>(){
            @Override
            protected Task<Void> createTask(){
                return new Task<Void>(){
                    @Override
                    protected Void call() throws Exception{
                        
                        String DateVente = "";
                        if(DatePickerDateVente.getValue() != null){
                            DateVente = DatePickerDateVente.getValue().toString();
                        }
                        
                        ObservableList<ListeVenteSansFacture> ListVenteSansFacture = new VenteSansFactureDB().SearchVenteSansFactureGestion(ParmPosition, ParamNbrligne, TextFieldCode.getText(), TextFieldMontant.getText(), DateVente);
                        
                        TableViewVenteSansFacture.setItems(ListVenteSansFacture);
                        
                        return null;
                    }
                };
            }
	};
        
        ThreadSearchVenteSansFacture.setOnSucceeded(new EventHandler<WorkerStateEvent>(){
            @Override
            public void handle(WorkerStateEvent event){
                ProgressBarVenteSansFacture.setVisible(false);
            }
        });
        ThreadSearchVenteSansFacture.start();
    }
  
    private void GestionSearchVenteSansFacture()
    {
        NbrLigne.getSelectionModel().selectedIndexProperty().addListener(new ChangeListener<Number>() {

            public void changed(ObservableValue ov,  Number value, Number new_value) {
                nbrligne= Integer.parseInt((String) cursors.get(new_value.intValue()));
                if(totalcount % nbrligne==0){ nbrpage = totalcount / nbrligne ;}
                else{ nbrpage = (totalcount / nbrligne) + 1 ; }
                NbrPage.setText(Integer.toString(nbrpage));
                position=0;
                ActuellePage.setText("1");
                actuellepage=1;
                NextLastSearchVenteSansFacture(position, nbrligne);
            }
        });

        if(totalcount % nbrligne==0){ nbrpage = totalcount / nbrligne ;}
        else{ nbrpage = (totalcount / nbrligne) + 1 ; }
        NbrPage.setText(Integer.toString(nbrpage));


        //next page
        nextgroupe.setOnMousePressed(new EventHandler<MouseEvent>(){
            @Override
            public void handle(MouseEvent event) {
                if(actuellepage<nbrpage)
                {
                    position=position+nbrligne;
                    NextLastSearchVenteSansFacture(position, nbrligne);
                    actuellepage=actuellepage+1 ;
                    ActuellePage.setText(Integer.toString(actuellepage));

                }
            }
        }); 

        //last page
        lastgroupe.setOnMousePressed(new EventHandler<MouseEvent>(){
            @Override
            public void handle(MouseEvent event) {
                if(actuellepage>1)
                {
                    position=position-nbrligne;
                    NextLastSearchVenteSansFacture(position, nbrligne);
                    actuellepage=actuellepage-1 ;
                    ActuellePage.setText(Integer.toString(actuellepage));
                }
            }
        }); 

        //next page avec pas de 5
        avancergroupe.setOnMousePressed(new EventHandler<MouseEvent>(){
            @Override
            public void handle(MouseEvent event) {
                if(actuellepage+3<nbrpage)
                {
                    position=(position+4)+nbrligne;
                    NextLastSearchVenteSansFacture(position, nbrligne);
                    actuellepage=actuellepage+3 ;
                    ActuellePage.setText(Integer.toString(actuellepage));

                }
            }
        });

        //last page avec un pas de -5
        retourgroupe.setOnMousePressed(new EventHandler<MouseEvent>(){
            @Override
            public void handle(MouseEvent event) {
                if(actuellepage-3>1){
                    position=(position-4)-nbrligne;
                    NextLastSearchVenteSansFacture(position, nbrligne);
                    actuellepage=actuellepage-3 ;
                    ActuellePage.setText(Integer.toString(actuellepage));
                }
            }
        });

    }
    
    
    
    
}
