/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package Controllers.VenteRapideClt;

import Controllers.Client.ListeClient;
import Controllers.Client.ListeClientEntreprise;
import Controllers.Client.RechercherClientEntrepriseController;
import Controllers.Client.RechercherClientPersonneController;
import Controllers.CommandeClt.CommandeCltPasserController;
import Controllers.DevisClt.DevisImporterController;
import Controllers.Dialog.MessageControle;
import Models.Produit.ListeProduit;
import Controllers.Produit.RechercherProduitController;
import Controllers.Traitement.Adaptateur;
import Controllers.Traitement.MyWindow;
import Controllers.Traitement.ParametreSystem;
import Controllers.Traitement.contro;
import Models.Client.Client;
import Models.Client.ClientEntreprise;
import Models.Client.ClientPassager;
import Models.CommandeClt.CommandeClt;
import Models.DevisClt.Devis;
import Models.DevisClt.DevisCltListe;
import Models.DevisClt.DevisDB;
import Models.Produit.Produit;
import Models.Produit.ProduitDB;
import java.io.IOException;
import java.net.URL;
import java.util.ResourceBundle;
import java.util.logging.Level;
import java.util.logging.Logger;
import javafx.beans.property.SimpleBooleanProperty;
import javafx.beans.value.ObservableValue;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.fxml.FXML;
import javafx.fxml.FXMLLoader;
import javafx.fxml.Initializable;
import javafx.scene.Parent;
import javafx.scene.control.Button;
import javafx.scene.control.ComboBox;
import javafx.scene.control.DatePicker;
import javafx.scene.control.RadioButton;
import javafx.scene.control.TabPane;
import javafx.scene.control.TableCell;
import javafx.scene.control.TableColumn;
import javafx.scene.control.TableView;
import javafx.scene.control.TextArea;
import javafx.scene.control.TextField;
import javafx.scene.control.ToggleGroup;
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.MouseEvent;
import javafx.scene.layout.AnchorPane;
import javafx.scene.paint.Color;
import javafx.scene.text.Font;
import javafx.scene.text.FontWeight;
import javafx.scene.text.Text;
import javafx.util.Callback;

/**
 * FXML Controller class
 *
 * @author maher
 */
public class Step1CommandeCltController implements Initializable {

    @FXML private AnchorPane PaneStep1CommandeClt;
    @FXML public Text TotalTVA ;
    @FXML public Text Remise ;
    @FXML public Text NetAPayer ;
    @FXML public Text Timbre ;
    @FXML public Text TotalHTNet ;
    
    
    @FXML public Button Enregister ;
    @FXML public Button ClientExisteDejat ;
    @FXML public Button ClientDefault ;
    @FXML public Button RechercheProduit ;
    
    @FXML public TextField Nom ;
    @FXML public TextField Prenom ;
    @FXML public TextArea Adresse ;
    @FXML public TextField TELE1 ;
    @FXML public TextField TELE2 ;
    
    @FXML public Text TextMatricule ;
    @FXML public Text TextPrenom;
    @FXML public Text TextSexe;
    @FXML public Text TextDateNaissance;
    
    @FXML public Text TextCltExistCode;
    @FXML public Text CltExistCode;
    @FXML public Text CltExistNom;
    @FXML public Text CltExistPrenom;
    @FXML public Text CltExistAdresse;
    @FXML public Text CltExistDateNaissance;
    @FXML public Text CltExistTELE1;
    @FXML public Text CltExistTELE2;
    
    @FXML public TabPane TabPaneCommande;
    
    @FXML public DatePicker DateNaisssance ;
    
    @FXML public ComboBox ModeReglement ;
    
    @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 ;
    
    @FXML private ToggleGroup ToggleGroupSexe;
    @FXML private RadioButton SexeHomme;
    @FXML private RadioButton SexeFemme;
    
    public Integer TypeClient = 2; // 0Personne  1Entreprise    2Passeger
    Client client = new Client();
    ClientEntreprise CltEntreprise = new  ClientEntreprise();
    ClientPassager CltPassager = new ClientPassager();
    
    public String Mode;  // Comptant     Facilité
    public String CodeDevis;
    
    public ObservableList<ListeProduit> data=FXCollections.observableArrayList();
    
    CommandeClt commandeclt = new CommandeClt();
    Produit produit=  new Produit();
    ProduitDB produitDB= new ProduitDB();
    
    float  netaPayer = 0;
    float  Remises = 0;
    float  totalTVA = 0;
    float  total_H_T_Net =0;
    
    /**
     * Initializes the controller class.
     */
    @Override
    public void initialize(URL url, ResourceBundle rb) {
        
        TableViewListeProduit.setEditable(true);
        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();
        
        ModeReglement.setValue(Mode);
    
        TabColAddAction.setSortable(true);
        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 Step1CommandeCltController.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);
                    }
                }    
            }
        });
        
        ModeReglement.getSelectionModel().select("Comptant");
    }    
    
    
    @FXML
    private void NextBonLivraisonCltButtonAction(ActionEvent event) throws IOException {
        if(ControleObject()){
            this.SetObject();
            FXMLLoader fxmlLoader = new FXMLLoader(getClass().getResource("/Views/VenteRapideClt/Step2BonLivraisonClt.fxml"));
            Parent NodeStep2BonLivraison = (Parent)fxmlLoader.load();
            
            Step2BonLivraisonCltController Step2BonLivraisonClt = fxmlLoader.getController();
            
            Step2BonLivraisonClt.ConvertCommandeToBonLivraision(commandeclt);
            Step2BonLivraisonClt.SetDefaultTextFieldData();
            
            PaneStep1CommandeClt.getChildren().clear();
            PaneStep1CommandeClt.getChildren().add(NodeStep2BonLivraison);
        }
        
    }
    
    
    @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);
            }
        }
    }
    
    
    
    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.TypeClient = 2;
            ArrayObject[1] = 2;
            this.CltPassager = (ClientPassager) ArrayObject[4];
            if(this.CltPassager.getNom() != null){
                this.SetClientPassager();
            }
        }else{
            this.TypeClient = (Integer) ArrayObject[1];
            if(this.TypeClient == 0){
                this.client = (Client) ArrayObject[2];
                if(this.client.getCodeclient() != null){
                    this.SetClient();
                }
            }else if(this.TypeClient == 1){
                this.CltEntreprise = (ClientEntreprise) ArrayObject[3];
                if(this.CltEntreprise.getCode() != null){
                    this.SetClientEntre();
                }
            }else if( (this.TypeClient == null) || (this.TypeClient == 2) ){
                this.CltPassager = (ClientPassager) ArrayObject[4];
                if(this.CltPassager.getNom() != null){
                    this.SetClientPassager();
                }
            }
        }
        
       
        
        this.CodeDevis = (String) ArrayObject[5];
        
        if(ArrayObject[6] != null){
            this.SetProduit( (Produit) ArrayObject[6] );
            this.TabPaneCommande.getSelectionModel().select(1);  
        }
        
        if(ArrayObject[7] != null){
            this.Mode = (String) ArrayObject[7];
            this.ModeReglement.setValue(this.Mode);
        }
    }
    
    
    public Object[]  getDefaultSaveDataImport(){
        Object[] ArrayObject = new Object[10];
        ArrayObject[0] = this.data;
        ArrayObject[1] = this.TypeClient;
        ArrayObject[2] = this.client ;
        ArrayObject[3] = this.CltEntreprise;
        
        if( (this.TypeClient == null) || (this.TypeClient == 2) ){
            this.TypeClient = 2;
            
            RadioButton SelectedRadioSexe = (RadioButton) ToggleGroupSexe.getSelectedToggle();
            
            this.CltPassager.setNom(this.Nom.getText());
            this.CltPassager.setPrenom(this.Prenom.getText());
            this.CltPassager.setAdresse(this.Adresse.getText());
            this.CltPassager.setSexeString(SelectedRadioSexe.getEllipsisString());
            this.CltPassager.setTelefixString(this.TELE1.getText());
            this.CltPassager.setTelemobileString(this.TELE2.getText());
            this.CltPassager.setNaissance(Adaptateur.DatabaseDateLocalDate(DateNaisssance.getValue()));
            ArrayObject[4] = this.CltPassager; 
        }
        
        ArrayObject[5] = this.CodeDevis;
        ArrayObject[7] = (String) this.ModeReglement.getValue(); 
        return ArrayObject;
    }
    
    
    private void SetClientPassager(){
        Nom.setText(this.CltPassager.getNom());
        Prenom.setText(this.CltPassager.getPrenom());
        Adresse.setText(this.CltPassager.getAdresse());
        DateNaisssance.setValue(Adaptateur.StringToLocalDate(this.CltPassager.getNaissance()));
        TELE1.setText(this.CltPassager.getTelefixString());
        TELE2.setText(this.CltPassager.getTelemobileString());
        if(this.CltPassager.getSexe() == 0){
            SexeFemme.setSelected(true);
        }
        
        ModeReglement.setDisable(true);
        ModeReglement.getSelectionModel().select("Comptant");
    }
    
    
    
    
    @FXML
    private void RechercheProduitButtonAction(ActionEvent event) throws IOException {
        
       final RechercherProduitController rechercheproduit = new RechercherProduitController(true);
       
       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/Step1CommandeClt.fxml"));
                        Parent ParentStep1CommandeClt = (Parent) fxmlLoader.load();
                        
                        Step1CommandeCltController Step1CommandeClt = fxmlLoader.getController();
                        
                        Step1CommandeClt.SetDefaultSaveDataImport(rechercheproduit.ArrayObjectDataSave);
                        
                        MyWindow mywindows = new MyWindow();
                        mywindows.Refresh(ParentStep1CommandeClt, 3);
                    } catch (Exception ex) {
                        System.out.println("Controllers.VenteRapideClt.RechercheProduitButtonAction \n"+ex.getMessage());
                    }
                    
                    }
                });
            }
            @Override
            protected void updateItem(String paramT, boolean isEmpty) {
                super.updateItem(paramT, isEmpty);
                if (!isEmpty) {
                    setGraphic(cellButton);
		} else {
			setGraphic(null);
                    }
		}
            };
	}
	});
    }
    
    
    @FXML
    private void DevisCltImportButtonAction(ActionEvent event) throws IOException {
        DevisImporterController DevisImporter = new DevisImporterController();
        DevisImporter.Show();
        
        DevisImporter.TabColDetail.setCellFactory(new Callback<TableColumn<DevisCltListe,Boolean>,TableCell<DevisCltListe,Boolean>>(){        
            @Override
            public TableCell<DevisCltListe, Boolean> call(TableColumn<DevisCltListe, Boolean> param) {                
                TableCell<DevisCltListe, Boolean> cell = new TableCell<DevisCltListe, Boolean>(){
                    @Override
                    public void updateItem(Boolean item, boolean empty) {
                        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>(){ //Action when the button is pressed
                        @Override
                        public void handle(ActionEvent t) {
                            try {
                                DevisCltListe current = ((DevisCltListe)getTableRow().getItem());
                                Devis devis = new Devis();
                                DevisDB devisDB = new DevisDB();
                                
                                devis = devisDB.getDevis(current.getCodeDevis());
                                
                                FXMLLoader fxmlLoader = new FXMLLoader(getClass().getResource("/Views/VenteRapideClt/Step1CommandeClt.fxml"));
                                Parent ParentCommandeClt = (Parent) fxmlLoader.load();
                                
                                Step1CommandeCltController Step1CommandeClt = fxmlLoader.getController();
                                
                                Step1CommandeClt.data.addAll(devis.getListeproduit());
                                Step1CommandeClt.TypeClient = devis.getTypeClient();
                                Step1CommandeClt.CodeDevis = devis.getCodeDevis();
                                Step1CommandeClt.Mode=devis.getTypeRegementString();
                                Step1CommandeClt.ModeReglement.setValue(devis.getTypeRegementString());
                                
                                if(devis.getTypeClient() == 0 ){
                                    Step1CommandeClt.client.setCodeclientString(devis.getCodeClient());
                                    Step1CommandeClt.client.setNom(devis.getNom());
                                    Step1CommandeClt.client.setPrenom(devis.getPrenom());
                                    Step1CommandeClt.client.setTelefixString(devis.getTele1());
                                    Step1CommandeClt.client.setTelemobileString(devis.getTele2());
                                    Step1CommandeClt.client.setAdresse(devis.getAdresse());
                                    Step1CommandeClt.SetClient();
                                }else if(devis.getTypeClient() == 1){/*
                                    Step1CommandeClt.codecliententre = devis.getCodeClient();
                                    Step1CommandeClt.SetClientEntre(devis.getCodeClient());*/
                                }else if(devis.getTypeClient() == 2){
                                    Step1CommandeClt.Nom.setText(devis.getNom());
                                    Step1CommandeClt.Prenom.setText(devis.getPrenom());
                                    Step1CommandeClt.Adresse.setText(devis.getAdresse());
                                    Step1CommandeClt.TELE1.setText(devis.getTele1());
                                    Step1CommandeClt.TELE2.setText(devis.getTele2());
                                }
                                
                                Step1CommandeClt.TotalTVA.setText(devis.getTotalTVA());
                                Step1CommandeClt.Remise.setText(devis.getRemise());
                                Step1CommandeClt.NetAPayer.setText(devis.getNetAPayer());
                                Step1CommandeClt.Timbre.setText(devis.getTimbre());
                                Step1CommandeClt.TotalHTNet.setText(devis.getTotalHorsTaxNet());
                                
                                
                                //Refrechir  le Panel
                                MyWindow mywindows = new MyWindow();
                                mywindows.Refresh(ParentCommandeClt, 3);
                                
                            } catch (IOException ex) {
                                Logger.getLogger(CommandeCltPasserController.class.getName()).log(Level.SEVERE, null, ex);
                            }

                        }
                        });
                        if(!empty){
                            setGraphic(cellButton);
                        } else {
                            setGraphic(null);
                        } 
                    }
                };                           
                return cell;
            }
        });
    }
    
    
    
    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.getPrixventeht(),"0",produit.getPrixventettc(),produit.getTvavente(),"0");
            AffectationTableView(ListeProd,-1);
        }
    
    }
    
    
    @FXML
    private void ClientRessetDefautButtonAction(ActionEvent event) throws IOException {
        TypeClient = 2 ;
        ClientExisteDejat.setVisible(true);
        Nom.setVisible(true);
        Prenom.setVisible(true);
        Adresse.setVisible(true);
        TELE1.setVisible(true);
        TELE2.setVisible(true);
        DateNaisssance.setVisible(true);
        TextDateNaissance.setVisible(true);
        TextSexe.setVisible(true);
        SexeHomme.setVisible(true);
        SexeFemme.setVisible(true);
        
        TextCltExistCode.setVisible(false);
        ClientDefault.setVisible(false);
        CltExistCode.setVisible(false);
        CltExistNom.setVisible(false);
        CltExistPrenom.setVisible(false);
        CltExistDateNaissance.setVisible(false);
        CltExistAdresse.setVisible(false);
        CltExistTELE1.setVisible(false);
        CltExistTELE2.setVisible(false);
        
        ModeReglement.setDisable(true);
        ModeReglement.getSelectionModel().select("Comptant");
        SexeHomme.setSelected(true);
    }
    
    //Methode qui pérmet de traite les recherche du client Personne
    @FXML
    private void ClientExisteDejatButtonAction(ActionEvent event) throws IOException {
        
       final RechercherClientPersonneController RechercheClient = new RechercherClientPersonneController();
        RechercheClient.ArrayObjectDataSave = this.getDefaultSaveDataImport();
        
        RechercheClient.Action.setCellFactory(new Callback<TableColumn<ListeClient, String>, TableCell<ListeClient, String>>() {
	@Override
	public TableCell<ListeClient, String> call(TableColumn<ListeClient, String> paramP) {
            return new TableCell<ListeClient, 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 {
                        
                        FXMLLoader fxmlLoader = new FXMLLoader(getClass().getResource("/Views/VenteRapideClt/Step1CommandeClt.fxml"));
                        Parent ParentCommandeClt = (Parent) fxmlLoader.load();
                        
                        // get Selected Item
                        ListeClient ClientPerson = ((ListeClient)getTableRow().getItem());
                        
                        Step1CommandeCltController Step1CommandeClt = fxmlLoader.getController();
                        
                        Client CltPerson = new Client();
                        
                        CltPerson.setCodeclient(ClientPerson.getCode());
                        CltPerson.setCinString(ClientPerson.getCin());
                        CltPerson.setAdresse(ClientPerson.getAdresse());
                        CltPerson.setNom(ClientPerson.getNom());
                        CltPerson.setPrenom(ClientPerson.getPrenom());
                        CltPerson.setDateNaissanceString(ClientPerson.getNaissanceString());
                        
                        CltPerson.setNomcomplet(ClientPerson.getNomcomplet());
                        CltPerson.setTelefixString(ClientPerson.getTele());
                        CltPerson.setTelemobileString(ClientPerson.getTele2());
                        CltPerson.setSexe(ClientPerson.getSexe());
                        
                        RechercheClient.ArrayObjectDataSave[1] = 0;
                        RechercheClient.ArrayObjectDataSave[2] = CltPerson;
                        
                        Step1CommandeClt.SetDefaultSaveDataImport(RechercheClient.ArrayObjectDataSave);
                        
                        
                        //Refrechir  le Panel
                        MyWindow mywindows = new MyWindow();
                        mywindows.Refresh(ParentCommandeClt, 3);
                    
                    } catch (IOException ex) {
                        Logger.getLogger(RechercherClientPersonneController.class.getName()).log(Level.SEVERE, null, ex);
                    }

                    }
                });
            }
            @Override
            protected void updateItem(String paramT, boolean isEmpty) {
                super.updateItem(paramT, isEmpty);
                if (!isEmpty) {
                    setGraphic(cellButton);
		} else {
			setGraphic(null);
                    }
		}
            };
	}
	});
       
       //afficher la fenaitre 
        RechercheClient.ShowDialg(); 
        
        final RechercherClientEntrepriseController RechercheClientEntre = new RechercherClientEntrepriseController();
        
        RechercheClient.cltEntreprise.setOnAction(new EventHandler<ActionEvent>(){
            @Override
            public void handle(ActionEvent t) {
                RechercheClient.AnchoreClientPerson.setVisible(false);
                RechercheClientEntre.AnchoreClientEntre.setVisible(true);
                RechercheClientEntre.Show();
            }
        });
        
       //Action when the button is pressed
        
        
        RechercheClientEntre.cltPer.setOnAction(new EventHandler<ActionEvent>(){
            @Override
            public void handle(ActionEvent t) {
                RechercheClientEntre.AnchoreClientEntre.setVisible(false);
                RechercheClient.AnchoreClientPerson.setVisible(true);
                RechercheClient.ShowDialg();
            }
        });
        
        RechercheClientEntre.TableColumnActionEtre.setCellFactory(new Callback<TableColumn<ListeClientEntreprise, String>, TableCell<ListeClientEntreprise, String>>() {
	@Override
	public TableCell<ListeClientEntreprise, String> call(TableColumn<ListeClientEntreprise, String> paramP) {
            return new TableCell<ListeClientEntreprise, 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 Item
                    ListeClientEntreprise currentEntreprise = ((ListeClientEntreprise)getTableRow().getItem());
                    
                    FXMLLoader fxmlLoader = new FXMLLoader(getClass().getResource("/Views/VenteRapideClt/Step1CommandeClt.fxml"));
                    Parent commandeclt = (Parent) fxmlLoader.load();
                    
                    Step1CommandeCltController Step1CommandeClt = fxmlLoader.getController();
                    
                    ClientEntreprise CltEtr = new  ClientEntreprise();
                    
                    //Traitement de Sauvgarde
                    CltEtr.setCodeString(currentEntreprise.getCode());
                    CltEtr.setMatricule(currentEntreprise.getMatricule());
                    CltEtr.setAdresse(currentEntreprise.getAdresse());
                    CltEtr.setTele1String(currentEntreprise.getTelephone());
                    CltEtr.setTele2String(currentEntreprise.getTelephone2());
                    CltEtr.setGerant(currentEntreprise.getGerant());
                    CltEtr.setNom(currentEntreprise.getNomEntreprise());
                    
                    RechercheClient.ArrayObjectDataSave[1] = 1;
                    RechercheClient.ArrayObjectDataSave[3] = CltEtr;
                    Step1CommandeClt.SetDefaultSaveDataImport(RechercheClient.ArrayObjectDataSave);
                    
                    
                    //Refrechir  le Panel
                    MyWindow mywindows = new MyWindow();
                    mywindows.Refresh(commandeclt, 3);
                    
                } catch (IOException ex) {
                    Logger.getLogger(RechercherClientEntrepriseController.class.getName()).log(Level.SEVERE, null, ex);
                }
                
                }
                });
            }

            @Override
            protected void updateItem(String paramT, boolean isEmpty) {
                super.updateItem(paramT, isEmpty);
                if (!isEmpty) {
                    setGraphic(cellButton);
		} else {
			setGraphic(null);
                    }
		}
            };
	}
	});
    }
    
    
    
    
    //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);
            }
        }
    }
    
    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 boolean ControleObject(){
        boolean resulta = false ;
        if(data.size()<1){
            final MessageControle messagecontrol = new MessageControle();
            Text text3 = new Text();
            text3.setText("Vous devez ajouter au moin un produit à la liste des produits");
            text3.setFont(Font.font("Arial", FontWeight.BOLD, 13));
            text3.setFill(Color.web("#363a38"));
            messagecontrol.DetailMSG.getChildren().add(text3);

            messagecontrol.bouttonOK.setOnAction(new EventHandler<ActionEvent>() {
                @Override
                public void handle(ActionEvent event) {
                    messagecontrol.stackpane.setVisible(false);
                }
            });
            messagecontrol.ShowNotification();
        }
        else if(ModeReglement.getValue()==null){
            ModeReglement.setStyle("-fx-border-color:#f20606;");
        }
        else if(TypeClient == 2){       // 0Personne  1Entreprise    2Passeger
            ModeReglement.setStyle("-fx-border-color:transparent;");
            contro clt =new contro();
            if(Nom.getText().isEmpty()){
                Nom.setStyle("-fx-border-color:#f20606;");
            }
            else if(Prenom.getText().isEmpty()){
                Nom.setStyle("-fx-border-color:transparent;");
                Prenom.setStyle("-fx-border-color:#f20606;");
                
            }
            else if(Adresse.getText().isEmpty()){
                Prenom.setStyle("-fx-border-color:transparent;");
                Adresse.setStyle("-fx-border-color:#f20606;");
                
            }
            else if(clt.isNumericNotnull(TELE1.getText())){
                Adresse.setStyle("-fx-border-color:transparent;");
                TELE1.setStyle("-fx-border-color:#f20606;");
            }
            else if(clt.isNumeric(TELE2.getText())){
                TELE1.setStyle("-fx-border-color:transparent;");
                TELE2.setStyle("-fx-border-color:#f20606;");
            }        
            else{
                TELE2.setStyle("-fx-border-color:transparent;");
                ModeReglement.setStyle("-fx-border-color:#b5b5b5;");
                resulta = true ;
            }
        }
        else{
            ModeReglement.setStyle("-fx-border-color:#b5b5b5;");
            resulta = true ;
        }
        
        return resulta ;
    }
        
    private void SetObject()
    {
        commandeclt.setTypeRegementString(ModeReglement.getValue().toString());
        commandeclt.setCodeDevis(CodeDevis);
        commandeclt.setNetAPayer(Adaptateur.ArrondFloatToStringOrigin(netaPayer));
        commandeclt.setTotalTVA(Adaptateur.ArrondFloatToStringOrigin(totalTVA));
        commandeclt.setTotalHorsTaxNet(Adaptateur.ArrondFloatToStringOrigin(total_H_T_Net));
        commandeclt.setRemise(Adaptateur.ArrondFloatToStringOrigin(Remises));
        
        commandeclt.setTypeClient(TypeClient);
        if(TypeClient == 0){
            commandeclt.setCltPersonne(client);
        }else if(TypeClient == 1){
            commandeclt.setCltEntreprise(CltEntreprise);
        }else if(TypeClient == 2){
            CltPassager.setNom(Nom.getText());
            CltPassager.setPrenom(Prenom.getText());
            CltPassager.setAdresse(Adresse.getText());
            CltPassager.setTelefixString(TELE1.getText());
            CltPassager.setTelemobileString(TELE2.getText());
            CltPassager.setNaissance(Adaptateur.DatabaseDateLocalDate(DateNaisssance.getValue()) );
            
            RadioButton SelectedRadioSexe = (RadioButton) ToggleGroupSexe.getSelectedToggle();
            CltPassager.setSexeString(SelectedRadioSexe.getEllipsisString());
            
            commandeclt.setCltPassager(CltPassager);
        }
        
        //controle le cas ou on a une ligne vide a la fin de la liste
        if(data.get(data.size()-1).getTotalTTC().isEmpty()){
           data.remove(data.size()-1);
        }
        commandeclt.setListeproduit(data);
    }
    
    public void SetClient()
    {
        ClientExisteDejat.setVisible(false);
        Nom.setVisible(false);
        Prenom.setVisible(false);
        DateNaisssance.setVisible(false);
        Adresse.setVisible(false);
        TELE1.setVisible(false);
        TELE2.setVisible(false);
          
        ModeReglement.setDisable(false);
        
        CltExistCode.setText(client.getCodeclient());
        CltExistNom.setText(client.getNom());
        CltExistPrenom.setText(client.getPrenom());
        CltExistDateNaissance.setText(" "+client.getDateNaissanceString());
        CltExistAdresse.setText(client.getAdresse());
        CltExistTELE1.setText(client.getTelefix().toString());
        CltExistTELE2.setText(client.getTelemobileString());
        
        if(client.getSexe() == 0){
            SexeFemme.setSelected(true);
        }else if(client.getSexe() == 1){
            SexeHomme.setSelected(true);
        }
        TextDateNaissance.setVisible(true);
        TextCltExistCode.setVisible(true);
        ClientDefault.setVisible(true);
        CltExistCode.setVisible(true);
        CltExistNom.setVisible(true);
        CltExistPrenom.setVisible(true);
        CltExistDateNaissance.setVisible(true);
        TextSexe.setVisible(true);
        SexeHomme.setVisible(true);
        SexeFemme.setVisible(true);
        
        CltExistAdresse.setVisible(true);
        CltExistTELE1.setVisible(true);
        CltExistTELE2.setVisible(true);
    }
    
    
    
    public void SetClientEntre(){
        TextMatricule.setVisible(true);
        TextPrenom.setVisible(false);
        
        DateNaisssance.setVisible(false);
        CltExistDateNaissance.setVisible(false);
        TextDateNaissance.setVisible(false);
                
        ClientExisteDejat.setVisible(false);
        Nom.setVisible(false);
        Prenom.setVisible(false);
        Adresse.setVisible(false);
        TELE1.setVisible(false);
        TELE2.setVisible(false);
        TextSexe.setVisible(false);
        SexeHomme.setVisible(false);
        SexeFemme.setVisible(false);
        ModeReglement.setDisable(false);
        
        CltExistCode.setText(CltEntreprise.getCode().toString());
        CltExistNom.setText(CltEntreprise.getNom());
        CltExistPrenom.setText(CltEntreprise.getMatricule());
        CltExistAdresse.setText(CltEntreprise.getAdresse());
        CltExistTELE1.setText(CltEntreprise.getTele1String());
        CltExistTELE2.setText(CltEntreprise.getTele2String());
        
        TextCltExistCode.setVisible(true);
        ClientDefault.setVisible(true);
        CltExistCode.setVisible(true);
        CltExistNom.setVisible(true);
        CltExistPrenom.setVisible(true);
        CltExistAdresse.setVisible(true);
        CltExistTELE1.setVisible(true);
        CltExistTELE2.setVisible(true);
        
        
    }
    
    private void CalculeListeProduit(){ //calculer et afficher la détail des produits
        netaPayer = 0;
        Remises = 0;
        totalTVA = 0;
        total_H_T_Net= 0;
        
        TotalTVA.setText("");
        Remise.setText("");
        NetAPayer.setText("");
        Timbre.setText("");
        TotalHTNet.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 ;
            
            TotalTVA.setText(Adaptateur.ArrondFloatToString(totalTVA));
            Remise.setText(Adaptateur.ArrondFloatToString(Remises));
            NetAPayer.setText(Adaptateur.ArrondFloatToString(netaPayer));
            Timbre.setText(ParametreSystem.Timbre);
            TotalHTNet.setText(Adaptateur.ArrondFloatToString(total_H_T_Net));
        }
    }
    
    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 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.setVisible(false);
        TableViewListeProduit.setVisible(true);
    }
    
}
