package Controllers.TraiteClt;

import Controllers.Traitement.Adaptateur;
import Controllers.Traitement.ParametreSystem;
import Controllers.Traitement.contro;
import Models.TraiteClt.TraiteCltDB;
import Models.TraiteClt.TraiteCltGestionDB;
import Models.TraiteClt.TraiteCltPaiementListe;
import java.io.IOException;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.time.LocalDate;
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.scene.Node;
import javafx.scene.control.Button;
import javafx.scene.control.DatePicker;
import javafx.scene.control.RadioButton;
import javafx.scene.control.Tab;
import javafx.scene.control.TabPane;
import javafx.scene.control.TableColumn;
import javafx.scene.control.TableView;
import javafx.scene.control.TextField;
import javafx.scene.control.cell.PropertyValueFactory;
import javafx.scene.input.MouseEvent;
import javafx.scene.layout.AnchorPane;
import javafx.scene.layout.GridPane;
import javafx.scene.paint.Color;
import javafx.scene.text.Text;
import org.apache.log4j.Logger;

/**
 * FXML Controller class
 * @author Maher Ben Tili
 */
public class TraiteCltDetailController {
    
    @FXML private AnchorPane PaneDetailTraite;
    @FXML private AnchorPane AnchorPaneLoadingTraite;
    
    @FXML public TableView<TraiteCltPaiementListe> TableViewPaiement;
    
    @FXML public TableColumn<TraiteCltPaiementListe ,String> TabColTypePaiement;
    @FXML public TableColumn<TraiteCltPaiementListe ,String> TabColMontantPaiement;
    @FXML public TableColumn<TraiteCltPaiementListe ,String> TabColDatePaiement;
    @FXML public TableColumn<TraiteCltPaiementListe ,String> TabColHeurPaiement;
    @FXML public TableColumn<TraiteCltPaiementListe ,String> TabColBanquePaiement;
    @FXML public TableColumn<TraiteCltPaiementListe ,String> TabColNumeroPaiement;
    
    @FXML private Text TextIdTraite;
    @FXML private Text TextDate;
    
    @FXML private Text TextEtat;
    @FXML private Text TextMontant;
    
    @FXML private Text TextTypeClt;
    @FXML private Text TextIdClient;
    @FXML private Text TextNomClt;
    @FXML private Text TextPrenomClt;
    @FXML private Text TxtPrenomMatricule;
    
    @FXML private Text TextCodeFact;
    @FXML private Text TextTotalFact;
    
    @FXML private RadioButton RadioEspace;
    @FXML private RadioButton RadioCheque;
    @FXML private RadioButton RadioCarte;
    
    @FXML private GridPane GridEspace;
    @FXML private GridPane GridCheque;
    @FXML private GridPane GridCarte;
    
    @FXML private TextField MontantEspace;
    
    @FXML private TextField MontantCheque;
    @FXML private TextField MontantChequeBanque;
    @FXML private TextField MontantChequeNumero;
    @FXML private DatePicker DatePickerCheque;
    
    @FXML private TextField MontantCarte;
    @FXML private TextField MontantCarteBanque;
    @FXML private TextField MontantCarteNumero;
    
    @FXML private  TabPane TabPanePayement;
    @FXML private  Tab TabPayerTraite;
    @FXML private  Tab TabDetailPaiement;
    
    @FXML private  Text TextCtlEspace;
    @FXML private  Text TextCtlBanque;
    @FXML private  Text TextCtlCarte;
    @FXML private  Text TextCtlDateCheque;
    
    @FXML private  Text TextCtlNumCheque;
    @FXML private  Text TextCtlNameBanque;
    
    @FXML private  Text TextCtlNumCarte;
    @FXML private  Text TextCtlNameCarteBq;
    
    @FXML private  Button ButtonPayerTraite;
    
    private int TypePayement ; // 0=>Cheque   |  1=>Espace   | 2=>Carte
    
    public String IdTraiteClt;
    private float OldMontantPayer;
    private float MontantTraite;
    
    public Service<Void> ThreadIdTraiteClt;
    
    ResultSet Resultat ;
    
    contro clt = new contro();
    
    Logger logger = Logger.getLogger(TraiteCltDetailController.class.getName());
    
    public Node GetNodeTraiteCltDetail() {
        Node nodeFxml = null;
        try {
            FXMLLoader fxmlLoader = new FXMLLoader(getClass().getResource("/Views/TraiteClt/TraiteCltDetail.fxml"));
            fxmlLoader.setController(this);
            nodeFxml =   (Node)fxmlLoader.load();
        } catch (IOException ex) {
            logger.error("TraiteCltDetailController  : GetNodeTraiteCltDetail :" + ex.getMessage());
        }
        return nodeFxml;
    }
    
    public void SetSelectPayement()
    {
        RadioEspace.setOnMouseClicked(new EventHandler<MouseEvent>() {
            public void handle(MouseEvent me) {
                GridEspace.setVisible(true);
                GridCheque.setVisible(false);
                GridCarte.setVisible(false);
                TypePayement = 0;
            }
        });
        RadioCheque.setOnMouseClicked(new EventHandler<MouseEvent>() {
            public void handle(MouseEvent me) {
                GridCheque.setVisible(true);
                GridEspace.setVisible(false);
                GridCarte.setVisible(false);
                TypePayement = 1;
            }
        });
        RadioCarte.setOnMouseClicked(new EventHandler<MouseEvent>() {
            public void handle(MouseEvent me) {
                GridCarte.setVisible(true);
                GridEspace.setVisible(false);
                GridCheque.setVisible(false);
                TypePayement = 2;
            }
        });
    }
    
    public void SetTraiteCltDetail(String id_traite) {
        IdTraiteClt = id_traite;
        
        TabColTypePaiement.setStyle( "-fx-alignment: CENTER;");TabColTypePaiement.getStyleClass().add("Center");
        TabColTypePaiement.setCellValueFactory(new PropertyValueFactory<TraiteCltPaiementListe, String>("TypePaiement"));
        
        TabColMontantPaiement.setStyle( "-fx-alignment: CENTER;");TabColMontantPaiement.getStyleClass().add("Center");
        TabColMontantPaiement.setCellValueFactory(new PropertyValueFactory<TraiteCltPaiementListe, String>("MontantPaiement"));
        
        TabColDatePaiement.setStyle( "-fx-alignment: CENTER;");TabColDatePaiement.getStyleClass().add("Center");
        TabColDatePaiement.setCellValueFactory(new PropertyValueFactory<TraiteCltPaiementListe, String>("DatePaiement"));
        
        TabColHeurPaiement.setStyle( "-fx-alignment: CENTER;");TabColHeurPaiement.getStyleClass().add("Center");
        TabColHeurPaiement.setCellValueFactory(new PropertyValueFactory<TraiteCltPaiementListe, String>("HeurPaiement"));
        
        TabColBanquePaiement.setStyle( "-fx-alignment: CENTER;");TabColBanquePaiement.getStyleClass().add("Center");
        TabColBanquePaiement.setCellValueFactory(new PropertyValueFactory<TraiteCltPaiementListe, String>("BanquePaiement"));
        
        TabColNumeroPaiement.setStyle( "-fx-alignment: CENTER;");TabColNumeroPaiement.getStyleClass().add("Center");
        TabColNumeroPaiement.setCellValueFactory(new PropertyValueFactory<TraiteCltPaiementListe, String>("NumeroPaiement"));
        
        startTask();
        ButtonPayerTraiteAction();
        SetSelectPayement();
    }
    
    
    public void startTask()
    {
        ThreadIdTraiteClt = new Service<Void>(){
            @Override
            protected Task<Void> createTask(){
                return new Task<Void>(){
                    @Override
                    protected Void call() throws Exception{
                        
                        Resultat = new TraiteCltGestionDB().GetDetailTraite(IdTraiteClt);
                        
                        
                        
                        return null;
                    }
                };
            }
	};
        ThreadIdTraiteClt.setOnSucceeded(new EventHandler<WorkerStateEvent>(){
            @Override
            public void handle(WorkerStateEvent event){
                try {
                    while (Resultat.next())
                    {
                        TextIdTraite.setText(Resultat.getString("id_traite"));

                        TextDate.setText(Resultat.getString("date_traite_format"));

                        TextCodeFact.setText(Resultat.getString("id_factureclt"));

                        TextTotalFact.setText(Adaptateur.StringToStringEspaceCurrency(Resultat.getString("net_a_payer")));

                        if(Resultat.getInt("typeclt") == 0){
                            TextTypeClt.setText("Personne");
                            TextIdClient.setText(Resultat.getString("codeclient"));
                            TextNomClt.setText(Resultat.getString("nom"));
                            TextPrenomClt.setText(Resultat.getString("prenom"));
                        }else if(Resultat.getInt("typeclt") == 1){
                            TextTypeClt.setText("Entreprise");
                            TextIdClient.setText(Resultat.getString("idcliententreprise"));
                            TextNomClt.setText(Resultat.getString("nomentrepise"));
                            TextPrenomClt.setText(Resultat.getString("matricule_fiscale"));
                            TxtPrenomMatricule.setText("Matricule:");
                        }

                        MontantTraite = Resultat.getFloat("montant_traite");
                        OldMontantPayer = Resultat.getFloat("montant_payer");

                        float RestMontantPayer = MontantTraite - OldMontantPayer;

                        String StrRestMontantPayer = Adaptateur.ArrondFloatToString(RestMontantPayer);

                        MontantCheque.setText(StrRestMontantPayer);
                        MontantCarte.setText(StrRestMontantPayer);
                        MontantEspace.setText(StrRestMontantPayer);


                        DatePickerCheque.setValue(LocalDate.now());


                        TextMontant.setText(Adaptateur.StringToStringEspaceCurrency(Resultat.getString("montant_traite")));

                        String etat = Resultat.getString("etat");
                        if(etat.equals("1")){
                            TextEtat.setText("Payer"); TextEtat.setFill(Color.web("#428BCA"));
                        }else if(etat.equals("2")){
                            TextEtat.setText("En Cours"); TextEtat.setFill(Color.web("#000000"));
                        }else if(etat.equals("3")){
                            TextEtat.setText("En Retart"); TextEtat.setFill(Color.RED);
                        }
                        TraiteCltDB TraiteDB= new TraiteCltDB();
                        ObservableList<TraiteCltPaiementListe>  PaiementListe = TraiteDB.getListPaiementTraiteClt(IdTraiteClt);
                        TableViewPaiement.setItems(PaiementListe);

                        // terminer le payement
                        if(OldMontantPayer>= MontantTraite){
                            TabPanePayement.getSelectionModel().select(TabDetailPaiement);
                            TabPayerTraite.setDisable(true);
                            TabPayerTraite.setText("");

                            TabDetailPaiement.setDisable(false);
                            TabDetailPaiement.setText("Detail de paiement");

                            // (données un montant mais n'est pas terminer le payement
                        }else if( (OldMontantPayer>0) && (OldMontantPayer<MontantTraite) ){
                            TabPayerTraite.setDisable(false);
                            TabPayerTraite.setText("Payer Traite");

                            TabDetailPaiement.setDisable(false);
                            TabDetailPaiement.setText("Detail de paiement");


                            // n'est pas payer
                        }else if(OldMontantPayer == 0){
                            TabPanePayement.getSelectionModel().select(TabPayerTraite);
                            TabDetailPaiement.setDisable(true);
                            TabDetailPaiement.setText("");
                        }
                    }
                } catch (SQLException ex) {
                    System.err.println("Erreur SQL ! \n"+ex.getMessage());
                    if(ParametreSystem.ErrorShowLogger)
                    {
                        logger.error("  :  :" + ex.getMessage());
                    }
                }
                
                PaneDetailTraite.setVisible(true);
                
                AnchorPaneLoadingTraite.setVisible(false);
            }
        });
        ThreadIdTraiteClt.start();
        /*PaneDetailTraite.setVisible(false);
                
        // Create a Runnable
        Runnable task = new Runnable(){
            public void run(){
                Platform.runLater(new Runnable(){
                    @Override
		    public void run(){
                        SetTextData();
                        StackProgress.setVisible(false);
                        PaneDetailTraite.setVisible(true);
		    }
		});	
            }
	};

	// Run the task in a background thread
	Thread backgroundThread = new Thread(task);
	
        // Terminate the running thread if the application exits
	backgroundThread.setDaemon(true);
	
        // Start the thread
	backgroundThread.start();*/
    }
    
    
    public void ButtonPayerTraiteAction(){
        
        ButtonPayerTraite.setOnAction(new EventHandler<ActionEvent>(){ //Action when the button is pressed
            @Override
            public void handle(ActionEvent t) {
                
                TraiteCltDB TraiteDB= new TraiteCltDB();
        
                //Espace
                if(TypePayement == 0){
                    String NewMontant = MontantEspace.getText();
                    if(ControleMontantPaiement(MontantEspace, TextCtlEspace)){
                        String IdPayementTraite = TraiteDB.SetPayerTraiteEnEspaceDB(IdTraiteClt, Adaptateur.StringToFloat(NewMontant), OldMontantPayer);
                        startTask();
                    }
                
                //Banque
                }else if(TypePayement == 1){
                    String NewMontant = MontantCheque.getText();
                    String NameBanque = MontantChequeBanque.getText();
                    String NumeroCheque =  MontantChequeNumero.getText();
                    //    
                    if(ControleMontantPaiement(MontantCheque, TextCtlBanque) &&
                        clt.ContrNull(MontantChequeBanque, TextCtlNameBanque) &&
                        clt.ContrNumeriqueNotnull(MontantChequeNumero, TextCtlNumCheque) &&
                        clt.ContrNullDatePicker(DatePickerCheque , TextCtlDateCheque)){
                        String DateCheque = DatePickerCheque.getValue().toString();
                        String IdPayementTraite = TraiteDB.SetPayerTraiteEnChequeDB(IdTraiteClt, Adaptateur.StringToFloat(NewMontant), OldMontantPayer, NameBanque, NumeroCheque, DateCheque);
                        startTask();
                    }

                //Carte Bancaire
                }else if(TypePayement == 2){
                    String NewMontant = MontantCarte.getText();
                    String NameBanque = MontantCarteBanque.getText();
                    String NumeroCarte =  MontantCarteNumero.getText();
                    if(ControleMontantPaiement(MontantCarte, TextCtlCarte)){
                        String IdPayementTraite = TraiteDB.SetPayerTraiteEnCarteDB(IdTraiteClt, Adaptateur.StringToFloat(NewMontant), OldMontantPayer, NameBanque, NumeroCarte);
                        startTask();
                    }
                }
                
                
            
            }
        });
    }
                
   
    
    
    
    
    public boolean ControleMontantPaiement(TextField TextFieldMontant,  Text TextClt){
        String NewMontant = MontantEspace.getText();
        boolean ResultClt = false;
        if(clt.isFloatNotnull(NewMontant)== false){
            float FolatNewMontant = Adaptateur.StringToFloat(NewMontant);
            if( (FolatNewMontant>0) && (FolatNewMontant<= (MontantTraite - OldMontantPayer)) ){
                TextFieldMontant.setStyle("-fx-border-color:transparent;");
                ResultClt = true;
            }else{
                TextFieldMontant.setStyle("-fx-border-color:#f20606;");
                TextClt.setText(" champ doit être entre 1 à "+(MontantTraite - OldMontantPayer));
            }
        }else{
            TextFieldMontant.setStyle("-fx-border-color:#f20606;");
            TextClt.setText(" champ doit être réel");
        }
        return ResultClt;
    }
    
    
    
    
    
    
    
}
