package Controllers.Produit;

import Controllers.Traitement.contro;
import Models.Categorie.CategorieDB;
import Models.Produit.Produit;
import Models.Produit.ProduitDB;
import java.io.IOException;
import java.math.RoundingMode;
import java.net.URL;
import java.text.DecimalFormat;
import java.util.ResourceBundle;
import org.apache.log4j.Logger;
import javafx.animation.FadeTransition;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.fxml.FXML;
import javafx.fxml.FXMLLoader;
import javafx.fxml.Initializable;
import javafx.geometry.Pos;
import javafx.scene.Node;
import javafx.scene.control.Button;
import javafx.scene.control.ColorPicker;
import javafx.scene.control.ComboBox;
import javafx.scene.control.TextArea;
import javafx.scene.control.TextField;
import javafx.scene.image.Image;
import javafx.scene.image.ImageView;
import javafx.scene.input.KeyEvent;
import javafx.scene.layout.AnchorPane;
import javafx.scene.layout.StackPane;
import javafx.scene.paint.Color;
import javafx.scene.text.Font;
import javafx.scene.text.Text;
import javafx.util.Duration;

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

    Logger logger = Logger.getLogger(ModifierProduitController.class.getName());
    
    public String Reference = GestionProduitController.refprod;
    
    //private AnchorPane   Content ;
    @FXML private AnchorPane   AnchorPaneModifierprod ;
    @FXML private AnchorPane   AnchorPaneModifierProduit ;
    @FXML private TextField    ModifierProduitReference;
    @FXML private TextField    ModifierProduitdesignation  ;
    @FXML private TextField    ModifierProduitGarantie  ;
    @FXML private TextField    ModifierProduitMarque  ;
    @FXML private ComboBox     ModifierProduitcategorie  ;
    @FXML private ColorPicker  ModifierProduitCouleur  ;
    @FXML private TextArea   ModifierProduitDescription ;
    
    @FXML private TextField    ModifierProduitPrixAchatTTC  ;
    @FXML private TextField    ModifierProduittvaAchat  ;
    @FXML private TextField    ModifierProduitPrixAchatHT  ;
    
    @FXML private TextField    ModifierProduitMarge  ;
    
    @FXML private TextField    ModifierProduitPrixVenteTTC  ;
    @FXML private TextField    ModifierProduittvaVente ;
    @FXML private TextField    ModifierProduitPrixVenteHT ;
                                
    @FXML private TextField    ModifierProduitQualite;
    @FXML private TextField    ModifierProduitPoids ;
    @FXML private TextField    ModifierProduitDimensions;
    @FXML private TextField    ModifierProduitVitesse;
    @FXML private TextField    ModifierProduitPuissance;
    @FXML private TextField    ModifierProduitCapacite;
    
    @FXML private Text ErreurReference ;
    @FXML private Text ErreurDesignation ;
    
    @FXML private Text ErreurQualite ;
    @FXML private Text ErreurGarantie ;
    @FXML private Text Erreurcategorie ;
    @FXML private Text ErreurMarque ;
    
    @FXML private Text ErreurPrixAchatHT ;
    @FXML private Text ErreurtvaAchat ;
    @FXML private Text ErreurPrixAchatTTC ;
    
    @FXML private Text ErreurMarge ;
    
    @FXML private Text ErreurPrixVenteHT ;
    @FXML private Text ErreurtvaVente ;
    @FXML private Text ErreurPrixVenteTTC ;
    
    contro ctl= new contro() ;
    Produit prod = new Produit();
    ProduitDB dbproduit = new ProduitDB();
    CategorieDB dbcategorie = new CategorieDB();
    DecimalFormat df = new DecimalFormat("#.000");
    
    
    @Override
    public void initialize(URL url, ResourceBundle rb) {
        //liste categorie
        ModifierProduitcategorie.getItems().addAll(dbcategorie.getListCategorie());
        
        prod = dbproduit.getProduit(Reference);
        
        ModifierProduitReference.setText(prod.getReference());
        ModifierProduitMarque.setText(prod.getMarque())  ;
        ModifierProduitGarantie.setText(String.valueOf(prod.getGarantie()))  ;
        ModifierProduitdesignation.setText(prod.getDesignation())  ;
        ModifierProduitcategorie.setValue(prod.getCategorie())  ;
        
        df.setMaximumFractionDigits(3);
        
        ModifierProduitPrixAchatHT.setText(prod.getPrixachatht());
        ModifierProduittvaAchat.setText(prod.getTvaachat())  ;
        ModifierProduitPrixAchatTTC.setText(prod.getPrixachatttc());
        
        ModifierProduitMarge.setText(prod.getMarge())  ;
        
        ModifierProduitPrixVenteHT.setText(prod.getPrixventeht())  ;
        ModifierProduittvaVente.setText(prod.getTvavente());
        ModifierProduitPrixVenteTTC.setText(prod.getPrixventettc())  ;
        
        Color c = Color.web(prod.getCouleur());
        ModifierProduitCouleur.setValue(c) ;
        ModifierProduitDescription.setText(prod.getDescription()) ;
        ModifierProduitQualite.setText(prod.getQualiteString());
        ModifierProduitPoids.setText(prod.getPoids()) ;
        ModifierProduitDimensions.setText(prod.getDimensions());
        ModifierProduitVitesse.setText(prod.getVitesse());
        ModifierProduitPuissance.setText(prod.getPuissance());
        ModifierProduitCapacite.setText(prod.getCapacite());
        
        ModifierProduittvaAchat.setOnKeyReleased(new EventHandler<KeyEvent>() {
        @Override
        public void handle(KeyEvent ke){
            
            if(!ctl.isFloatNotnull(ModifierProduitPrixAchatHT.getText()) && !ctl.isFloatNotnull(ModifierProduittvaAchat.getText())){
                float prixachatht = Float.parseFloat(ModifierProduitPrixAchatHT.getText().replace(',','.'));
                float tvavente = Float.parseFloat(ModifierProduittvaAchat.getText().replace(',','.'));
                float prixachatttc =  prixachatht + (prixachatht*tvavente)/100 ; 
                df.setRoundingMode(RoundingMode.DOWN);
                ModifierProduitPrixAchatTTC.setText(df.format(prixachatttc).replace(',','.'));
            }
        }
        });
        
        ModifierProduitMarge.setOnKeyReleased(new EventHandler<KeyEvent>() {
        @Override
        public void handle(KeyEvent ke){
            if(!ctl.isFloatNotnull(ModifierProduitPrixAchatTTC.getText()) && !ctl.isFloatNotnull(ModifierProduitMarge.getText()) ){
                float marge = Float.parseFloat(ModifierProduitMarge.getText().replace(',','.'));
                float prixachatttc = Float.parseFloat(ModifierProduitPrixAchatTTC.getText().replace(',','.'));
                float prixventht = prixachatttc + (prixachatttc*marge)/100 ;
                df.setRoundingMode(RoundingMode.DOWN);
                ModifierProduitPrixVenteHT.setText(df.format(prixventht).replace(',','.'));
            }
        }
        });
        
        ModifierProduittvaVente.setOnKeyReleased(new EventHandler<KeyEvent>() {
        @Override
        public void handle(KeyEvent ke){
            if(!ctl.isFloatNotnull(ModifierProduitPrixVenteHT.getText()) && !ctl.isFloatNotnull(ModifierProduittvaVente.getText())){
                float prixventht = Float.parseFloat(ModifierProduitPrixVenteHT.getText().replace(',','.'));
                float tvavente = Float.parseFloat(ModifierProduittvaVente.getText().replace(',','.'));
                float prixventttc = prixventht + (prixventht*tvavente)/100 ;
                df.setRoundingMode(RoundingMode.DOWN);
                ModifierProduitPrixVenteTTC.setText(df.format(prixventttc).replace(',','.'));
            }
        }
        });
        
        
        
    }    

    @FXML
    private void ModifierProduitButtonAction(ActionEvent event) throws IOException {
        if( ctl.ContrNull(ModifierProduitReference,ErreurReference) && 
            ctl.ContrNull(ModifierProduitdesignation, ErreurDesignation)&& 
            ctl.ContrNullValue(ModifierProduitcategorie, Erreurcategorie)&&     
            ctl.ContrNull(ModifierProduitMarque, ErreurMarque)&& 
            ctl.ContrNumerique(ModifierProduitGarantie, ErreurGarantie)&&
            ctl.ContrNumerique(ModifierProduitQualite, ErreurQualite)&& 
            ctl.ContrReelNotNull(ModifierProduitPrixAchatHT, ErreurPrixAchatHT)&&
            ctl.ContrReelNotNull(ModifierProduittvaAchat, ErreurtvaAchat)&& 
            ctl.ContrReelNotNull(ModifierProduitPrixAchatTTC, ErreurPrixAchatTTC)&& 
            ctl.ContrReelNotNull(ModifierProduitMarge, ErreurMarge) &&
            ctl.ContrReelNotNull(ModifierProduitPrixVenteHT, ErreurPrixVenteHT)&&
            ctl.ContrReelNotNull(ModifierProduittvaVente, ErreurtvaVente)&&
            ctl.ContrReelNotNull(ModifierProduitPrixVenteTTC, ErreurPrixVenteTTC)   ){
            
            if(dbproduit.UpdateProduit(getProduit(),Reference)==1){
                FadeTransition ft = new FadeTransition(Duration.millis(400), AnchorPaneModifierProduit);
                ft.setFromValue(1.0);
                ft.setToValue(0.0);
                ft.play();
               
                ft.setOnFinished(new EventHandler<ActionEvent>() {
                //message de succés    
                @Override
                 public void handle(ActionEvent event) {
                    Image success = new Image(getClass().getResourceAsStream("/Public/icon/successfully.png"));
                    ImageView iv1 = new ImageView();
                    iv1.setImage(success);

                    Text text= new Text();
                    text.setText("La modification a été effectuée avec succès");
                    text.setFont(Font.loadFont(getClass().getResourceAsStream("/Public/Fonts/Raleway-SemiBold.ttf"), 20));
                                        
                    Button buttonOk = new Button("OK");
                    buttonOk.getStyleClass().add("btn-primary");
                    buttonOk.setPrefSize(100, 30);
                                         
                    final StackPane stackpane = new StackPane();
                    stackpane.setLayoutX(140);
                    stackpane.setLayoutY(100);
                    stackpane.setPrefHeight(200);
                    stackpane.setPrefWidth(200);
                    stackpane.getChildren().add(iv1);
                    stackpane.getChildren().add(text);
                    stackpane.getChildren().add(buttonOk);
                    StackPane.setAlignment(iv1, Pos.BASELINE_CENTER);
                    StackPane.setAlignment(text, Pos.TOP_CENTER);
                    StackPane.setAlignment(buttonOk, Pos.CENTER);

                    AnchorPaneModifierprod.setLeftAnchor(stackpane, 83.0);
                    AnchorPaneModifierprod.setRightAnchor(stackpane, 83.0);
                    AnchorPaneModifierprod.setTopAnchor(stackpane,220.0);
                    AnchorPaneModifierprod.setBottomAnchor(stackpane,220.0);       
                    AnchorPaneModifierprod.getChildren().add(stackpane);
                                     
                    buttonOk.setOnAction(new EventHandler<ActionEvent>() {     //supprimer le message du suucés et reaficher les formulaires  
                    @Override
                    public void handle(ActionEvent event) {
                        stackpane.setVisible(false);
                        try {
                            AnchorPaneModifierprod.getChildren().clear();
                            AnchorPaneModifierprod.getChildren().add((Node) FXMLLoader.load(getClass().getResource("/Views/Produit/GestionProduit.fxml")));
                        } catch (IOException ex) {
                            logger.error("ModifierProduitController  : ModifierProduitButtonAction :" + ex.getMessage());
                        }
                        FadeTransition ft = new FadeTransition(Duration.millis(400), AnchorPaneModifierprod);
                        ft.setFromValue(0.0);
                        ft.setToValue(1.0);
                        ft.play();
                        
                        }
                    });
                   
                }
                });
            }
        }
    }
    private Produit getProduit()
    {
        Produit prodUpdate = new Produit();
        
        prodUpdate.setReference(ModifierProduitReference.getText());
        prodUpdate.setDesignation(ModifierProduitdesignation.getText());
        prodUpdate.setCategorie(ModifierProduitcategorie.getValue().toString());
        prodUpdate.setGarantieString(ModifierProduitGarantie.getText());
        prodUpdate.setMarque(ModifierProduitMarque.getText());
        
        prodUpdate.setPrixachatttc(ModifierProduitPrixAchatTTC.getText().replace(',','.'));
        prodUpdate.setPrixachatht(ModifierProduitPrixAchatHT.getText().replace(',','.'));
        prodUpdate.setTvaachat(ModifierProduittvaAchat.getText().replace(',','.'));
        
        prodUpdate.setMarge(ModifierProduitMarge.getText().replace(',','.'));
        
        prodUpdate.setPrixventettc(ModifierProduitPrixVenteTTC.getText().replace(',','.'));
        prodUpdate.setPrixventeht(ModifierProduitPrixVenteHT.getText().replace(',','.'));
        prodUpdate.setTvavente(ModifierProduittvaVente.getText().replace(',','.'));
        
        prodUpdate.setQualiteString(ModifierProduitQualite.getText());
        
        prodUpdate.setPoids(ModifierProduitPoids.getText());
        prodUpdate.setCapacite(ModifierProduitCapacite.getText());
        prodUpdate.setDimensions(ModifierProduitDimensions.getText());
        prodUpdate.setVitesse(ModifierProduitVitesse.getText());
        prodUpdate.setPuissance(ModifierProduitPuissance.getText());
        prodUpdate.setCouleur(ModifierProduitCouleur.getValue().toString());
        prodUpdate.setDescription(ModifierProduitDescription.getText());
       
       return prodUpdate ;
    }
    

    
    
    
}
