package Controllers.CommandeClt;

import Controllers.DevisClt.DevisCltGestionController;
import Controllers.Traitement.Adaptateur;
import Models.CommandeClt.CommandeCltDB;
import Models.CommandeClt.CommandeCltListe;
import javafx.scene.control.ProgressBar;
import java.io.IOException;
import java.net.URL;
import java.util.ResourceBundle;
import org.apache.log4j.Logger;
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.Parent;
import javafx.scene.control.Button;
import javafx.scene.control.ChoiceBox;
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.text.Text;
import javafx.util.Callback;

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

    Logger logger = Logger.getLogger(CommandeCltGestionController.class.getName());
    
    @FXML private AnchorPane PaneGestion ;
    
    @FXML private ProgressBar ProgressBarCommande;
    
    @FXML private Button ButtonSearchCommande ;
            
    @FXML private AnchorPane ListerPages;
    @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 ;
    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;
    
    
    private Service<Void> ThreadSearchCommande;
    
    @FXML public TableView<CommandeCltListe> TableViewGestionCommande;
    
    @FXML public TableColumn<CommandeCltListe ,String> TabColCodeCommande;
    @FXML public TableColumn<CommandeCltListe ,String> TabColModePaiement;
    @FXML public TableColumn<CommandeCltListe ,String> TabColTypeClient;
    @FXML public TableColumn<CommandeCltListe ,String> TabColCodeClient;
    @FXML public TableColumn<CommandeCltListe ,String> TabColTotalCommande;
    @FXML public TableColumn<CommandeCltListe ,String> TabColDateCreation ;
    @FXML public TableColumn<CommandeCltListe ,String> TabColCodeDevis;
    @FXML public TableColumn<CommandeCltListe ,String> TabColFacture;
    @FXML public TableColumn<CommandeCltListe ,String> TabColBonLivraison;
    @FXML public TableColumn<CommandeCltListe ,Boolean>TabColAction ;
    
    @FXML public TextField TextFieldCodeCommande;
    @FXML public TextField TextFieldCodeClient;
    @FXML public TextField TextFieldNameClient;
    @FXML public TextField TextFieldCodeDevis;
    @FXML public DatePicker DatePickerCreation;
    @FXML public RadioButton RadioComptant;
    @FXML public RadioButton RadioFacilite;
    
    @Override
    public void initialize(URL url, ResourceBundle rb) {
        
        //comboboxnombre des lignes tableview
        NbrLigne.setItems(cursors);
        NbrLigne.getSelectionModel().selectFirst();
        
        TableViewGestionCommande.setEditable(true);
        
        TabColCodeCommande.setStyle( "-fx-alignment: CENTER;");TabColCodeCommande.getStyleClass().add("Center");
        TabColCodeCommande.setCellValueFactory(new PropertyValueFactory<CommandeCltListe, String>("CodeCommande"));
        
        TabColTypeClient.setStyle( "-fx-alignment: CENTER;");TabColTypeClient.getStyleClass().add("Center");
        TabColTypeClient.setCellValueFactory(new PropertyValueFactory<CommandeCltListe, String>("TypeClient"));
        
        TabColCodeClient.setStyle( "-fx-alignment: CENTER;");TabColCodeClient.getStyleClass().add("Center");
        TabColCodeClient.setCellValueFactory(new PropertyValueFactory<CommandeCltListe, String>("CodeClient"));
        
        TabColModePaiement.setStyle( "-fx-alignment: CENTER;");TabColModePaiement.getStyleClass().add("Center");
        TabColModePaiement.setCellValueFactory(new PropertyValueFactory<CommandeCltListe, String>("ModePaiement"));
        
        TabColTotalCommande.setStyle( "-fx-alignment: CENTER;");
        TabColTotalCommande.getStyleClass().add("Center");
        TabColTotalCommande.setCellValueFactory(new PropertyValueFactory<CommandeCltListe, String>("TotalCommande"));
        TabColTotalCommande.setCellFactory(new Callback<TableColumn<CommandeCltListe,String>,TableCell<CommandeCltListe,String>>(){        
            @Override
            public TableCell<CommandeCltListe, String> call(TableColumn<CommandeCltListe, String> param) {                
                TableCell<CommandeCltListe, String> cell = new TableCell<CommandeCltListe, String>(){
                    @Override
                    public void updateItem(String item, boolean empty) {
                        if(item!= null){
                            Text text = new Text(Adaptateur.StringToStringEspace(item));
                            setGraphic(text);
                        }else{
                            setGraphic(null);
                        }
                    }
                };                           
                return cell;
            }
        });
        
        TabColDateCreation.setStyle( "-fx-alignment: CENTER;");TabColDateCreation.getStyleClass().add("Center");
        TabColDateCreation.setCellValueFactory(new PropertyValueFactory<CommandeCltListe, String>("DateCreation"));
        
        TabColCodeDevis.setStyle( "-fx-alignment: CENTER;");TabColCodeDevis.getStyleClass().add("Center");
        TabColCodeDevis.setCellValueFactory(new PropertyValueFactory<CommandeCltListe, String>("CodeDevis"));
        
        TabColFacture.setStyle( "-fx-alignment: CENTER;");TabColFacture.getStyleClass().add("Center");
        TabColFacture.setCellValueFactory(new PropertyValueFactory<CommandeCltListe, String>("CodeFacture"));
        
        TabColBonLivraison.setStyle( "-fx-alignment: CENTER;");TabColBonLivraison.getStyleClass().add("Center");
        TabColBonLivraison.setCellValueFactory(new PropertyValueFactory<CommandeCltListe, String>("CodeBonLivraison"));
       
        
        TabColAction.setSortable(true);
        TabColAction.setStyle( "-fx-alignment: CENTER;");TabColAction.getStyleClass().add("Center");
        TabColAction.setCellFactory(new Callback<TableColumn<CommandeCltListe, Boolean>, TableCell<CommandeCltListe, Boolean>>() {
            @Override 
            public TableCell<CommandeCltListe, Boolean> call(TableColumn<CommandeCltListe, Boolean> personBooleanTableColumn) {
                return new ButtonCell();
            }
        });
        
       
        ButtonSearchCommande.setOnMouseClicked(new EventHandler<MouseEvent>() {
            public void handle(MouseEvent me) {
                SearchCommande();
            }
        });
        
        PaneGestion.setOnKeyPressed(new EventHandler<KeyEvent>() {
            @Override
            public void handle(KeyEvent ke) {
                if (ke.getCode().equals(KeyCode.ENTER)) {
                    SearchCommande();
                }
            }
        });
        
        RadioComptant.setOnMouseClicked(new EventHandler<MouseEvent>() {
            public void handle(MouseEvent me) {
                SearchCommande();
            }
        });
        
        RadioFacilite.setOnMouseClicked(new EventHandler<MouseEvent>() {
            public void handle(MouseEvent me) {
                SearchCommande();
            }
        });
        
        SearchCommande();
        
        GestionSearchCommande();
    }   
    
    @FXML
    private void PasserCommandeCltButtonAction(ActionEvent event) throws IOException {
        
        //inisialiser les données de Sauvgarde des opération
       CommandeCltPasserController.TypeClient = 2 ;
       CommandeCltPasserController.codeclient = null ;
       CommandeCltPasserController.codecliententre = null ;
       CommandeCltPasserController.Mode = null ;
       CommandeCltPasserController.CodeDevis = null;
       CommandeCltPasserController.data.clear();
       
       PaneGestion.getChildren().clear();
       PaneGestion.getChildren().add((Node) FXMLLoader.load(getClass().getResource("/Views/CommandeClt/CommandeCltPasser.fxml")));
    }
    
    
    //Define the button cell
    private class ButtonCell extends TableCell<CommandeCltListe, Boolean> {
        
        final Button cellButton = new Button();
        ButtonCell(){
            cellButton.getStyleClass().add("btn-icon-primary");
            Image coffeeImage = new Image(getClass().getResourceAsStream("/Public/icon/iconedit.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) {
                    // get Selected Item
                    CommandeCltListe current = (CommandeCltListe) ButtonCell.this.getTableView().getItems().get(ButtonCell.this.getIndex());
                    String codeCommande = current.getCodeCommande();
                    
                    try {
                        FXMLLoader fxmlLoader = new FXMLLoader(getClass().getResource("/Views/CommandeClt/CommandeCltDetail.fxml"));
                        Parent NodeDetail = (Parent)fxmlLoader.load();
                        CommandeCltDetail CommandeCltdetail =  fxmlLoader.getController();
                        CommandeCltdetail.AnchorPaneSucces.setVisible(false);
                        CommandeCltdetail.AnchorPaneInfoCommandeClt.setPrefHeight(574);
                        AnchorPane.setTopAnchor(CommandeCltdetail.AnchorPaneInfoCommandeClt, 5.0);
                                
                        CommandeCltdetail.SowDetailCommandeClt(codeCommande);
                        PaneGestion.getChildren().add(NodeDetail);
                         
                    } catch (IOException ex) {
                        logger.error("CommandeCltGestionController  : CommandeCltDetail.fxml :" + ex.getMessage());
                    }
                }
            });
        }
        //Display button if the row is not empty
        @Override
        protected void updateItem(Boolean t, boolean empty) {
            if(!empty){
                setGraphic(cellButton);
            } else {
                setGraphic(null);
            }
        }
    }
    
/******************************************************************************                                                                             *
 *                                                                              *
 *                       Methode last Next TableView client  Entreprise                   *
 * *                                                                            *
 ******************************************************************************/  
    
    private void SearchCommande()
    {
        ProgressBarCommande.setVisible(true);
        
        ButtonSearchCommande.setDisable(true);
        
        ThreadSearchCommande = new Service<Void>(){
            @Override
            protected Task<Void> createTask(){
                return new Task<Void>(){
                    @Override
                    protected Void call() throws Exception{
                        
                        position = 0;
                        
                        actuellepage = 1;
                        
                        String DateCreation = "";
                        if(DatePickerCreation.getValue() != null){
                            DateCreation = DatePickerCreation.getValue().toString();
                        }
                        
                        //     0comptant        1facilité
                        String TypeRegement = "";
                        if(RadioComptant.isSelected()){
                            TypeRegement = "0";
                        }else if(RadioFacilite.isSelected()){
                            TypeRegement = "1";
                        }
                        
                        ObservableList<CommandeCltListe> ListCommandes = new CommandeCltDB().SearchCommande(
                                                                                        position, 
                                                                                        nbrligne, 
                                                                                        TypeRegement, 
                                                                                        TextFieldCodeCommande.getText(),  
                                                                                        TextFieldCodeClient.getText(), 
                                                                                        TextFieldNameClient.getText(), 
                                                                                        TextFieldCodeDevis.getText(),
                                                                                        DateCreation);
                        TableViewGestionCommande.setItems(ListCommandes);
                        
                        totalcount = new CommandeCltDB().nbrSearchCommande(TypeRegement, TextFieldCodeCommande.getText(),  TextFieldCodeClient.getText(), TextFieldNameClient.getText(), TextFieldCodeDevis.getText(), DateCreation);
                        
                        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;
                    }
                };
            }
	};
        
        ThreadSearchCommande.setOnSucceeded(new EventHandler<WorkerStateEvent>(){
            @Override
            public void handle(WorkerStateEvent event){
                ProgressBarCommande.setVisible(false);
                ButtonSearchCommande.setDisable(false);
                LabelCount.setText(totalcount.toString());
                
            }
        });
        ThreadSearchCommande.start();
    }
    
    
    private void NextLastSearchCommande(Integer ParmPosition, Integer ParamNbrligne)
    {
        ProgressBarCommande.setVisible(true);
        
        ButtonSearchCommande.setDisable(true);
        
        ThreadSearchCommande = new Service<Void>(){
            @Override
            protected Task<Void> createTask(){
                return new Task<Void>(){
                    @Override
                    protected Void call() throws Exception{
                        
                        String DateCreation = "";
                        if(DatePickerCreation.getValue() != null){
                            DateCreation = DatePickerCreation.getValue().toString();
                        }
                        
                        //  0comptant 1facilité
                        String TypeRegement = "";
                        if(RadioComptant.isSelected()){
                            TypeRegement = "0";
                        }else if(RadioFacilite.isSelected()){
                            TypeRegement = "1";
                        }
                        
                        ObservableList<CommandeCltListe> ListCommandes = new CommandeCltDB().SearchCommande(ParmPosition, ParamNbrligne, TypeRegement, TextFieldCodeCommande.getText(),  TextFieldCodeClient.getText(), TextFieldNameClient.getText(), TextFieldCodeDevis.getText(), DateCreation);
                        
                        TableViewGestionCommande.setItems(ListCommandes);
                        
                        return null;
                    }
                };
            }
	};
        
        ThreadSearchCommande.setOnSucceeded(new EventHandler<WorkerStateEvent>(){
            @Override
            public void handle(WorkerStateEvent event){
                ProgressBarCommande.setVisible(false);
                ButtonSearchCommande.setDisable(false);
            }
        });
        ThreadSearchCommande.start();
    }
    
    private void GestionSearchCommande()
    {
        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;
                NextLastSearchCommande(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;
                    NextLastSearchCommande(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;
                    NextLastSearchCommande(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;
                    NextLastSearchCommande(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;
                    NextLastSearchCommande(position, nbrligne);
                    actuellepage=actuellepage-3 ;
                    ActuellePage.setText(Integer.toString(actuellepage));
                }
            }
        });

    }
    
}
