package Controllers.BonLivraisonClt;

import Controllers.Traitement.MyWindow;
import Models.BonLivraisonClt.BonLivraisonClt;
import Models.BonLivraisonClt.BonLivraisonCltDB;
import Models.Produit.ListeProduit;
import Models.User.Profile;
import Models.User.ProfileDB;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
import java.util.logging.Level;
import java.util.logging.Logger;
import javafx.application.Platform;
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.print.PageRange;
import javafx.print.PrinterJob;
import javafx.scene.Node;
import javafx.scene.Scene;
import javafx.scene.control.Control;
import javafx.scene.control.ProgressIndicator;
import javafx.scene.control.TableCell;
import javafx.scene.control.TableColumn;
import javafx.scene.control.TableView;
import javafx.scene.control.cell.PropertyValueFactory;
import javafx.scene.control.cell.TextFieldTableCell;
import javafx.scene.layout.AnchorPane;
import javafx.scene.layout.StackPane;
import javafx.scene.text.Text;
import javafx.stage.Stage;
import javafx.util.Callback;

/**
 * FXML Controller class
 * @author Maher Ben Tili
 */
public class BonLivraisonCltDetailController{

    @FXML private TableView<ListeProduit> TableViewListeProduit ;
    @FXML private TableColumn<ListeProduit ,String> TabColReference;
    @FXML private TableColumn<ListeProduit ,String> TabColDesignation;
    @FXML private TableColumn<ListeProduit ,String> TabColQuantite ;
    @FXML private TableColumn<ListeProduit ,String> TabColPrixHT;
    @FXML private TableColumn<ListeProduit ,String> TabColRemise;
    @FXML private TableColumn<ListeProduit ,String> TabColTotalHT;
    @FXML private TableColumn<ListeProduit ,String> TabColTVA;
    @FXML private TableColumn<ListeProduit ,String> TabColTotalTTC;
    
    @FXML private TableView<ListeProduit> TableViewListeProduitTempo ;
    @FXML private TableColumn<ListeProduit ,String> TabColReferenceTempo;
    @FXML private TableColumn<ListeProduit ,String> TabColDesignationTempo;
    @FXML private TableColumn<ListeProduit ,String> TabColQuantiteTempo ;
    @FXML private TableColumn<ListeProduit ,String> TabColPrixHTTempo;
    @FXML private TableColumn<ListeProduit ,String> TabColRemiseTempo;
    @FXML private TableColumn<ListeProduit ,String> TabColTotalHTTempo;
    @FXML private TableColumn<ListeProduit ,String> TabColTVATempo;
    @FXML private TableColumn<ListeProduit ,String> TabColTotalTTCTempo;
    
    
    @FXML public AnchorPane AnchorPrincipal ;    
    @FXML public AnchorPane AnchorSecondaire ;
    @FXML private ProgressIndicator ProgressBonLivraion ;
    
    @FXML public Text TextIdBonLivraison ;
    
    @FXML private Text TextTypeClt ;
    @FXML private Text TextNom ;
    @FXML private Text TextPrenom ;
    @FXML private Text TextAdressClt ;
    
    @FXML private Text TextDateCreation ;
    @FXML private Text TextLocale ;
    @FXML private Text TextNomPrenomProfile ;
    
    @FXML private Text TextHeurLivraison ;
    @FXML private Text TextDateLivraison ;
    @FXML private Text TextTransporteur ;
    @FXML private Text TextFraisLivraison ;
    @FXML private Text TextAdressLivraison ;
    
    private Service<Void> ThreadBonLivraison;
    public Node nodeFxml;
    public String  IdBonLivraison;
    
    ObservableList<Map<String, Object>> items = FXCollections.<Map<String, Object>>observableArrayList();
    int TotalHeightPage = 0;
    
    BonLivraisonClt BonLivraison = new BonLivraisonClt();
    Profile profile  = new Profile();
    
    public  BonLivraisonCltDetailController(){
        try {
            FXMLLoader fxmlLoader = new FXMLLoader(getClass().getResource("/Views/BonLivraisonClt/BonLivraisonCltDetail.fxml"));
            fxmlLoader.setController(this);
            nodeFxml = (Node) fxmlLoader.load();
        } catch (IOException ex) {
            Logger.getLogger(BonLivraisonCltDetailController.class.getName()).log(Level.SEVERE, null, ex);
        }
    }
    
    public void SetIdBonLivraison(String id_bon_livraison){
        IdBonLivraison = id_bon_livraison;
        
        TableViewListeProduit.setEditable(true);
        TabColReference.setCellValueFactory(new PropertyValueFactory<ListeProduit, String>("reference"));
        TabColDesignation.setCellValueFactory(new PropertyValueFactory<ListeProduit, String>("designation"));
    
        TabColQuantite.setCellValueFactory(new PropertyValueFactory<ListeProduit, String>("quantite"));
        TabColQuantite.setStyle( "-fx-alignment: CENTER; -fx-font-weight:bold; -fx-font-size: 10pt;");
        TabColQuantite.getStyleClass().add("Center");
            
        TabColPrixHT.setCellValueFactory(new PropertyValueFactory<ListeProduit, String>("PrixHT"));
        TabColPrixHT.setStyle( "-fx-alignment: CENTER;");
        TabColPrixHT.getStyleClass().add("Center");
    
        TabColRemise.setCellValueFactory(new PropertyValueFactory<ListeProduit, String>("Remise"));
        TabColRemise.setStyle( "-fx-alignment: CENTER;");
        TabColRemise.getStyleClass().add("Center");
    
        TabColTotalHT.setCellValueFactory(new PropertyValueFactory<ListeProduit, String>("TotalHT"));
        TabColTotalHT.setStyle( "-fx-alignment: CENTER;");
        TabColTotalHT.getStyleClass().add("Center");
    
        TabColTVA.setCellValueFactory(new PropertyValueFactory<ListeProduit, String>("TVA"));
        TabColTVA.setStyle( "-fx-alignment: CENTER;");
        TabColTVA.getStyleClass().add("Center");
    
        TabColTotalTTC.setCellValueFactory(new PropertyValueFactory<ListeProduit, String>("TotalTTC"));
        TabColTotalTTC.setStyle( "-fx-alignment: CENTER; -fx-font-weight:bold; -fx-font-size: 10pt;");
        TabColTotalTTC.getStyleClass().add("Center");
    
        TabColReference.setCellFactory(TextFieldTableCell.<ListeProduit>forTableColumn());
        TabColQuantite.setCellFactory(TextFieldTableCell.<ListeProduit>forTableColumn());
        TabColRemise.setCellFactory(TextFieldTableCell.<ListeProduit>forTableColumn());
        
        initializeTempo();
        
        LanchBonLivraison();
    }
    
    public void LanchBonLivraison(){
        ThreadBonLivraison = new Service<Void>(){
            @Override
            protected Task<Void> createTask(){
                return new Task<Void>(){
                    @Override
                    protected Void call() throws Exception{
                        BonLivraison = new BonLivraisonCltDB().GetBonLivraisonClt(IdBonLivraison);
                        profile = new ProfileDB().getpro(Integer.parseInt(BonLivraison.getIdProfileEditeur()));
                        return null;
                    }
                };
            }
	};
        ThreadBonLivraison.setOnSucceeded(new EventHandler<WorkerStateEvent>(){
            @Override
            public void handle(WorkerStateEvent event){
                TextIdBonLivraison.setText(BonLivraison.getIdBonLivrasionClt());
                
                //0 Personne  1 Entreprise 2 Passager
                if(BonLivraison.getTypeClient() == 0){
                    TextTypeClt.setText("Ancien client") ;
                    TextNom.setText(BonLivraison.CltPersonne.getNom()) ;
                    TextPrenom.setText(BonLivraison.CltPersonne.getPrenom()) ;
                    TextAdressClt.setText(BonLivraison.CltPersonne.getAdresse());
                }else if(BonLivraison.getTypeClient() == 1){
                    TextTypeClt.setText("Entreprise") ;
                    TextNom.setText(BonLivraison.CltEntreprise.getNom()) ;
                    TextPrenom.setText(BonLivraison.CltEntreprise.getMatricule()) ;
                    TextAdressClt.setText(BonLivraison.CltEntreprise.getAdresse());
                }else if(BonLivraison.getTypeClient() == 2){
                    TextTypeClt.setText("Passager") ;
                    TextNom.setText(BonLivraison.CltPassager.getNom()) ;
                    TextPrenom.setText(BonLivraison.CltPassager.getPrenom()) ;
                    TextAdressClt.setText(BonLivraison.CltPassager.getAdresse());
                }
                
                TextNomPrenomProfile.setText(profile.getNom()+" "+profile.getPrenom()) ;
                        
                TextDateCreation.setText(BonLivraison.getDateCreation()) ;
                TextLocale.setText(BonLivraison.getLocalNom()) ;
                        
                TextHeurLivraison.setText(BonLivraison.getHeurLivraison()) ;
                TextDateLivraison.setText(BonLivraison.getDateLivraisonPreveu()) ;
                TextTransporteur.setText(BonLivraison.getTransporteur()) ;
                TextFraisLivraison.setText(BonLivraison.getFrais()) ;
                TextAdressLivraison.setText(BonLivraison.getAdresseLivraison()) ;
                        
                ObservableList<ListeProduit> DataListeProduit = BonLivraison.getListeproduit();
                TableViewListeProduit.setItems(DataListeProduit);
                TableViewListeProduitTempo.setItems(DataListeProduit);
                
                ProgressBonLivraion.setVisible(false);
                AnchorSecondaire.setVisible(true);
            }
        });
        ThreadBonLivraison.start();
    }
    
    
    
    public void Show()
    {
        StackPane Sp = new StackPane();
            
        Scene scene = new Scene(Sp);
        
        Sp.setPrefSize((double)MyWindow.PrincipalContentWidth, (double)MyWindow.PrincipalContentHeight);
        
        Stage stage = MyWindow.myStage;
        
        Sp.getChildren().add(MyWindow.myParent);
        Sp.getChildren().add(nodeFxml);
            
        stage.setScene(scene);
        stage.show();
    }
    
    @FXML
    private void ExitButtonAction(ActionEvent event) throws IOException {
        AnchorPrincipal.setVisible(false);
    }
    
    
    @FXML
    private void PDFBonLivraisonCltButtonAction(ActionEvent event) throws IOException {
        
    }
    
    
    private void initializeTempo()
    {
        TabColReferenceTempo.setCellValueFactory(new PropertyValueFactory<ListeProduit, String>("reference"));
        TabColReferenceTempo.setStyle( "-fx-alignment: CENTER;");
        TabColReferenceTempo.getStyleClass().add("Center");
        
        TabColDesignationTempo.setCellValueFactory(new PropertyValueFactory<ListeProduit, String>("designation"));
        TabColDesignationTempo.setCellFactory(new Callback<TableColumn<ListeProduit,String>,TableCell<ListeProduit,String>>(){        
            @Override
            public TableCell<ListeProduit, String> call(TableColumn<ListeProduit, String> param) {                
                TableCell<ListeProduit, String> cell = new TableCell<ListeProduit, String>(){
                    @Override
                    public void updateItem(String item, boolean empty) {
                        if (item == null) {
                            super.setText(null);
                            super.setGraphic(null);
                        } else {
                            String newItem = item.trim().toLowerCase();
                            Text text = new Text(newItem);
                            super.setPrefHeight(Control.USE_COMPUTED_SIZE);
                            text.wrappingWidthProperty().bind(super.widthProperty());
                            super.setGraphic(text);
                            Platform.runLater(new Runnable() {
                                @Override
                                public void run() {
                                    int selectdIndex = getTableRow().getIndex();
                                   
                                    if(selectdIndex>=0){
                                       Map<String, Object> item1 = new HashMap<>();
                                        item1.put("produit", (ListeProduit) getTableRow().getItem());
                                        item1.put("designation", newItem);
                                        item1.put("height", text.getBoundsInLocal().getHeight());
                                        items.add(item1);
                                        TotalHeightPage += text.getBoundsInLocal().getHeight();
                                   }
                                }
                            });
                        }
                    }
                };  
                return cell;
            }
        });
        
        
        
        TabColQuantiteTempo.setCellValueFactory(new PropertyValueFactory<ListeProduit, String>("quantite"));
        TabColQuantiteTempo.setStyle( "-fx-alignment: CENTER;");
        TabColQuantiteTempo.getStyleClass().add("Center");
            
        TabColPrixHTTempo.setCellValueFactory(new PropertyValueFactory<ListeProduit, String>("PrixHT"));
        TabColPrixHTTempo.setStyle( "-fx-alignment: CENTER;");
        TabColPrixHTTempo.getStyleClass().add("Center");
    
        TabColRemiseTempo.setCellValueFactory(new PropertyValueFactory<ListeProduit, String>("Remise"));
        TabColRemiseTempo.setStyle( "-fx-alignment: CENTER;");
        TabColRemiseTempo.getStyleClass().add("Center");
    
        TabColTotalHTTempo.setCellValueFactory(new PropertyValueFactory<ListeProduit, String>("TotalHT"));
        TabColTotalHTTempo.setStyle( "-fx-alignment: CENTER;");
        TabColTotalHTTempo.getStyleClass().add("Center");
    
        TabColTVATempo.setCellValueFactory(new PropertyValueFactory<ListeProduit, String>("TVA"));
        TabColTVATempo.setStyle( "-fx-alignment: CENTER;");
        TabColTVATempo.getStyleClass().add("Center");
    
        TabColTotalTTCTempo.setCellValueFactory(new PropertyValueFactory<ListeProduit, String>("TotalTTC"));
        TabColTotalTTCTempo.setStyle( "-fx-alignment: CENTER;");
        TabColTotalTTCTempo.getStyleClass().add("Center");
    
        TabColReferenceTempo.setCellFactory(TextFieldTableCell.<ListeProduit>forTableColumn());
        TabColQuantiteTempo.setCellFactory(TextFieldTableCell.<ListeProduit>forTableColumn());
        TabColRemiseTempo.setCellFactory(TextFieldTableCell.<ListeProduit>forTableColumn());
    }
    
    
    
    @FXML
    private void PrintBonLivraisonCltButtonAction(ActionEvent event) throws IOException {
        
        ObservableList<ListeProduit> ListProd = BonLivraison.getListeproduit();
        
        PrinterJob jobPrint = PrinterJob.createPrinterJob(); 
        
        try {
            
            jobPrint.getJobSettings().setPageRanges(new PageRange(1, 1));

            if (jobPrint.showPrintDialog(null)) {
                
                FXMLLoader fxmlLoaderPrintLivraison = new FXMLLoader(getClass().getResource("/Views/BonLivraisonClt/BonLivraisonCltPrint.fxml"));
                final Node ParentFxmlPrintLivraison = (Node)fxmlLoaderPrintLivraison.load();
                BonLivraisonCltPrintController PrintLivraison = fxmlLoaderPrintLivraison.getController();
                    
                PrintLivraison.setBonLivraisonClt(BonLivraison, ListProd, "1/1", true);

                jobPrint.printPage(ParentFxmlPrintLivraison);
                
                jobPrint.endJob();
            }
        } catch (IOException ex) {
            System.err.println("BondeEntrerDetailController PrintBonEntreButtonAction ! \n"+ex.getMessage());
        }
        
        
    }

    
}
