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


import Controllers.Dialog.MessageControle;
import Controllers.Dialog.ShowDialog;
import Controllers.Traitement.Adaptateur;
import Controllers.Traitement.ParametreSystem;
import Controllers.Traitement.contro;
import Models.Categorie.CategorieDB;
import Models.Stock.BonEntree;
import Models.Stock.BondeEntrerDB;
import Models.Stock.StockDB;
import com.gluonhq.charm.glisten.control.ProgressBar;
import java.io.IOException;
import java.net.URL;
import java.sql.Date;
import java.time.LocalDate;
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.concurrent.Service;
import javafx.concurrent.Task;
import javafx.concurrent.WorkerStateEvent;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.fxml.FXML;
import javafx.fxml.FXMLLoader;
import javafx.fxml.Initializable;
import javafx.scene.Parent;
import javafx.scene.control.Button;
import javafx.scene.control.ComboBox;
import javafx.scene.control.DatePicker;
import javafx.scene.control.TableCell;
import javafx.scene.control.TableColumn;
import javafx.scene.control.TableColumn.CellEditEvent;
import javafx.scene.control.TableView;
import javafx.scene.control.TextField;
import javafx.scene.control.cell.PropertyValueFactory;
import javafx.scene.control.cell.TextFieldTableCell;
import javafx.scene.image.Image;
import javafx.scene.image.ImageView;
import javafx.scene.input.KeyCode;
import javafx.scene.input.KeyEvent;
import javafx.scene.input.MouseEvent;
import javafx.scene.layout.AnchorPane;
import javafx.scene.paint.Color;
import javafx.scene.text.Font;
import javafx.scene.text.FontWeight;
import javafx.scene.text.Text;
import javafx.util.Callback;
import org.controlsfx.control.textfield.TextFields;

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

    @FXML private AnchorPane   AnchorPaneBondentree;
    
    @FXML private ProgressBar ProgressBarStockBonEnter;
    
    @FXML private Text LocalRecepteur ;
   
    @FXML private ComboBox ComboLocale;
    
    @FXML private DatePicker DateBE;
    @FXML private TextField TextFieldCategorie;
    @FXML private TextField CodeBE;
    @FXML private TextField BonEnteeTransporteur;
    @FXML private TextField ReferenceBE;
    @FXML private TextField DesignatonBE;
    @FXML private TextField TextFieldCodeBarre;
    
    @FXML private TableView<ListProduitRech> TableViewListeProduitRechercher ;
    @FXML private TableColumn<ListProduitRech ,String> TabColRechReference;
    @FXML private TableColumn<ListProduitRech ,String> TabColRechDesignaton;
    @FXML private TableColumn<ListProduitRech ,String> TabColRechMarque ;
    @FXML private TableColumn<ListProduitRech ,String> TabColRechCategorie;
    @FXML private TableColumn<ListProduitRech ,String> TabColRechPrixTTC;
    @FXML private TableColumn<ListProduitRech ,String> TabColRechTVA;
    @FXML private TableColumn<ListProduitRech, Boolean> TabColRechAddAction ;
    
    
    @FXML private TableView<ListProduitBon> TableViewListeProduitBE ;
    @FXML private TableColumn<ListProduitBon ,String> TabColBEReference;
    @FXML private TableColumn<ListProduitBon ,String> TabColBEDesignaton;
    @FXML private TableColumn<ListProduitBon ,String> TabColBEMarque ;
    @FXML private TableColumn<ListProduitBon ,String> TabColBECategorie;
    @FXML private TableColumn<ListProduitBon ,String> TabColBEPrixTTC;
    @FXML private TableColumn<ListProduitBon ,String> TabColBEQuantiteTTC;
    @FXML private TableColumn<ListProduitBon ,String> TabColBETVA;
    @FXML private TableColumn<ListProduitBon, Boolean> TabColBEAddAction ;
    
    private Service<Void> ThreadSearchCategorie;
    
    ObservableList<ListProduitBon> data=FXCollections.observableArrayList();
    BondeEntrerDB bonentrer = new BondeEntrerDB();
    StockDB stockdb = new StockDB();
    
    String categorie="" ;
    String Reference="" ;
    String designaton="" ;
    String Codebarre="" ;
    
    @Override
    public void initialize(URL url, ResourceBundle rb) {
        
        LocalRecepteur.setText(ParametreSystem.NomLocalPC);
        DateBE.setValue(LocalDate.now());
        //Liste des Locales
        ComboLocale.setOnMouseClicked(new EventHandler<MouseEvent>() {
            @Override
            public void handle(MouseEvent t) {
                ComboLocale.setStyle("-fx-border-color:#cfcfcf;");
                ComboLocale.getItems().clear();
                ComboLocale.getItems().addAll(stockdb.getListLocal());
            }
        }); 
        
        
        //List des Categories
        setCategorie();
        
        TableViewListeProduitBE.setEditable(true);
        
        //Pour la premiére table View rechercher un produit 
        TabColRechReference.setCellValueFactory(new PropertyValueFactory<ListProduitRech, String>("reference"));
        TabColRechDesignaton.setCellValueFactory(new PropertyValueFactory<ListProduitRech, String>("designaton"));
        TabColRechMarque.setCellValueFactory(new PropertyValueFactory<ListProduitRech, String>("marque"));
        TabColRechCategorie.setCellValueFactory(new PropertyValueFactory<ListProduitRech, String>("categorie"));
        TabColRechPrixTTC.setCellValueFactory(new PropertyValueFactory<ListProduitRech, String>("prixttc"));
        TabColRechPrixTTC.setStyle( "-fx-alignment: CENTER_RIGHT; -fx-font-weight:bold;");
        TabColRechTVA.setCellValueFactory(new PropertyValueFactory<ListProduitRech, String>("TVA"));
        TabColRechTVA.setStyle( "-fx-alignment: CENTER; -fx-font-weight:bold;");
        TabColRechAddAction.setSortable(true);
        TabColRechAddAction.setStyle( "-fx-alignment: CENTER;");
        
        TabColRechAddAction.setCellValueFactory(new Callback<TableColumn.CellDataFeatures<ListProduitRech, Boolean>, 
            ObservableValue<Boolean>>() {
            @Override
            public ObservableValue<Boolean> call(TableColumn.CellDataFeatures<ListProduitRech, Boolean> p) {
                return new SimpleBooleanProperty(p.getValue() != null);
            }
        });
 
        // create a cell value factory with an add button for each row in the table.
        TabColRechAddAction.setCellFactory(new Callback<TableColumn<ListProduitRech, Boolean>, TableCell<ListProduitRech, Boolean>>() {
          @Override 
          public TableCell<ListProduitRech, Boolean> call(TableColumn<ListProduitRech, Boolean> personBooleanTableColumn) {
            return new ButtonCell();
          }
        });
        
        
        //Pour la deuxèmé table View rechercher un produit 
        TabColBEReference.setCellValueFactory(new PropertyValueFactory<ListProduitBon, String>("reference"));
        TabColBEDesignaton.setCellValueFactory(new PropertyValueFactory<ListProduitBon, String>("designaton"));
        TabColBEMarque.setCellValueFactory(new PropertyValueFactory<ListProduitBon, String>("marque"));
        TabColBECategorie.setCellValueFactory(new PropertyValueFactory<ListProduitBon, String>("categorie"));
        TabColBEPrixTTC.setCellValueFactory(new PropertyValueFactory<ListProduitBon, String>("prixttc"));
        TabColBEPrixTTC.setStyle( "-fx-alignment: CENTER_RIGHT; -fx-font-weight:bold; -fx-font-size: 9pt;");
        TabColBETVA.setCellValueFactory(new PropertyValueFactory<ListProduitBon, String>("tva"));
        TabColBETVA.setStyle( "-fx-alignment: CENTER; -fx-font-weight:bold; -fx-font-size: 10pt;");
        TabColBEQuantiteTTC.setCellValueFactory(new PropertyValueFactory<ListProduitBon, String>("quantite"));
        TabColBEQuantiteTTC.setStyle( "-fx-alignment: CENTER; -fx-font-weight:bold; -fx-font-size: 10pt;");
        //Ajouter l'option textfield
        TabColBEQuantiteTTC.setCellFactory(TextFieldTableCell.<ListProduitBon>forTableColumn());
        
        
        //Valier l'opertion de modification de la quantite par la sourie 
        TabColBEQuantiteTTC.setOnEditCommit(new EventHandler<CellEditEvent<ListProduitBon, String>>() {
        @Override
        public void handle(CellEditEvent<ListProduitBon, String> t) {
            
            String NewQuantite = t.getNewValue();
            String OldQuantite = t.getOldValue();
           
            try{
                double d = Double.parseDouble(NewQuantite);
                //le cas ou il tape un zéro 0
                if(d<=0){
                    ((ListProduitBon) t.getTableView().getItems().get(t.getTablePosition().getRow())).setQuantite(OldQuantite);
                }
                else{
                    ((ListProduitBon) t.getTableView().getItems().get(t.getTablePosition().getRow())).setQuantite(NewQuantite);
                }
            }
            //le cas ou la nouvelle quantité n'est pas un entier
            catch(NumberFormatException nfe){
               //inséré l'ancienne valeur de quantité
               ((ListProduitBon) t.getTableView().getItems().get(t.getTablePosition().getRow())).setQuantite(OldQuantite);
            }
            //actualiser la ligne
            TableViewListeProduitBE.getColumns().get(t.getTablePosition().getRow()).setVisible(false);
            TableViewListeProduitBE.getColumns().get(t.getTablePosition().getRow()).setVisible(true);
        }
        
        });
        
        final TextField TextQuantiteTTC = new TextField();
        TextQuantiteTTC.setPromptText("quantite");
        TextQuantiteTTC.setMaxWidth(TabColBEQuantiteTTC.getPrefWidth());
       
        
        TabColBEAddAction.setSortable(true);
        TabColBEAddAction.setStyle( "-fx-alignment: CENTER;");
        TabColBEAddAction.setCellValueFactory(new Callback<TableColumn.CellDataFeatures<ListProduitBon, Boolean>, 
            ObservableValue<Boolean>>() {
            @Override
            public ObservableValue<Boolean> call(TableColumn.CellDataFeatures<ListProduitBon, Boolean> p) {
                return new SimpleBooleanProperty(p.getValue() != null);
            }
        });
 
        // create a cell value factory with an add button for each row in the table.
        TabColBEAddAction.setCellFactory(new Callback<TableColumn<ListProduitBon, Boolean>, TableCell<ListProduitBon, Boolean>>() {
          @Override 
          public TableCell<ListProduitBon, Boolean> call(TableColumn<ListProduitBon, Boolean> personBooleanTableColumn) {
            return new ButtonCellBE();
          }
        });
        
        
        //get recheche produit
        this.KeyEventProduit();
        
    }
    
    
    
    private void SearchProduit()
    {
        ProgressBarStockBonEnter.setVisible(true);
        
        ThreadSearchCategorie = new Service<Void>(){
            @Override
            protected Task<Void> createTask(){
                return new Task<Void>(){
                    @Override
                    protected Void call() throws Exception{
                        
                        TableViewListeProduitRechercher.setItems(bonentrer.getdataProdBE(Reference, designaton, Codebarre, categorie));
                        
                        return null;
                    }
                };
            }
	};
        
        ThreadSearchCategorie.setOnSucceeded(new EventHandler<WorkerStateEvent>(){
            @Override
            public void handle(WorkerStateEvent event){
                ProgressBarStockBonEnter.setVisible(false);
            }
        });
        ThreadSearchCategorie.start();
    }
    
    private void setCategorie()
    {
        ProgressBarStockBonEnter.setVisible(true);
        
        ThreadSearchCategorie = new Service<Void>(){
            @Override
            protected Task<Void> createTask(){
                return new Task<Void>(){
                    @Override
                    protected Void call() throws Exception{
                        
                        TextFields.bindAutoCompletion(TextFieldCategorie, new CategorieDB().getListCategorie());
                        
                        return null;
                    }
                };
            }
	};
        
        ThreadSearchCategorie.setOnSucceeded(new EventHandler<WorkerStateEvent>(){
            @Override
            public void handle(WorkerStateEvent event){
                ProgressBarStockBonEnter.setVisible(false);
            }
        });
        ThreadSearchCategorie.start();
    }
    
    //Define the button cell
    private class ButtonCell extends TableCell<ListProduitRech, Boolean> {
        
        final Button cellButton = new Button();
        
        ButtonCell(){
            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);

            //Action when the button is pressed
            cellButton.setOnAction(new EventHandler<ActionEvent>(){
                @Override
                public void handle(ActionEvent t) {
                    
                    ListProduitRech ListProRech = (ListProduitRech) ButtonCell.this.getTableView().getItems().get(ButtonCell.this.getIndex());
                    
                    ListProduitBon listbrodbe = new ListProduitBon(ListProRech.getReference(), ListProRech.getDesignaton(), ListProRech.getMarque(), ListProRech.getCategorie(), ListProRech.getPrixttc(), "1", ListProRech.getTVA());
                    
                    //lorce qu'il y a plus que ligne
                    if(data.size()>0){
                       boolean result = false ;
                       int indise = 1;
                       //Verifier si la produit exsiste déja
                       while(indise<=data.size() && !result){
                           result =  data.get(indise-1).getReference().equals(ListProRech.getReference());
                           //si il le produit exisite déja on ajoute 1 a la quantité 
                           if(result){
                               Integer quantite=Integer.parseInt(data.get(indise-1).getQuantite())+1;
                               data.get(indise-1).setQuantite(Integer.toString(quantite));
                               TableViewListeProduitBE.refresh();
                           }
                           indise++; 
                       }
                       //si le produit n'exsiste pas on la joute à la table view
                       if(!result){
                            data.add(listbrodbe); 
                        }
                    }
                    else{
                         data.add(listbrodbe);
                    }
                   TableViewListeProduitBE.setItems(data);
                }
            });
        }

        //Display button if the row is not empty
        @Override
        protected void updateItem(Boolean t, boolean empty) {
            if(!empty){
                setGraphic(cellButton);
            } else {
                setGraphic(null);
            }
        }
    }
    
    
    //Define the button cell
    private class ButtonCellBE extends TableCell<ListProduitBon, Boolean> {
        
        final Button cellButton = new Button();
        
        ButtonCellBE(){
            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);
                    
                }
            });
        }

        //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 KeyEventProduit(){
        
        ReferenceBE.setOnKeyReleased(new EventHandler<KeyEvent>() {
            @Override
            public void handle(KeyEvent ke) {
                Reference=ReferenceBE.getText();
                designaton=DesignatonBE.getText();
                Codebarre=TextFieldCodeBarre.getText();
                if(Reference.isEmpty() && designaton.isEmpty() && Codebarre.isEmpty()){
                    TableViewListeProduitRechercher.setItems(null);
                }
                else{
                    if (ke.getCode().equals(KeyCode.ENTER)) {
                        SearchProduit();
                    }
                }
                
            }
        });
        
        DesignatonBE.setOnKeyReleased(new EventHandler<KeyEvent>() {
            @Override
            public void handle(KeyEvent ke) {
                Reference=ReferenceBE.getText();
                designaton=DesignatonBE.getText();
                Codebarre=TextFieldCodeBarre.getText();
                if(Reference.isEmpty() && designaton.isEmpty() && Codebarre.isEmpty()){
                    TableViewListeProduitRechercher.setItems(null);
                }
                else{
                    if (ke.getCode().equals(KeyCode.ENTER)) {
                        SearchProduit();
                    }
                }
                
            }
        });
        
        TextFieldCodeBarre.setOnKeyReleased(new EventHandler<KeyEvent>() {
            @Override
            public void handle(KeyEvent ke) {
                Reference=ReferenceBE.getText();
                designaton=DesignatonBE.getText();
                Codebarre=TextFieldCodeBarre.getText();
                if(Reference.isEmpty() && designaton.isEmpty() && Codebarre.isEmpty()){
                    TableViewListeProduitRechercher.setItems(null);
                }
                else{
                    if (ke.getCode().equals(KeyCode.ENTER)) {
                        SearchProduit();
                    }
                }
                
            }
        });
        
        TextFieldCategorie.setOnKeyReleased(new EventHandler<KeyEvent>() {
            @Override
            public void handle(KeyEvent ke) {
                if (ke.getCode().equals(KeyCode.ENTER)) {
                    Reference=ReferenceBE.getText();
                    designaton=DesignatonBE.getText();
                    Codebarre = TextFieldCodeBarre.getText();
                    categorie = TextFieldCategorie.getText();
                    SearchProduit();
                }
            }
        });
    }
    
    
    //Créer la bon d'entére
    @FXML
    private void CreerBonEnterButtonAction(ActionEvent event) throws IOException {
        
        final BondeEntrerDialogConfirmation notification = new BondeEntrerDialogConfirmation();
        contro ctl= new contro() ;
        if(ComboLocale.getValue()==null){
            ComboLocale.setStyle("-fx-border-color:#f20606;");
            
        }
        else if(ctl.isNumericNotnull(CodeBE.getText())){
            CodeBE.setStyle("-fx-border-color:#f20606;");
        }
        else if(data.isEmpty()){
            ComboLocale.setStyle("-fx-border-color:#cfcfcf;");
            CodeBE.setStyle("-fx-border-color:#cfcfcf;");

            final MessageControle messagecontrol = new MessageControle();

            Text text3 = new Text();
            text3.setText("Vous devez ajouter au moin un produit à la liste des produits (entrée)");
            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{
            ComboLocale.setStyle("-fx-border-color:#cfcfcf;");
            notification.Code.setText(CodeBE.getText());
            notification.Source.setText(ComboLocale.getValue().toString());
            notification.Date.setText(Adaptateur.NormalDateFormat(DateBE.getValue()));
            notification.Tranporteur.setText(BonEnteeTransporteur.getText());
            notification.Confdata= data;
            
            
            notification.bouttonOK.setOnAction(new EventHandler<ActionEvent>() {
                @Override
                public void handle(ActionEvent event) {
                    
                    BonEntree bonentree = new BonEntree();
                    bonentree.setLocal_emetteur(ComboLocale.getValue().toString());
                    bonentree.setLocal_recepteur(ParametreSystem.NomLocalPC);
                    bonentree.setId(CodeBE.getText());
                    
                    //date bon d'entrée
                    Date Datebe = java.sql.Date.valueOf(DateBE.getValue());
                    bonentree.setDate(Datebe);
                    
                    bonentree.setTransporteur(BonEnteeTransporteur.getText());
                    if(bonentrer.addBonEntrer(bonentree,data)){
                        notification.stackpane.setVisible(false);
                        AnchorPaneBondentree.getChildren().clear();
                        try {
                            FXMLLoader fxmlLoader = new FXMLLoader(getClass().getResource("/Views/Stock/BondeEntrerDetail.fxml"));
                            Parent root = (Parent)fxmlLoader.load();
                            AnchorPaneBondentree.getChildren().add(root);
                        } catch (IOException ex) {
                                Logger.getLogger(BondeEntrerController.class.getName()).log(Level.SEVERE, null, ex);
                        }
                    }
                    else{
                        ShowDialog SD = new ShowDialog();
                        SD.ShowAletDialog();
                    }
                }
            });
            notification.ShowDialg();
        }
        
    }
    
    
}
