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

import Controllers.BonLivraisonClt.BonLivraisonCltPrintController;
import Controllers.FactureClt.FactureCltDetailController;
import Controllers.FactureClt.FactureCltPrintController;
import Controllers.TraiteClt.TraiteCltPrintController;
import Controllers.Traitement.Adaptateur;
import Models.BonLivraisonClt.BonLivraisonClt;
import Models.BonLivraisonClt.BonLivraisonCltDB;
import Models.CommandeClt.CommandeClt;
import Models.CommandeClt.CommandeCltDB;
import Models.FactureClt.FactureClt;
import Models.FactureClt.FactureCltDB;
import Models.Produit.ListeProduit;
import Models.TraiteClt.TraiteClt;
import java.io.IOException;
import java.math.BigDecimal;
import java.net.URL;
import java.util.ArrayList;
import java.util.ResourceBundle;
import java.util.logging.Level;
import java.util.logging.Logger;
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.print.JobSettings;
import javafx.print.PageLayout;
import javafx.print.PageOrientation;
import javafx.print.PageRange;
import javafx.print.Paper;
import javafx.print.Printer;
import javafx.print.PrinterJob;
import javafx.scene.Node;
import javafx.scene.Parent;
import javafx.scene.control.Button;
import javafx.scene.control.ProgressIndicator;
import javafx.scene.image.ImageView;
import javafx.scene.layout.GridPane;
import javafx.scene.text.Text;

/**
 * FXML Controller class
 *
 * @author maher
 */
public class Step4SaveVenteCltController implements Initializable {
    
    @FXML public Text TextCommande ;
    @FXML public Text TextBonLivraion;
    @FXML public Text TextFacture;
    @FXML public Text TextTypeFacilite;
    
    @FXML public ProgressIndicator ProgressCommande;
    @FXML public ProgressIndicator ProgressBonLivraion;
    @FXML public ProgressIndicator ProgressFacture;
    
    @FXML public ImageView ImageCommande;
    @FXML public ImageView ImageBonLivraion;
    @FXML public ImageView ImageFacture;
    
    @FXML public GridPane GridPaneCommande;
    @FXML public GridPane GridPaneBonLivraion;
    @FXML public GridPane GridPaneFacture;
    @FXML public GridPane GridPaneFactureFacilite;
    
    @FXML public Button ButtonPrintFactureClt ;
    @FXML public Button ButtonPrintCommande ;
    @FXML public Button ButtonPrintBonLivaison ;
    
    CommandeCltDB CommandeDB =  new CommandeCltDB();
    BonLivraisonCltDB  BonLivraisonDB = new BonLivraisonCltDB();
    FactureCltDB FactureDB = new FactureCltDB();
    
    BonLivraisonClt BonLivraison = new BonLivraisonClt();
    CommandeClt Commande = new CommandeClt();
    FactureClt Facture = new FactureClt();
    
    private String IdCommande;
    private String IdBonLivraison;
    private String IdFacture;
   
    
    private Service<Void> ThreadCommande;
    private Service<Void> ThreadBonLivraison;
    private Service<Void> ThreadFacture;
    
    /**
     * Initializes the controller class.
     */
    @Override
    public void initialize(URL url, ResourceBundle rb) {
        
        ButtonPrintCommande.setOnAction(new EventHandler<ActionEvent>() {
            @Override
            public void handle(ActionEvent event) {
                            
            }
        });
        
        ButtonPrintBonLivaison.setOnAction(new EventHandler<ActionEvent>() {
            @Override
            public void handle(ActionEvent event) {
                
                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.out.println("Erreur dans: Controllers.VenteRapideClt.Step4SaveVenteCltController.initialize.ButtonPrintBonLivaison");
                    System.out.println(ex.getMessage());
                }            
            }
        });
        
        ButtonPrintFactureClt.setOnAction(new EventHandler<ActionEvent>() {
            @Override
            public void handle(ActionEvent event) {
                
                PrinterJob jobPrint = PrinterJob.createPrinterJob(); 
        
                try {

                    jobPrint.getJobSettings().setPageRanges(new PageRange(1, 1));

                    if (jobPrint.showPrintDialog(null)) {

                        FXMLLoader fxmlLoaderPrintFactureClt = new FXMLLoader(getClass().getResource("/Views/FactureClt/FactureCltPrint.fxml"));
                        final Node ParentFxmlPrintFactureClt = (Node)fxmlLoaderPrintFactureClt.load();
                        FactureCltPrintController PrintFactureClt = fxmlLoaderPrintFactureClt.getController();

                        PrintFactureClt.setFactureClt(Facture, false);

                        jobPrint.printPage(ParentFxmlPrintFactureClt);

                        jobPrint.endJob();
                    }
                } catch (IOException ex) {
                    System.err.println("Erreur dans: Controllers.VenteRapideClt.Step4SaveVenteCltController.initialize.ButtonPrintFactureClt ");
                    System.err.println(ex.getMessage());
                }           
            }
        });
    }
    
    public void SetDataStep3ToStep4(CommandeClt commande_clt, BonLivraisonClt bon_livraison_clt, FactureClt facture_clt){
        Commande = commande_clt;
        BonLivraison = bon_livraison_clt;
        Facture = facture_clt;
    }
    
    
    public void LanchSaveCommande(){
        ThreadCommande = new Service<Void>(){
            @Override
            protected Task<Void> createTask(){
                return new Task<Void>(){
                    @Override
                    protected Void call() throws Exception{
                        Commande = CommandeDB.AddCommandeClt(Commande);
                        IdCommande = Commande.getCodecommandeclt();
                        
                        Commande.setCodecommandeclt(IdCommande);
                        BonLivraison.setIdCommande(IdCommande);
                        Facture.setIdCommandeClt(IdCommande);
                        
                        if(Commande.getTypeClient() == 2){
                            String IdPassager = Commande.getCltPassager().getCodeclient();
                            BonLivraison.CltPassager.setCodeclient(IdPassager);
                            Facture.CltPassager.setCodeclient(IdPassager);
                        }
                        return null;
                    }
                };
            }
	};
        ThreadCommande.setOnSucceeded(new EventHandler<WorkerStateEvent>(){
            @Override
            public void handle(WorkerStateEvent event){
                ProgressCommande.setVisible(false);
                TextCommande.setText("La Commande N°"+IdCommande+" a été enregistrés avec succès");
                ImageCommande.setVisible(true);
                GridPaneCommande.setVisible(true);
                ButtonPrintCommande.setVisible(true);
                LanchSaveBonLivraison();
            }
        });
        ThreadCommande.start();
    }
    
    
    public void LanchSaveBonLivraison(){
        ThreadBonLivraison = new Service<Void>(){
            @Override
            protected Task<Void> createTask(){
                return new Task<Void>(){
                    @Override
                    protected Void call(){
                        IdBonLivraison = BonLivraisonDB.AddBonLivraisonClt(BonLivraison);
                        Facture.setIdBonLivraisonClt(IdBonLivraison);
                        return null;
                    }
                };
            }
	};
        ThreadBonLivraison.setOnSucceeded(new EventHandler<WorkerStateEvent>(){
            @Override
            public void handle(WorkerStateEvent event){
                ProgressBonLivraion.setVisible(false);
                TextBonLivraion.setText("La bon livraison N°"+IdBonLivraison+" a été enregistrés avec succès");
                ImageBonLivraion.setVisible(true);
                GridPaneBonLivraion.setVisible(true);
                BonLivraison.setIdBonLivrasionClt(IdBonLivraison);
                ButtonPrintBonLivaison.setVisible(true);
                LanchSaveFacture();
            }
        });
        ThreadBonLivraison.start();
    }
    
    
    public void LanchSaveFacture(){
       ThreadFacture = new Service<Void>(){
            @Override
            protected Task<Void> createTask(){
                return new Task<Void>(){
                    @Override
                    protected Void call() throws Exception{
                        IdFacture = FactureDB.AddFactureClt(Facture);
                        CommandeDB.UpdateCommandeCltSetIdBonLivraison(IdCommande, IdBonLivraison);
                        CommandeDB.UpdateCommandeCltSetIdFacture(IdCommande, IdFacture);
                        return null;
                    }
                };
            }
	};
        ThreadFacture.setOnSucceeded(new EventHandler<WorkerStateEvent>(){
            @Override
            public void handle(WorkerStateEvent event){
                ProgressFacture.setVisible(false);
                TextFacture.setText("La facture N°"+IdFacture+" a été enregistrés avec succès");
                ImageFacture.setVisible(true);
                GridPaneFacture.setVisible(true);
                if(Facture.getTypeRegementInteger() == 1){
                    GridPaneFactureFacilite.setVisible(true);
                    if(Facture.getTypeFaciliteBoolean()){
                        TextTypeFacilite.setText("List traite");
                    }else{
                        TextTypeFacilite.setText("List cheque");
                    }
                }
                Facture.setCodeFactureClt(IdFacture);
                Facture.setDateFacture(Adaptateur.getDefaultCurrentDate("yyyy-MM-dd HH:mm:ss"));
                ButtonPrintFactureClt.setVisible(true);
            }
        });
        ThreadFacture.start();
    }    
    
    @FXML
    private void PrintTraiteButtonAction(ActionEvent event) throws IOException {
        ArrayList<TraiteClt> ListTraites = Facture.getListeTraites();
        String strCIN= "";
        String strNomComplet = "";
        
        if(Facture.getTypeClient() == 0){
           strCIN =  Facture.getCltPersonne().getCinString();
           strNomComplet = Facture.getCltPersonne().getNomcomplet();
        }else if(Facture.getTypeClient() == 1){
           strCIN =  Facture.getCltEntreprise().getMatricule();
           strNomComplet = Facture.getCltEntreprise().getNom();
        }
            
        FXMLLoader fxmlLoader = new FXMLLoader(getClass().getResource("/Views/TraiteClt/TraiteCltPrint.fxml"));
        try {
            Parent FxmlPrintTraite = (Parent)fxmlLoader.load();
            TraiteCltPrintController TraiteCltPrint = fxmlLoader.getController();
            
            PrinterJob jobPrint = PrinterJob.createPrinterJob();
            
            Printer printer = Printer.getDefaultPrinter();
            PageLayout pageLayout = printer.createPageLayout(Paper.NA_LETTER,PageOrientation.PORTRAIT, 0, 0, 0, 0);
            JobSettings jobSettings = jobPrint.getJobSettings();
            jobSettings.setPageLayout(pageLayout);
            
            jobPrint.getJobSettings().setPageRanges(new PageRange(1, ListTraites.size()));
            if (jobPrint.showPrintDialog(null)) 
            {
                for(int i=0; i<ListTraites.size(); i++)
                {
                    TraiteCltPrint.SetData(Adaptateur.ChiffreToLettre(new BigDecimal(ListTraites.get(i).getMontantTraiteClt())), 
                                        Adaptateur.StringToStringEspaceCurrency(ListTraites.get(i).getMontantTraiteClt()), 
                                        ListTraites.get(i).getDateTraiteClt(), 
                                        strNomComplet, 
                                        strCIN);
                    jobPrint.printPage(FxmlPrintTraite);
                }
            }
            jobPrint.endJob();
            
        } catch (IOException ex) {
            Logger.getLogger(FactureCltDetailController.class.getName()).log(Level.SEVERE, null, ex);
        }
    }
    
    /*
    public void LanchSaveCommande(){
        Commande = CommandeDB.AddCommandeClt(Commande);
        IdCommande = Commande.getCodecommandeclt();
                        
        Commande.setCodecommandeclt(IdCommande);
        BonLivraison.setIdCommande(IdCommande);
        Facture.setIdCommandeClt(IdCommande);
        if(Commande.getTypeClient() == 2){
            String IdPassager = Commande.getCltPassager().getCodeclient();
            BonLivraison.CltPassager.setCodeclient(IdPassager);
            Facture.CltPassager.setCodeclient(IdPassager);
        }
        
        IdBonLivraison = BonLivraisonDB.AddBonLivraisonClt(BonLivraison);
        Facture.setIdBonLivraisonClt(IdBonLivraison);
        
        IdFacture = FactureDB.AddFactureClt(Facture);
        
        CommandeDB.UpdateCommandeCltSetIdBonLivraison(IdCommande, IdBonLivraison);
        CommandeDB.UpdateCommandeCltSetIdFacture(IdCommande, IdFacture);
    }
    */
}
