
package Controllers.DevisClt;

import Controllers.Client.ListeClient;
import Controllers.Client.ListeClientEntreprise;
import Controllers.Client.RechercherClientEntrepriseController;
import Controllers.Client.RechercherClientPersonneController;
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.DevisClt.Devis;
import Models.DevisClt.DevisDB;
import Models.Produit.Produit;
import Models.Produit.ProduitDB;
import java.io.IOException;
import java.net.URL;
import java.time.LocalDate;
import java.util.ResourceBundle;
import org.apache.log4j.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 Maher Ben Tili
 */
public class DevisAjouterController implements Initializable {
    
    Logger logger = Logger.getLogger(DevisAjouterController.class.getName());
    
    @FXML private AnchorPane PaneDevisAjouter ;
    
    @FXML private Text DevisTotalTVA ;
    @FXML private Text DevisRemise ;
    @FXML private Text DevisNetAPayer ;
    @FXML private Text DevisTimbre ;
    @FXML private Text DevisTotalHTNet ;
    
    @FXML private ToggleGroup ToggleGroupSexe;
    @FXML private RadioButton SexeHomme;
    @FXML private RadioButton SexeFemme;
    
    @FXML public Button EnregisterDevis ;
    @FXML public Button ClientExisteDejat ;
    @FXML public Button ClientDefault ;
    @FXML public Button RechercheProduit ;
    
    @FXML public TextField DevisNom ;
    @FXML public TextField DevisPrenom ;
    @FXML public TextField DevisAdresse ;
    @FXML public TextField DevisTELE1 ;
    @FXML public TextField DevisTELE2 ;
    
    @FXML public Text TextMatricule ;
    @FXML public Text TextPrenom;
    
    @FXML public Text TextCltExistCode;
    @FXML public Text CltExistCode;
    @FXML public Text CltExistNom;
    @FXML public Text CltExistPrenom;
    @FXML public Text CltExistAdresse;
    @FXML public Text CltExistTELE1;
    @FXML public Text CltExistTELE2;
    
    @FXML public DatePicker DateCreation ;
    @FXML public DatePicker DateFinValidite ;
    
    @FXML public ComboBox ModeReglement ;
    
    @FXML public TableView<ListeProduit> TableViewListeProduitDevis ;
    @FXML public TableColumn<ListeProduit ,String> TabColDevisReference;
    @FXML public TableColumn<ListeProduit ,String> TabColDevisDesignaton;
    @FXML public TableColumn<ListeProduit ,String> TabColDevisQuantite ;
    @FXML public TableColumn<ListeProduit ,String> TabColDevisPrixHT;
    @FXML public TableColumn<ListeProduit ,String> TabColDevisRemise;
    @FXML public TableColumn<ListeProduit ,String> TabColDevisTotalHT;
    @FXML public TableColumn<ListeProduit ,String> TabColDevisTVA;
    @FXML public TableColumn<ListeProduit ,String> TabColDevisTotalTTC;
    @FXML public TableColumn<ListeProduit ,Boolean> TabColDevisAddAction ;
    
    public static Integer TypeClient ; // 0Personne  1Entreprise    2Passeger
    public static String codeclient ;
    public static String codecliententre;
    public static Object Mode;
    public static LocalDate FinValidite;
    
    public static ObservableList<ListeProduit> data=FXCollections.observableArrayList();
    
    Devis devis = new Devis();
    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();
    
    DateCreation.setValue(LocalDate.now());
    
    TableViewListeProduitDevis.setEditable(true);
    TabColDevisReference.setCellValueFactory(new PropertyValueFactory<ListeProduit, String>("reference"));
    TabColDevisDesignaton.setCellValueFactory(new PropertyValueFactory<ListeProduit, String>("designation"));
    
    TabColDevisQuantite.setCellValueFactory(new PropertyValueFactory<ListeProduit, String>("quantite"));
    TabColDevisQuantite.setStyle( "-fx-alignment: CENTER; -fx-font-weight:bold; -fx-font-size: 10pt;");
    TabColDevisQuantite.getStyleClass().add("Center");
            
    TabColDevisPrixHT.setCellValueFactory(new PropertyValueFactory<ListeProduit, String>("PrixHT"));
    TabColDevisPrixHT.setStyle( "-fx-alignment: CENTER;");
    TabColDevisPrixHT.getStyleClass().add("Center");
    
    TabColDevisRemise.setCellValueFactory(new PropertyValueFactory<ListeProduit, String>("Remise"));
    TabColDevisRemise.setStyle( "-fx-alignment: CENTER;");
    TabColDevisRemise.getStyleClass().add("Center");
    
    TabColDevisTotalHT.setCellValueFactory(new PropertyValueFactory<ListeProduit, String>("TotalHT"));
    TabColDevisTotalHT.setStyle( "-fx-alignment: CENTER;");
    TabColDevisTotalHT.getStyleClass().add("Center");
    
    TabColDevisTVA.setCellValueFactory(new PropertyValueFactory<ListeProduit, String>("TVA"));
    TabColDevisTVA.setStyle( "-fx-alignment: CENTER;");
    TabColDevisTVA.getStyleClass().add("Center");
    
    TabColDevisTotalTTC.setCellValueFactory(new PropertyValueFactory<ListeProduit, String>("TotalTTC"));
    TabColDevisTotalTTC.setStyle( "-fx-alignment: CENTER; -fx-font-weight:bold; -fx-font-size: 10pt;");
    TabColDevisTotalTTC.getStyleClass().add("Center");
    
    TabColDevisReference.setCellFactory(TextFieldTableCell.<ListeProduit>forTableColumn());
    TabColDevisQuantite.setCellFactory(TextFieldTableCell.<ListeProduit>forTableColumn());
    TabColDevisRemise.setCellFactory(TextFieldTableCell.<ListeProduit>forTableColumn());
    
    this.ReferenceMouseClick();
    this.QantiteMouseClick();
    this.RemiseMouseClick();
   
    
    
    TabColDevisAddAction.setSortable(true);
    TabColDevisAddAction.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.
    TabColDevisAddAction.setCellFactory(new Callback<TableColumn<ListeProduit, Boolean>, TableCell<ListeProduit, Boolean>>() {
          @Override 
          public TableCell<ListeProduit, Boolean> call(TableColumn<ListeProduit, Boolean> personBooleanTableColumn) {
            return new DevisAjouterController.ButtonCell();
          }
        });
    
    
    TableViewListeProduitDevis.setItems(data);
    CalculeListeProduit();
    
    //Ajouter une ligne vide lorce ce que en click sur la tableview
    TableViewListeProduitDevis.setOnMouseClicked(new EventHandler<javafx.scene.input.MouseEvent>(){
        public void handle(MouseEvent event){
            int nbrligne = TableViewListeProduitDevis.getItems().size() ;
            if(nbrligne == 0){
                data.add(new ListeProduit("","","","","","","",""));
                TableViewListeProduitDevis.setItems(data);
            }
            else{
                ListeProduit Liste =  TableViewListeProduitDevis.getItems().get(nbrligne - 1);
                if(!Liste.getTotalTTC().isEmpty()){
                   data.add(new ListeProduit("","","","","","","",""));
                   TableViewListeProduitDevis.setItems(data); 
                   TableViewListeProduitDevis.getSelectionModel().select(nbrligne);
                }
            }    
        }
    });
    
    }
    
    @FXML
    private void SaveDevisButtonAction(ActionEvent event) throws IOException {
        final DevisDialogConfirmationController  DevisDialogConfirmation = new DevisDialogConfirmationController();
        if(ControleDevis()){
            this.SetDevis();
           
            DevisDialogConfirmation.Getdevis(devis);
            DevisDialogConfirmation.DevisEnregister.setOnAction(new EventHandler<ActionEvent>(){
                @Override
                public void handle(ActionEvent t) {
                    DevisDialogConfirmation.AnchorPrincipal.setVisible(false);
                    DevisDB devisdb = new DevisDB();
                    String codedevis = devisdb.AddDevis(devis);
                    if(!codedevis.isEmpty()){
                        try {
                            FXMLLoader fxmlLoader = new FXMLLoader(getClass().getResource("/Views/Devis/DevisDetail.fxml"));
                            Parent NodeDetail = (Parent)fxmlLoader.load();
                            DevisDetailController devisdetail =  fxmlLoader.getController();
                            devisdetail.SowDetailDevis(codedevis);
                            PaneDevisAjouter.getChildren().add(NodeDetail);
                        } catch (IOException ex) {
                            logger.error("DevisAjouterController  : DevisDetail.fxml :" + ex.getMessage());
                        }
                    }
                }
            });
            
            DevisDialogConfirmation.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();
                    TableViewListeProduitDevis.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 = TableViewListeProduitDevis.getItems().size() ;
        if(nbrligne == 0){
            data.add(new ListeProduit("","","","","","","",""));
            TableViewListeProduitDevis.setItems(data);
        }
        else{
            ListeProduit Liste =  TableViewListeProduitDevis.getItems().get(nbrligne - 1);
            if(!Liste.getTotalTTC().isEmpty()){
               data.add(new ListeProduit("","","","","","","",""));
               TableViewListeProduitDevis.setItems(data); 
               TableViewListeProduitDevis.getSelectionModel().select(nbrligne);
            }
        }
    }
    
    private boolean ControleDevis(){
        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();
        }
        //DateFinValidite ModeReglement
        else if(DateFinValidite.getValue()==null){
            DateFinValidite.setStyle("-fx-border-color:#f20606;");
        }
        else if(ModeReglement.getValue()==null){
            DateFinValidite.setStyle("-fx-border-color:#b5b5b5;");
            ModeReglement.setStyle("-fx-border-color:#f20606;");
        }
        else if(TypeClient == 2){       // 0Personne  1Entreprise    2Passeger
            ModeReglement.setStyle("-fx-border-color:transparent;");
            contro clt =new contro();
            if(DevisNom.getText().isEmpty()){
                DevisNom.setStyle("-fx-border-color:#f20606;");
            }
            else if(DevisPrenom.getText().isEmpty()){
                DevisNom.setStyle("-fx-border-color:transparent;");
                DevisPrenom.setStyle("-fx-border-color:#f20606;");
                
            }
            else if(DevisAdresse.getText().isEmpty()){
                DevisPrenom.setStyle("-fx-border-color:transparent;");
                DevisAdresse.setStyle("-fx-border-color:#f20606;");
                
            }
            else if(clt.isNumericNotnull(DevisTELE1.getText())){
                DevisAdresse.setStyle("-fx-border-color:transparent;");
                DevisTELE1.setStyle("-fx-border-color:#f20606;");
            }
            else if(clt.isNumeric(DevisTELE2.getText())){
                DevisTELE1.setStyle("-fx-border-color:transparent;");
                DevisTELE2.setStyle("-fx-border-color:#f20606;");
            }        
            else{
                DevisTELE2.setStyle("-fx-border-color:transparent;");
                DateFinValidite.setStyle("-fx-border-color:#b5b5b5;");
                ModeReglement.setStyle("-fx-border-color:#b5b5b5;");
                resulta = true ;
            }
        }
        else{
            DateFinValidite.setStyle("-fx-border-color:#b5b5b5;");
            ModeReglement.setStyle("-fx-border-color:#b5b5b5;");
            resulta = true ;
        }
        
        return resulta ;
    }
    private void SetDevis()
    {
        devis.setDateCreation(Adaptateur.NormalDateFormat(DateCreation.getValue()));
        devis.setTypeClient(TypeClient);
        devis.setTypeRegementString(ModeReglement.getValue().toString());
        devis.setValidite(Adaptateur.NormalDateFormat(DateFinValidite.getValue()));
        
        devis.setNetAPayer(DevisNetAPayer.getText());
        devis.setTotalTVA(DevisTotalTVA.getText());
        devis.setTotalHorsTaxNet(DevisTotalHTNet.getText());
        
        if(TypeClient == 0)
        {
            Client client = new ClientDB().getClient(CltExistCode.getText());
            devis.setClient(client);
            devis.setCodeClient(CltExistCode.getText());
        }
        else if(TypeClient == 1)
        {
            ClientEntreprise entreprise = new ClientEntrepriseDB().GetClientEtr(CltExistCode.getText());
            devis.setEntreprise(entreprise);
            devis.setCodeClient(CltExistCode.getText());
        }
        else if(TypeClient == 2)
        {
            ClientPassager passager = new ClientPassager();
            passager.setNom(DevisNom.getText());
            passager.setPrenom(DevisPrenom.getText());
            passager.setAdresse(DevisAdresse.getText());
            RadioButton SelectedRadioSexe = (RadioButton) ToggleGroupSexe.getSelectedToggle();
            passager.setSexeString(SelectedRadioSexe.getEllipsisString());
            passager.setTelefixString(DevisTELE1.getText());
            passager.setTelemobileString(DevisTELE2.getText());
            devis.setPassager(passager);
        }
        
        //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);
        }
        devis.setListeproduit(data);
    }
    
    
    //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/Devis/DevisAjouter.fxml"));
                        Parent devis = (Parent) fxmlLoader.load();

                       
                        //Traitement de Sauvgarde
                        DevisAjouterController.TypeClient = 0 ;
                        DevisAjouterController.codeclient = ClientPerson.getCode();
                        DevisAjouterController.FinValidite = DateFinValidite.getValue();
                        DevisAjouterController.Mode = ModeReglement.getValue();
                        
                        DevisAjouterController devisajouter = fxmlLoader.getController();
                        devisajouter.SetClient(ClientPerson.getCode());
                        devisajouter.ModeReglement.setValue(DevisAjouterController.Mode);
                        devisajouter.DateFinValidite.setValue(DevisAjouterController.FinValidite);
                        
                        //Refrechir  le Panel
                        MyWindow mywindows = new MyWindow();
                        mywindows.Refresh(devis, 3);
                    
                    } catch (IOException ex) {
                        logger.error("DevisAjouterController  :  ClientExisteDejatButtonAction : DevisAjouter.fxml :" + ex.getMessage());
                    }

                    }
                });
            }
            @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/Devis/DevisAjouter.fxml"));
                    Parent devis = (Parent) fxmlLoader.load();
                    
                    //Traitement de Sauvgarde
                    DevisAjouterController.TypeClient = 1 ;
                    DevisAjouterController.codecliententre = currentPerson.getCode();
                    DevisAjouterController.FinValidite = DateFinValidite.getValue();
                    DevisAjouterController.Mode = ModeReglement.getValue();
                        
                    DevisAjouterController devisajouter = fxmlLoader.getController();
                    
                    devisajouter.SetClientEntre(currentPerson.getCode());
                    devisajouter.ModeReglement.setValue(DevisAjouterController.Mode);
                    devisajouter.DateFinValidite.setValue(DevisAjouterController.FinValidite);
                    
                    //Refrechir  le Panel
                    MyWindow mywindows = new MyWindow();
                    mywindows.Refresh(devis, 3);
                    
                } catch (IOException ex) {
                    logger.error("DevisAjouterController  : DevisAjouter.fxml :" + ex.getMessage());
                }
                
                }
                });
            }

            @Override
            protected void updateItem(String paramT, boolean isEmpty) {
                super.updateItem(paramT, isEmpty);
                if (!isEmpty) {
                    setGraphic(cellButton);
		} else {
			setGraphic(null);
                    }
		}
            };
	}
	});
           
    }
    
    private void QantiteMouseClick(){
        TabColDevisQuantite.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
                TableViewListeProduitDevis.getColumns().get(t.getTablePosition().getRow()).setVisible(false);
                TableViewListeProduitDevis.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(){
        TabColDevisRemise.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
                TableViewListeProduitDevis.getColumns().get(t.getTablePosition().getRow()).setVisible(false);
                TableViewListeProduitDevis.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(){
        TabColDevisReference.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 {
        
        double PrefWidthPaneDevis = PaneDevisAjouter.getPrefWidth();
        double PrefHeightPaneDevis = PaneDevisAjouter.getPrefHeight();
        
        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 {
                        DevisAjouterController.FinValidite = DateFinValidite.getValue();
                        DevisAjouterController.Mode = ModeReglement.getValue();
                        // get Selected ItemButtonCell
                        Produit currentPerson = ((Produit)getTableRow().getItem());
                        
                        FXMLLoader fxmlLoader = new FXMLLoader(getClass().getResource("/Views/Devis/DevisAjouter.fxml"));
                        Parent devis = (Parent) fxmlLoader.load();
                        
                        DevisAjouterController devisajouter = fxmlLoader.getController();
                        devisajouter.SetProduit(currentPerson.getReference());
                        
                        devisajouter.ModeReglement.setValue(DevisAjouterController.Mode);
                        devisajouter.DateFinValidite.setValue(DevisAjouterController.FinValidite);
                        
                        devisajouter.PaneDevisAjouter.setPrefSize(PrefWidthPaneDevis, PrefHeightPaneDevis);
                        
                        
                        MyWindow mywindows = new MyWindow();
                        mywindows.Refresh(devis, 3);
                        
                    } catch (IOException ex) {
                        logger.error("DevisAjouterController  : RechercheProduitButtonAction :" + ex.getMessage());
                    }
                    
                    }
                });
            }
            @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 ;
            }
            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();
    
    
    TableViewListeProduitDevis.setItems(data);
    TableViewListeProduitDevis.setVisible(false);
    TableViewListeProduitDevis.setVisible(true);
    }
    
    
    
    private void CalculeListeProduit(){ //calculer et afficher la détail des produits
        float  NetaPayer = 0;
        float  Remise = 0;
        float  TotalTVA = 0;
        float  Total_H_T_Net= 0;
        DevisTotalTVA.setText("");
        DevisRemise.setText("");
        DevisNetAPayer.setText("");
        DevisTimbre.setText("");
        DevisTotalHTNet.setText("");
        
        //calcule
        for(ListeProduit liste : data){
            float totaht = Adaptateur.StringToFloat(liste.getTotalHT()) ;
            float prix_U_H_T = Adaptateur.StringToFloat(liste.getPrixHT()) ;
            float remise = Adaptateur.StringToFloat(liste.getRemise().replace("%", "")) ;
            float tva = Adaptateur.StringToFloat(liste.getTVA().replace("%", ""));
            float qte = Adaptateur.StringToFloat(liste.getQuantite());
            
            TotalTVA = TotalTVA + ((totaht *  tva) /100) ;
            
            Remise =  Remise + (prix_U_H_T * remise)/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 ;
            
            DevisTotalTVA.setText(Adaptateur.ArrondFloatToString(TotalTVA));
            DevisRemise.setText(Adaptateur.ArrondFloatToString(Remise));
            devis.setRemise(Adaptateur.ArrondFloatToString(Remise));
            DevisNetAPayer.setText(Adaptateur.ArrondFloatToString(NetaPayer));
            DevisTimbre.setText(ParametreSystem.Timbre);
            DevisTotalHTNet.setText(Adaptateur.ArrondFloatToString(Total_H_T_Net));
        }
    }
    
    @FXML
    private void ClientRessetDefautButtonAction(ActionEvent event) throws IOException {
        DevisAjouterController.TypeClient = 2 ;
        ClientExisteDejat.setVisible(true);
        DevisNom.setVisible(true);
        DevisPrenom.setVisible(true);
        DevisAdresse.setVisible(true);
        DevisTELE1.setVisible(true);
        DevisTELE2.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);
    }
    
    public void SetClient(String codeclt){
        Client client = new Client();
        ClientDB clientdb = new ClientDB();
        DevisAjouterController.TypeClient = 0 ;
        client = clientdb.getClient(codeclt);
        
        ClientExisteDejat.setVisible(false);
        DevisNom.setVisible(false);
        DevisPrenom.setVisible(false);
        DevisAdresse.setVisible(false);
        DevisTELE1.setVisible(false);
        DevisTELE2.setVisible(false);
        
        
        CltExistCode.setText(client.getCodeclient().toString());
        CltExistNom.setText(client.getNom());
        CltExistPrenom.setText(client.getPrenom());
        CltExistAdresse.setText(client.getAdresse());
        CltExistTELE1.setText(client.getTelefix().toString());
        CltExistTELE2.setText(client.getTelemobileString());
        
        TextCltExistCode.setVisible(true);
        ClientDefault.setVisible(true);
        CltExistCode.setVisible(true);
        CltExistNom.setVisible(true);
        CltExistPrenom.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);
        DevisAjouterController.TypeClient = 1 ;
        
        TextMatricule.setVisible(true);
        TextPrenom.setVisible(false);
         
        ClientExisteDejat.setVisible(false);
        DevisNom.setVisible(false);
        DevisPrenom.setVisible(false);
        DevisAdresse.setVisible(false);
        DevisTELE1.setVisible(false);
        DevisTELE2.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);
    }
}
