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

import Controllers.Client.ListeClient;
import Controllers.Client.ListeClientEntreprise;
import Controllers.Client.RechercherClientEntrepriseController;
import Controllers.Client.RechercherClientPersonneController;
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.ClientDB;
import Models.Client.ClientEntreprise;
import Models.Client.ClientEntrepriseDB;
import Models.Client.ClientPassager;
import Models.CommandeClt.CommandeClt;
import Models.CommandeClt.CommandeCltDB;
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.TableCell;
import javafx.scene.control.TableColumn;
import javafx.scene.control.TableView;
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 PC-Maher
 */
public class CommandeCltPasserController implements Initializable {

    @FXML private AnchorPane PaneAjouter ;
    
    @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 TextField Adresse ;
    @FXML public TextField TELE1 ;
    @FXML public TextField TELE2 ;
    
    @FXML public Text TextMatricule ;
    @FXML public Text TextPrenom;
    @FXML public Text TextSexe;
    @FXML public Text TextDateNaisssance;
    
    @FXML public Text TextCltExistCode;
    @FXML public Text CltExistCode;
    @FXML public Text CltExistNom;
    @FXML public Text CltExistPrenom;
    @FXML public Text CltExistDateNaissance;
    @FXML public Text CltExistAdresse;
    @FXML public Text CltExistTELE1;
    @FXML public Text CltExistTELE2;
    
    @FXML public DatePicker DateNaisssance ;
    
    @FXML public ComboBox ModeReglement ;
    
    @FXML public TableView<ListeProduit> TableViewListeProduit ;
    @FXML public TableColumn<ListeProduit ,String> TabColReference;
    @FXML public TableColumn<ListeProduit ,String> TabColDesignaton;
    @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 static Integer TypeClient ; // 0Personne  1Entreprise    2Passeger
    public static String codeclient ;
    public static String codecliententre;
    public static String Mode;  // Comptant     Facilité
    public static String CodeDevis;
    
    public static ObservableList<ListeProduit> data=FXCollections.observableArrayList();
    
    
    CommandeClt commandeclt = new CommandeClt();
    Produit produit=  new Produit();
    ProduitDB produitDB= new ProduitDB();
    
    public void SauvgardeTraitement(){
        if(TypeClient != null){
            
            if(TypeClient == 0){
                this.SetClient(codeclient);
            }
            if(TypeClient == 1){
                 this.SetClientEntre(codecliententre);
            }
        }
    }
    
    @Override
    public void initialize(URL url, ResourceBundle rb) {
    
    this.SauvgardeTraitement();
    
    TableViewListeProduit.setEditable(true);
    TabColReference.setCellValueFactory(new PropertyValueFactory<ListeProduit, String>("reference"));
    TabColDesignaton.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());
    
    ModeReglement.setValue(Mode);
   
    this.ReferenceMouseClick();
    this.QantiteMouseClick();
    this.RemiseMouseClick();
  
    
    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 CommandeCltPasserController.ButtonCell();
          }
        });
    TabColAddAction.setStyle( "-fx-alignment: CENTER;");
    TabColAddAction.getStyleClass().add("Center");
    
    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);
                }
            }    
        }
    });
    
    
    }
    
    @FXML
    private void SaveButtonAction(ActionEvent event) throws IOException {
        final CommandeCltDialogConfirmationController  CommandeCltDialogConfirmation = new CommandeCltDialogConfirmationController();
        if(ControleObject()){
            this.SetObject();
            CommandeCltDialogConfirmation.GetCommandeClt(commandeclt);
            CommandeCltDialogConfirmation.Enregister.setOnAction(new EventHandler<ActionEvent>(){
                @Override
                public void handle(ActionEvent t) {
                    CommandeCltDialogConfirmation.AnchorPrincipal.setVisible(false);
                    CommandeCltDB commandecltDB = new CommandeCltDB();
                    
                    commandeclt = commandecltDB.AddCommandeClt(commandeclt);
                    
                    if(!commandeclt.getCodecommandeclt().isEmpty()){
                        try {
                            FXMLLoader fxmlLoader = new FXMLLoader(getClass().getResource("/Views/CommandeClt/CommandeCltDetail.fxml"));
                            Parent NodeDetail = (Parent)fxmlLoader.load();
                            CommandeCltDetail commandecltDetail =  fxmlLoader.getController();
                            commandecltDetail.SowDetailCommandeClt(commandeclt.getCodecommandeclt());
                            PaneAjouter.getChildren().add(NodeDetail);
                        } catch (IOException ex) {
                            Logger.getLogger(CommandeCltDetail.class.getName()).log(Level.SEVERE, null, ex);
                        }
                    }
                }
            });
            
            CommandeCltDialogConfirmation.Show();
        }
    }
    
    
    //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);
            }
        }
    }
    
    @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);
            }
        }
    }
    
    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.setTypeClient(TypeClient);
        commandeclt.setTypeRegementString(ModeReglement.getValue().toString());
        commandeclt.setCodeDevis(CodeDevis);
        commandeclt.setNetAPayer(NetAPayer.getText());
        commandeclt.setTotalTVA(TotalTVA.getText());
        commandeclt.setTotalHorsTaxNet(TotalHTNet.getText());
        commandeclt.setRemise(Remise.getText());
        
        if(TypeClient == 0){
            Client CltPersonne = new Client();
            CltPersonne.setCodeclient(CltExistCode.getText());
            CltPersonne.setNom(CltExistNom.getText());
            CltPersonne.setPrenom(TextPrenom.getText());
            CltPersonne.setAdresse(CltExistAdresse.getText());
            CltPersonne.setTelefixString(CltExistTELE1.getText());
            CltPersonne.setTelemobileString(CltExistTELE2.getText());
            commandeclt.setCltPersonne(CltPersonne);
        }else if(TypeClient == 1){
            //TextCltExistCode CltExistCode CltExistNom CltExistPrenom  
            ClientEntreprise CltEntreprise = new ClientEntreprise();
            CltEntreprise.setCodeString(CltExistCode.getText());
            CltEntreprise.setNom(CltExistNom.getText());
            CltEntreprise.setMatricule(CltExistPrenom.getText());
            CltEntreprise.setAdresse(CltExistAdresse.getText());
            CltEntreprise.setTele1String(CltExistTELE1.getText());
            CltEntreprise.setTele2String(CltExistTELE2.getText());
            commandeclt.setCltEntreprise(CltEntreprise);
        }else if(TypeClient == 2){
            ClientPassager CltPassager = new ClientPassager();
            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);
    }
    
    @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/CommandeClt/CommandeCltPasser.fxml"));
                                Parent ParentCommandeClt = (Parent) fxmlLoader.load();
                                
                                CommandeCltPasserController CommandeCltPasser = fxmlLoader.getController();
                                
                                CommandeCltPasserController.data.addAll(devis.getListeproduit());
                                CommandeCltPasserController.TypeClient = devis.getTypeClient();
                                CommandeCltPasserController.CodeDevis = devis.getCodeDevis();
                                CommandeCltPasser.ModeReglement.setValue(devis.getTypeRegementString());
                                
                                if(devis.getTypeClient() == 0 ){
                                    CommandeCltPasserController.codeclient = devis.getCodeClient();
                                    CommandeCltPasser.SetClient(devis.getCodeClient());
                                }else if(devis.getTypeClient() == 1){
                                    CommandeCltPasserController.codecliententre = devis.getCodeClient();
                                    CommandeCltPasser.SetClientEntre(devis.getCodeClient());
                                }else if(devis.getTypeClient() == 2){
                                    CommandeCltPasser.Nom.setText(devis.getNom());
                                    CommandeCltPasser.Prenom.setText(devis.getPrenom());
                                    CommandeCltPasser.Adresse.setText(devis.getAdresse());
                                    CommandeCltPasser.TELE1.setText(devis.getTele1());
                                    CommandeCltPasser.TELE2.setText(devis.getTele2());
                                }
                                
                                CommandeCltPasser.TotalTVA.setText(devis.getTotalTVA());
                                CommandeCltPasser.Remise.setText(devis.getRemise());
                                CommandeCltPasser.NetAPayer.setText(devis.getNetAPayer());
                                CommandeCltPasser.Timbre.setText(devis.getTimbre());
                                CommandeCltPasser.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;
            }
        });
        
        
        
        
        
    }
    //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.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 {
                        // get Selected Item
                        ListeClient ClientPerson = ((ListeClient)getTableRow().getItem());
                        FXMLLoader fxmlLoader = new FXMLLoader(getClass().getResource("/Views/CommandeClt/CommandeCltPasser.fxml"));
                        Parent commandeclt = (Parent) fxmlLoader.load();

                        CommandeCltPasserController CommandeCltPasser = fxmlLoader.getController();
                        CommandeCltPasser.SetClient(ClientPerson.getCode());

                        //Traitement de Sauvgarde
                        CommandeCltPasserController.TypeClient = 0 ;
                        CommandeCltPasserController.codeclient = ClientPerson.getCode();

                        //Refrechir  le Panel
                        MyWindow mywindows = new MyWindow();
                        mywindows.Refresh(commandeclt, 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 currentPerson = ((ListeClientEntreprise)getTableRow().getItem());
                    
                    FXMLLoader fxmlLoader = new FXMLLoader(getClass().getResource("/Views/CommandeClt/CommandeCltPasser.fxml"));
                    Parent commandeclt = (Parent) fxmlLoader.load();
                    
                    //Traitement de Sauvgarde
                    CommandeCltPasserController.TypeClient = 1 ;
                    CommandeCltPasserController.codecliententre = currentPerson.getCode();
                    
                    CommandeCltPasserController CommandeCltPasser = fxmlLoader.getController();
                    CommandeCltPasser.SetClientEntre(currentPerson.getCode());
                    
                    //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);
                    }
		}
            };
	}
	});
           
    }
    
    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 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 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()) ;
            }
             
        }
     });
    }
    
    
    @FXML
    private void RechercheProduitButtonAction(ActionEvent event) throws IOException {
       final RechercherProduitController rechercheproduit = new RechercherProduitController(true);
       
       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
                        Produit currentPerson = ((Produit)getTableRow().getItem());
                        
                        FXMLLoader fxmlLoader = new FXMLLoader(getClass().getResource("/Views/CommandeClt/CommandeCltPasser.fxml"));
                        Parent commandeclt = (Parent) fxmlLoader.load();
                        
                        CommandeCltPasserController CommandeCltPasser = fxmlLoader.getController();
                        CommandeCltPasser.SetProduit(currentPerson.getReference());
                        
                        MyWindow mywindows = new MyWindow();
                        mywindows.Refresh(commandeclt, 3);
                        
                    } catch (IOException ex) {
                        Logger.getLogger(CommandeCltPasserController.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);
                    }
		}
            };
	}
	});
       
    }
    
    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);
    }
    
    
    
    private void CalculeListeProduit(){ //calculer et afficher la détail des produits
        float  netaPayer = 0;
        float  Remises = 0;
        float  totalTVA = 0;
        float  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));
        }
    }
    
    @FXML
    private void ClientRessetDefautButtonAction(ActionEvent event) throws IOException {
        CommandeCltPasserController.TypeClient = 2 ;
        ClientExisteDejat.setVisible(true);
        Nom.setVisible(true);
        Prenom.setVisible(true);
        DateNaisssance.setVisible(true);
        Adresse.setVisible(true);
        TELE1.setVisible(true);
        TELE2.setVisible(true);
        TextSexe.setVisible(true); 
	SexeHomme.setVisible(true); 
	SexeFemme.setVisible(true);
        TextDateNaisssance.setVisible(true);                              
                                        
        TextCltExistCode.setVisible(false);
        ClientDefault.setVisible(false);
        CltExistCode.setVisible(false);
        CltExistNom.setVisible(false);
        CltExistPrenom.setVisible(false);
        CltExistAdresse.setVisible(false);
        CltExistTELE1.setVisible(false);
        CltExistTELE2.setVisible(false);
        CltExistDateNaissance.setVisible(false);   
    }
    
    public void SetClient(String codeclt){
        Client client = new Client();
        ClientDB clientdb = new ClientDB();
        CommandeCltPasserController.TypeClient = 0 ;
        client = clientdb.getClient(codeclt);
        
        ClientExisteDejat.setVisible(false);
        Nom.setVisible(false);
        Prenom.setVisible(false);
        DateNaisssance.setVisible(false);
        Adresse.setVisible(false);
        TELE1.setVisible(false);
        TELE2.setVisible(false);
        TextSexe.setVisible(true); 
	SexeHomme.setVisible(true); 
	SexeFemme.setVisible(true);
        
        CltExistCode.setText(client.getCodeclient().toString());
        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() == 1){
            SexeHomme.setSelected(true);
        }else if(client.getSexe() == 0){
            SexeFemme.setSelected(true);
        }
        
        
        
        TextDateNaisssance.setVisible(true);
        TextCltExistCode.setVisible(true);
        ClientDefault.setVisible(true);
        CltExistCode.setVisible(true);
        CltExistNom.setVisible(true);
        CltExistPrenom.setVisible(true);
        CltExistDateNaissance.setVisible(true);
        CltExistAdresse.setVisible(true);
        CltExistTELE1.setVisible(true);
        CltExistTELE2.setVisible(true);
               
    }
    
     
     public void SetProduit(String Refprod){
        produit = produitDB.getProduit(Refprod);
        ListeProduit ListeProd = new ListeProduit(produit.getReference(),produit.getDesignation(),"1",produit.getPrixventeht(),"0",produit.getPrixventettc(),produit.getTvavente(),"0");
        //Supprimer les igne vide
        if((data.size()>0) && (data.get(data.size()-1).getReference().isEmpty())){
            data.remove(data.size()-1);
        }   
        
        AffectationTableView(ListeProd,-1);
    }
     public void SetClientEntre(String codecliententre){
         
        ClientEntreprise ClientEtr = new ClientEntreprise();
        ClientEntrepriseDB ClientEtrDB = new ClientEntrepriseDB();
        ClientEtr = ClientEtrDB.GetClientEtr(codecliententre);
        CommandeCltPasserController.TypeClient = 1 ;
        
        TextMatricule.setVisible(true);
        TextPrenom.setVisible(false);
        TextSexe.setVisible(false); 
        SexeHomme.setVisible(false); 
        SexeFemme.setVisible(false); 
        DateNaisssance.setVisible(false);
        
        ClientExisteDejat.setVisible(false);
        CltExistDateNaissance.setVisible(false);
        TextDateNaisssance.setVisible(false);
        Nom.setVisible(false);
        Prenom.setVisible(false);
        Adresse.setVisible(false);
        TELE1.setVisible(false);
        TELE2.setVisible(false);
        
        CltExistCode.setText(ClientEtr.getCode().toString());
        CltExistNom.setText(ClientEtr.getNom());
        CltExistPrenom.setText(ClientEtr.getMatricule());
        CltExistAdresse.setText(ClientEtr.getAdresse());
        CltExistTELE1.setText(ClientEtr.getTele1().toString());
        CltExistTELE2.setText(ClientEtr.getTele2().toString());
        
        TextCltExistCode.setVisible(true);
        ClientDefault.setVisible(true);
        CltExistCode.setVisible(true);
        CltExistNom.setVisible(true);
        CltExistPrenom.setVisible(true);
        CltExistAdresse.setVisible(true);
        CltExistTELE1.setVisible(true);
        CltExistTELE2.setVisible(true);
    }
}
