package Controllers.Reglement;

import Models.Fournisseur.FournisseurDB;
import Models.Reglement.Reglement;
import Models.Reglement.ReglementDB;
import com.gluonhq.charm.glisten.control.ProgressBar;
import java.io.IOException;
import org.controlsfx.control.textfield.TextFields;
import java.net.URL;
import java.text.DecimalFormat;
import java.util.ArrayList;
import java.util.ResourceBundle;
import javafx.beans.property.SimpleStringProperty;
import javafx.beans.value.ChangeListener;
import javafx.beans.value.ObservableValue;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.concurrent.Service;
import javafx.concurrent.Task;
import javafx.concurrent.WorkerStateEvent;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.fxml.FXML;
import javafx.fxml.FXMLLoader;
import javafx.fxml.Initializable;
import javafx.scene.Group;
import javafx.scene.Node;
import javafx.scene.control.Button;
import javafx.scene.control.ChoiceBox;
import javafx.scene.control.ComboBox;
import javafx.scene.control.DatePicker;
import javafx.scene.control.Label;
import javafx.scene.control.RadioButton;
import javafx.scene.control.TableCell;
import javafx.scene.control.TableColumn;
import javafx.scene.control.TableView;
import javafx.scene.control.TextField;
import javafx.scene.control.cell.PropertyValueFactory;
import javafx.scene.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;




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

    @FXML private ProgressBar ProgressBarGestionReglement;
    
    @FXML private Button ButtonSearchGestionReglement;
    
    @FXML private AnchorPane AnchorPaneGestionReglement;
    
    @FXML private TextField TextFieldFournisseur ;
    @FXML public TextField  TextFieldNumero ;
    @FXML public TextField  TextFieldMontant ;
    
    @FXML private ComboBox ComboBoxModePaiement;
    @FXML private DatePicker DatePickerDatePayer;
    @FXML private RadioButton RadioComptant;
    @FXML private RadioButton RadioFacilite;
    
    @FXML public TableView<Reglement> TableViewReglementFrs;
    @FXML public TableColumn<Reglement ,String> TabColNumero;
    @FXML public TableColumn<Reglement ,String> TabColMontant;
    @FXML public TableColumn<Reglement ,String> TabColModePaiement;
    @FXML public TableColumn<Reglement ,String> TabColFournisseur;
    @FXML public TableColumn<Reglement ,String> TabColTypePaiement;
    @FXML public TableColumn<Reglement ,String> TabColDatePayement;
    @FXML public TableColumn<Reglement ,Boolean> TabColDetail;
    
    
    @FXML private Text ActuellePage ;
    @FXML private Text NbrPage ;
    @FXML private Group nextgroupe ;
    @FXML private Group avancergroupe ;
    @FXML private Group lastgroupe ;        
    @FXML private Group retourgroupe ;
    @FXML private Label LabelCount;
    @FXML private ChoiceBox NbrLigne ;
    
    private Service<Void> ThreadSearchGestionReglement;
    
    ObservableList cursors = FXCollections.observableArrayList("10","15","20");
    private Integer nbrligne = 10 ;
    private Integer totalcount = 0;
    private Integer nbrpage = 0;
    private Integer actuellepage = 1;
    Integer position = 0;
    
    public  ArrayList<String> ListFournisseur = new  ArrayList<>();
    
    ReglementDB reglementDB= new ReglementDB();
    
    DecimalFormat Formatter = new DecimalFormat("##,###.## ");
    
    ObservableList ListPaiement = FXCollections.observableArrayList("Espace", "Chèque", "Carte bancaire", "Traite");
    
    String IdFournisseur = "";
    String Paiement = "";
    /**
     * Initializes the controller class.
     */
    @Override
    public void initialize(URL url, ResourceBundle rb) {
        
        setFournisseurFormData();
        
        ComboBoxModePaiement.setItems(ListPaiement);
        
        NbrLigne.setItems(cursors);
        NbrLigne.getSelectionModel().selectFirst();
        
        TabColNumero.setStyle( "-fx-alignment: CENTER; -fx-font-weight:bold; -fx-font-size: 10pt;");
        TabColNumero.getStyleClass().add("Center");
        TabColNumero.setCellValueFactory(new PropertyValueFactory<Reglement, String>("Numero"));
        
        TabColFournisseur.setStyle( "-fx-alignment: CENTER; -fx-font-weight:bold; -fx-font-size: 10pt;");
        TabColFournisseur.getStyleClass().add("Center");
        TabColFournisseur.setCellValueFactory(new Callback<TableColumn.CellDataFeatures<Reglement,String>, ObservableValue<String>>() {
            @Override
            public ObservableValue<String> call(TableColumn.CellDataFeatures<Reglement, String> data) {
                return new SimpleStringProperty(data.getValue().getFournisseur().getNom());
            }
        });
        
        TabColModePaiement.setStyle( "-fx-alignment: CENTER; -fx-font-weight:bold; -fx-font-size: 10pt;");
        TabColModePaiement.getStyleClass().add("Center");
        TabColModePaiement.setCellValueFactory(new PropertyValueFactory<Reglement, String>("ModePaiement"));
        TabColModePaiement.setCellFactory(new Callback<TableColumn<Reglement,String>,TableCell<Reglement,String>>(){        
            @Override
            public TableCell<Reglement, String> call(TableColumn<Reglement, String> param) {                
                TableCell<Reglement, String> cell = new TableCell<Reglement, String>(){
                    @Override
                    public void updateItem(String item, boolean empty) {
                         //0 :espace  |   1:Chèque   |   2 :carte bancaire  |   3: Traite
                        if(item!= null && item.equals("0")){
                            Text text = new Text("Espace");
                            text.setFont(Font.font("Arial", FontWeight.NORMAL, 14));
                            setGraphic(text);
                        }else if(item!= null && item.equals("1")){
                            Text text = new Text("Chèque");
                            text.setFont(Font.font("Arial", FontWeight.NORMAL, 14));
                            setGraphic(text);
                        }else if(item!= null && item.equals("2")){
                            Text text = new Text("Carte Bancaire");
                            text.setFont(Font.font("Arial", FontWeight.NORMAL, 14));
                            setGraphic(text);
                        }else if(item!= null && item.equals("3")){
                            Text text = new Text("Traite");
                            text.setFont(Font.font("Arial", FontWeight.NORMAL, 14));
                            setGraphic(text);
                        }else{
                            setGraphic(null);
                        }
                    }
                };                           
                return cell;
            }
        });
        
        
        TabColMontant.setStyle( "-fx-alignment: CENTER; -fx-font-weight:bold; -fx-font-size: 10pt;");
        TabColMontant.getStyleClass().add("Center");
        TabColMontant.setCellValueFactory(new PropertyValueFactory<Reglement, String>("Montant"));
        TabColMontant.setCellFactory(new Callback<TableColumn<Reglement,String>,TableCell<Reglement,String>>(){        
            @Override
            public TableCell<Reglement, String> call(TableColumn<Reglement, String> param) {                
                TableCell<Reglement, String> cell = new TableCell<Reglement, String>(){
                    @Override
                    public void updateItem(String item, boolean empty) {
                        if(item!= null){
                            Text text = new Text(Formatter.format(Float.parseFloat(item)));
                            setGraphic(text);
                        }else{
                            setGraphic(null);
                        }
                    }
                };                           
                return cell;
            }
        });
        
        TabColTypePaiement.setStyle( "-fx-alignment: CENTER; -fx-font-weight:bold; -fx-font-size: 10pt;");
        TabColTypePaiement.getStyleClass().add("Center");
        TabColTypePaiement.setCellValueFactory(new PropertyValueFactory<Reglement, String>("TypePaiement"));
        TabColTypePaiement.setCellFactory(new Callback<TableColumn<Reglement,String>,TableCell<Reglement,String>>(){        
            @Override
            public TableCell<Reglement, String> call(TableColumn<Reglement, String> param) {                
                TableCell<Reglement, String> cell = new TableCell<Reglement, String>(){
                    @Override
                    public void updateItem(String item, boolean empty) {
                        if(item!= null && item.equals("0")){
                            Text text = new Text("Comptant");
                            text.setFill(Color.web("#428BCA"));
                            text.setFont(Font.font("Arial", FontWeight.BOLD, 14));
                            setGraphic(text);
                        }else if(item!= null && item.equals("1")){
                            Text text = new Text("Facilité");
                            text.setFill(Color.web("#000000"));
                            text.setFont(Font.font("Arial", FontWeight.BOLD, 14));
                            setGraphic(text);
                        }else{
                            setGraphic(null);
                        }
                    }
                };                           
                return cell;
            }
        });
        
        TabColDatePayement.setStyle( "-fx-alignment: CENTER; -fx-font-weight:bold; -fx-font-size: 10pt;");
        TabColDatePayement.getStyleClass().add("Center");
        TabColDatePayement.setCellValueFactory(new PropertyValueFactory<Reglement, String>("DateTimeCreation"));
        
        
        
        TabColDetail.setStyle( "-fx-alignment: CENTER;");TabColDetail.getStyleClass().add("Center");
        TabColDetail.setCellFactory(new Callback<TableColumn<Reglement, Boolean>, TableCell<Reglement, Boolean>>() {
            @Override 
            public TableCell<Reglement, Boolean> call(TableColumn<Reglement, Boolean> personBooleanTableColumn) {
                return new ButtonCell();
            }
        });
        
        TextFieldFournisseur.textProperty().addListener(new ChangeListener<String>() { 
            @Override 
            public void changed(ObservableValue<? extends String> observable, String oldValue, String newValue) { 
                if(newValue.contains(" - ")){
                    String[] array = newValue.split(" - ", -1);
                    IdFournisseur = array[0];
                }
            } 
        });
        
        ComboBoxModePaiement.valueProperty().addListener(new ChangeListener<String>() {
            @Override 
            public void changed(ObservableValue ov, String t, String ValLocal) {
                //0 :espace  |   1:Chèque   |   2 :carte bancaire  |   3: Traite
                if(ValLocal.equals("Espace")){
                    Paiement = "0";
                }else if(ValLocal.equals("Chèque")){
                    Paiement = "1";
                }else if(ValLocal.equals("Carte bancaire")){
                    Paiement = "2";
                }else if(ValLocal.equals("Traite")){
                    Paiement = "3";
                }
            }    
        });
        
        
        
        ButtonSearchGestionReglement.setOnMouseClicked(new EventHandler<MouseEvent>() {
            public void handle(MouseEvent me) {
                SearchGestionReglement();
            }
        });
        
        AnchorPaneGestionReglement.setOnKeyPressed(new EventHandler<KeyEvent>() {
            @Override
            public void handle(KeyEvent ke) {
                if (ke.getCode().equals(KeyCode.ENTER)) {
                    SearchGestionReglement();
                }
            }
        });
        
        GestionSearchGestionReglement();
    }  
    
    
    @FXML
    private void ReglementAjouterButtonAction(ActionEvent event) throws IOException {
       AnchorPaneGestionReglement.getChildren().clear();
       AnchorPaneGestionReglement.getChildren().add((Node) FXMLLoader.load(getClass().getResource("/Views/Reglement/ReglementAjouter1.fxml")));
    }
    
    
    private class ButtonCell extends TableCell<Reglement, Boolean> {
        
        final Button cellButton = new Button();
        ButtonCell(){
            cellButton.getStyleClass().add("btn-icon-primary");
            Image coffeeImage = new Image(getClass().getResourceAsStream("/Public/icon/detailbutton.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) {
                    Reglement reglement = ((Reglement)getTableRow().getItem());
                    ReglementDialogDetailController ReglementDialogDetail = new ReglementDialogDetailController();
                    ReglementDialogDetail.Show();
                    ReglementDialogDetail.LanchShowReglement(reglement.getNumero());
                }
            });
        }
        
        //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 setFournisseurFormData()
    {
        ProgressBarGestionReglement.setVisible(true);
        
        ThreadSearchGestionReglement = new Service<Void>(){
            @Override
            protected Task<Void> createTask(){
                return new Task<Void>(){
                    @Override
                    protected Void call() throws Exception{
                        
                        ListFournisseur = new FournisseurDB().getAllFournisseur("CONCAT(`id_fourisseur`,' - ',`nom`)");
                        TextFields.bindAutoCompletion(TextFieldFournisseur, ListFournisseur);
        
                        return null;
                    }
                };
            }
	};
        ThreadSearchGestionReglement.setOnSucceeded(new EventHandler<WorkerStateEvent>(){
            @Override
            public void handle(WorkerStateEvent event){
                ProgressBarGestionReglement.setVisible(false);
            }
        });
        ThreadSearchGestionReglement.start();
    }
    
    
        
/******************************************************************************                                                                             *
 *                                                                              *
 *        Methode last Next TableView                                           *
 * *                                                                            *
 ******************************************************************************/  
    
    private void SearchGestionReglement()
    {
        ProgressBarGestionReglement.setVisible(true);
        
        ButtonSearchGestionReglement.setDisable(true);
        
        ThreadSearchGestionReglement = new Service<Void>(){
            @Override
            protected Task<Void> createTask(){
                return new Task<Void>(){
                    @Override
                    protected Void call() throws Exception{
                        
                        position = 0;
                        
                        actuellepage = 1;
                        
                        String DatePayer = "";
                        if(DatePickerDatePayer.getValue() != null){
                            DatePayer = DatePickerDatePayer.getValue().toString();
                        }    
                        
                        //     0comptant        1facilité
                        String TypeRegement = "";
                        if(RadioComptant.isSelected()){
                            TypeRegement = "0";
                        }else if(RadioFacilite.isSelected()){
                            TypeRegement = "1";
                        }
                        
                        ObservableList<Reglement> ListGestionReglements = new ReglementDB().SearchGestionReglementGestion(
                                                                                        position, 
                                                                                        nbrligne, 
                                                                                        TextFieldNumero.getText(), 
                                                                                        IdFournisseur,
                                                                                        TextFieldMontant.getText(), 
                                                                                        DatePayer,
                                                                                        TypeRegement,
                                                                                        Paiement);
                            
                        TableViewReglementFrs.setItems(ListGestionReglements);
                        
                        totalcount = new ReglementDB().nbrGestionReglementGestion(TextFieldNumero.getText(), IdFournisseur, TextFieldMontant.getText(), DatePayer, TypeRegement, Paiement);
                        
                        if(totalcount > 0){
                            ActuellePage.setText("1");
                        }else{
                            ActuellePage.setText("0");
                        }
                        
                        if(totalcount % nbrligne==0){ 
                            nbrpage = totalcount / nbrligne ;
                        }
                        else{ 
                            nbrpage = (totalcount / nbrligne) + 1 ; 
                        }
                        NbrPage.setText(Integer.toString(nbrpage));
                        
                        return null;
                    }
                };
            }
	};
        
        ThreadSearchGestionReglement.setOnSucceeded(new EventHandler<WorkerStateEvent>(){
            @Override
            public void handle(WorkerStateEvent event){
                ProgressBarGestionReglement.setVisible(false);
                ButtonSearchGestionReglement.setDisable(false);
                LabelCount.setText(totalcount.toString());
                
            }
        });
        ThreadSearchGestionReglement.start();
    }
    
    
    private void NextLastSearchGestionReglement(Integer ParmPosition, Integer ParamNbrligne)
    {
        ProgressBarGestionReglement.setVisible(true);
        
        ButtonSearchGestionReglement.setDisable(true);
        
        ThreadSearchGestionReglement = new Service<Void>(){
            @Override
            protected Task<Void> createTask(){
                return new Task<Void>(){
                    @Override
                    protected Void call() throws Exception{
                        
                        String DatePayer = "";
                        if(DatePickerDatePayer.getValue() != null){
                            DatePayer = DatePickerDatePayer.getValue().toString();
                        }
                        
                        
                        //     0comptant        1facilité
                        String TypeRegement = "";
                        if(RadioComptant.isSelected()){
                            TypeRegement = "0";
                        }else if(RadioFacilite.isSelected()){
                            TypeRegement = "1";
                        }
                        
                        ObservableList<Reglement> ListGestionReglement = new ReglementDB().SearchGestionReglementGestion(ParmPosition, ParamNbrligne, TextFieldNumero.getText(), IdFournisseur, TextFieldMontant.getText(),  DatePayer, TypeRegement, Paiement);
                        
                        TableViewReglementFrs.setItems(ListGestionReglement);
                        
                        return null;
                    }
                };
            }
	};
        
        ThreadSearchGestionReglement.setOnSucceeded(new EventHandler<WorkerStateEvent>(){
            @Override
            public void handle(WorkerStateEvent event){
                ProgressBarGestionReglement.setVisible(false);
                ButtonSearchGestionReglement.setDisable(false);
            }
        });
        ThreadSearchGestionReglement.start();
    }
  
    private void GestionSearchGestionReglement()
    {
        NbrLigne.getSelectionModel().selectedIndexProperty().addListener(new ChangeListener<Number>() {

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

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


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

                }
            }
        }); 

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

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

                }
            }
        });

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

    }
    
}
