package Controllers.Produit;

import Controllers.Categorie.AjouterCategorieController;
import Controllers.Dialog.ShowDialog;
import Controllers.Traitement.Adaptateur;
import Controllers.Traitement.ParametreSystem;
import Controllers.Traitement.contro;
import Models.Categorie.CategorieDB;
import Models.Produit.Produit;
import Models.Produit.ProduitDB;
import com.gluonhq.charm.glisten.control.ProgressBar;
import java.io.IOException;
import java.net.URL;
import java.util.ResourceBundle;
import javafx.animation.FadeTransition;
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.Initializable;
import javafx.scene.control.Button;
import javafx.scene.control.ColorPicker;
import javafx.scene.control.TextArea;
import javafx.scene.control.TextField;
import javafx.scene.input.KeyEvent;
import javafx.scene.layout.AnchorPane;
import javafx.scene.layout.GridPane;
import javafx.scene.paint.Color;
import javafx.scene.text.Font;
import javafx.scene.text.Text;
import javafx.util.Duration;
import org.controlsfx.control.textfield.TextFields;

/**
 * FXML Controller class
 * @author Maher Ben Tili
 */
public class AjouterProduitController implements Initializable {
    
    @FXML private ProgressBar ProgressBarAjouterProduit;
    
    //private AnchorPane   Content ;
    @FXML private AnchorPane   AnchorPaneAjouterprod ;
    @FXML private AnchorPane   AnchorPaneAjouterProduit ;
    
    @FXML private TextField    AjouterProduitReference;
    @FXML private TextField    AjouterProduitCodeBarre;
    @FXML private TextField    AjouterProduitdesignation  ;
    @FXML private TextField    AjouterProduitGarantie  ;
    @FXML private TextField    AjouterProduitMarque  ;
    
    @FXML private TextField    AjouterProduitPrixAchatTTC  ;
    @FXML private TextField    AjouterProduittvaAchat  ;
    @FXML private TextField    AjouterProduitPrixAchatHT  ;
    
    @FXML private TextField    AjouterProduitMarge  ;
    
    @FXML private TextField    AjouterProduitPrixVenteTTC ;
    @FXML private TextField    AjouterProduittvaVente ;
    @FXML private TextField    AjouterProduitPrixVenteHT ;
    
    @FXML private TextField    AjouterProduitPoids ;
    @FXML private TextField    AjouterProduitDimensions;
    @FXML private TextField    AjouterProduitVitesse;
    @FXML private TextField    AjouterProduitPuissance;
    @FXML private TextField    AjouterProduitCapacite;
    
    @FXML public TextField    AjouterProduitcategorie  ;
    @FXML private ColorPicker AjouterProduitCouleur  ;
    @FXML private TextArea    TextAreaDescription ;
    
    
    @FXML private Text ErreurReference ;
    @FXML private Text ErreurDesignation ;
    @FXML private Text ErreurPrixVenteHT;
    @FXML private Text ErreurtvaVente ;
    @FXML private Text ErreurPrixVenteTTC;
    
    @FXML private Text ErreurGarantie ;
    @FXML private Text Erreurcategorie ;
    @FXML private Text ErreurMarque ;
    @FXML private Text ErreurCodeBarre;
    @FXML private Text ErreurPrixAchatHT;
    @FXML private Text ErreurtvaAchat ;
    @FXML private Text ErreurPrixAchatTTC;
    
    @FXML private Text ErreurMarge;
    
    @FXML private Text TextCurrencySign;
    
    @FXML private GridPane GridPaneSuccessAddProd;
    @FXML private Button ButtonResetFormProduit; 
    @FXML private Text TextSuccessAddProd;
    
    private Service<Void> ThreadAjouterProduit;
    
    String address = " ";
    contro ctl= new contro() ;
    Produit prod = new Produit();
    ProduitDB dbproduit = new ProduitDB();
    CategorieDB dbcategorie = new CategorieDB();
    
    
    
    @Override
    public void initialize(URL url, ResourceBundle rb) {
       
        TextSuccessAddProd.setFont(Font.loadFont(getClass().getResourceAsStream("/Public/Fonts/Raleway-SemiBold.ttf"), 20));

        setCategorieFormData();
        
        TextCurrencySign.setText(ParametreSystem.CurrencySign);
        
        
        AjouterProduittvaAchat.setOnKeyReleased(new EventHandler<KeyEvent>() {
        @Override
        public void handle(KeyEvent ke){
            
            if(!ctl.isFloatNotnull(AjouterProduitPrixAchatHT.getText()) && !ctl.isFloatNotnull(AjouterProduittvaAchat.getText())){
                float prixachatht = Adaptateur.StringToFloat(AjouterProduitPrixAchatHT.getText());
                float tvavente = Adaptateur.StringToFloat(AjouterProduittvaAchat.getText());
                float prixachatttc =  prixachatht + (prixachatht*tvavente)/100 ;
                AjouterProduitPrixAchatTTC.setText(Adaptateur.ArrondFloatToString(prixachatttc));
            }
        }
        });
        
        AjouterProduitMarge.setOnKeyReleased(new EventHandler<KeyEvent>() {
        @Override
        public void handle(KeyEvent ke){
            if(!ctl.isFloatNotnull(AjouterProduitPrixAchatTTC.getText().replace(',','.')) && !ctl.isFloatNotnull(AjouterProduitMarge.getText().replace(',','.')) ){
                float marge = Adaptateur.StringToFloat(AjouterProduitMarge.getText());
                float prixachatttc = Adaptateur.StringToFloat(AjouterProduitPrixAchatTTC.getText());
                float prixventht = prixachatttc + (prixachatttc*marge)/100 ;
                AjouterProduitPrixVenteHT.setText(Adaptateur.ArrondFloatToString(prixventht));
            }
        }
        });
        
        AjouterProduittvaVente.setOnKeyReleased(new EventHandler<KeyEvent>() {
        @Override
        public void handle(KeyEvent ke){
            if(!ctl.isFloatNotnull(AjouterProduitPrixVenteHT.getText().replace(',','.')) && !ctl.isFloatNotnull(AjouterProduittvaVente.getText().replace(',','.'))){
                float prixventht = Adaptateur.StringToFloat(AjouterProduitPrixVenteHT.getText());
                float tvavente = Adaptateur.StringToFloat(AjouterProduittvaVente.getText());
                
                float prixventttc = prixventht + ((prixventht*tvavente)/100) ;
                //System.out.println("Prix H.T: "+prixventht*6+"  TVA: "+((prixventht*tvavente)/100)*6+"  PrixTTC"+prixventttc*6);
                AjouterProduitPrixVenteTTC.setText(Adaptateur.ArrondFloatToString(prixventttc));
            }
        }
        });
    }
    
    
    
    //ajouter un nouvelle catégorie
    @FXML
    private void AjouterCategorieButtonAction(ActionEvent event) throws IOException {
        final AjouterCategorieController AjouterCategorie = new AjouterCategorieController();
        AjouterCategorie.Show();
        AjouterCategorie.ButtonAjouterCategory.setOnAction(new EventHandler<ActionEvent>() {
            @Override 
            public void handle(ActionEvent e) {
                String NewCategory = AjouterCategorie.AjouterCategorieTraitement();
                AjouterProduitcategorie.setText(NewCategory);
            }
        });
    }
    
    
    @FXML
    private void AjouterProduitButtonAction(ActionEvent event) throws IOException {
        
        if( ctl.ContrNull(AjouterProduitReference,ErreurReference) && 
            ctl.ContrNull(AjouterProduitdesignation, ErreurDesignation)&& 
            ctl.ContrNull(AjouterProduitcategorie, Erreurcategorie)&&     
            ctl.ContrNull(AjouterProduitMarque, ErreurMarque)&& 
            ctl.ContrNumerique(AjouterProduitGarantie, ErreurGarantie)&&
            ctl.ContrReelNotNull(AjouterProduitPrixAchatHT, ErreurPrixAchatHT)&&
            ctl.ContrReelNotNull(AjouterProduittvaAchat, ErreurtvaAchat)&& 
            ctl.ContrReelNotNull(AjouterProduitPrixAchatTTC, ErreurPrixAchatTTC)&& 
            ctl.ContrReelNotNull(AjouterProduitMarge, ErreurMarge) &&
            ctl.ContrReelNotNull(AjouterProduitPrixVenteHT, ErreurPrixVenteHT)&&
            ctl.ContrReelNotNull(AjouterProduittvaVente, ErreurtvaVente)&&
            ctl.ContrReelNotNull(AjouterProduitPrixVenteTTC, ErreurPrixVenteTTC) && 
            ControleReferenceDB() && ControleCodeBarreDB()){
            
            if(!new CategorieDB().verifyCategorie(AjouterProduitcategorie.getText())){
                Erreurcategorie.setText("categorie n'existe pas");
                Erreurcategorie.setStyle("-fx-border-color:#f20606;");
            }else{
                this.getProduit();
                if(dbproduit.addProduit(prod)){   //l'insertion des données dont la Base des données et afficher le message du succés
                    
                    FadeTransition ft = new FadeTransition(Duration.millis(400), AnchorPaneAjouterProduit);
                    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) 
                        {
                            GridPaneSuccessAddProd.setVisible(true);
                            ButtonResetFormProduit.setOnAction(new EventHandler<ActionEvent>() {     //supprimer le message du suucés et reaficher les formulaires  
                            @Override
                            public void handle(ActionEvent event) {
                                GridPaneSuccessAddProd.setVisible(false);
                                FadeTransition ft = new FadeTransition(Duration.millis(400), AnchorPaneAjouterProduit);
                                ft.setFromValue(0.0);
                                ft.setToValue(1.0);
                                ft.play();
                                restechamp();
                                }
                            });
                        }
                    });
                }
                else{
                    ShowDialog SD = new ShowDialog();
                    SD.ShowAletDialog();
                }
            }
        }
    }
    
    private boolean ControleReferenceDB()
    {
        if(dbproduit.verifyReferenceProduit(AjouterProduitReference.getText()))
        {
            ErreurReference.setText("référence existe déja");
            AjouterProduitReference.setStyle("-fx-border-color:#f20606;");
            return false;
        }else{
            ErreurReference.setText("");
            AjouterProduitReference.setStyle(null);
            return true;
        }
    }
    
    private boolean ControleCodeBarreDB()
    {
        if(!ctl.isStringNull(AjouterProduitCodeBarre.getText()))
        {
            if(dbproduit.verifyCodeBarreProduit(AjouterProduitCodeBarre.getText()))
            {
                ErreurCodeBarre.setText("Code Barre existe déja");
                AjouterProduitCodeBarre.setStyle("-fx-border-color:#f20606;");
                return false;
            }else{
                ErreurCodeBarre.setText("");
                AjouterProduitCodeBarre.setStyle(null);
                return true;
            }
        }
        ErreurCodeBarre.setText("");
        AjouterProduitCodeBarre.setStyle(null);
        return true;
    }
    
    //récuperation des formulaire dans l'objet Produit
    private void getProduit()
    {
        prod.setReference(AjouterProduitReference.getText());
        prod.setCodebarre(AjouterProduitCodeBarre.getText());
        prod.setDesignation(AjouterProduitdesignation.getText());
        prod.setCategorie(AjouterProduitcategorie.getText());
        
        prod.setGarantieString(AjouterProduitGarantie.getText());
        prod.setMarque(AjouterProduitMarque.getText());
        
        prod.setPrixachatttc(AjouterProduitPrixAchatTTC.getText());
        prod.setPrixachatht(AjouterProduitPrixAchatHT.getText());
        prod.setTvaachat(AjouterProduittvaAchat.getText());
        
        prod.setMarge(AjouterProduitMarge.getText());
        
        prod.setPrixventettc(AjouterProduitPrixVenteTTC.getText());
        prod.setPrixventeht(AjouterProduitPrixVenteHT.getText());
        prod.setTvavente(AjouterProduittvaVente.getText());
        
        prod.setPoids(AjouterProduitPoids.getText());
        prod.setCapacite(AjouterProduitCapacite.getText());
        prod.setDimensions(AjouterProduitDimensions.getText());
        prod.setVitesse(AjouterProduitVitesse.getText());
        prod.setPuissance(AjouterProduitPuissance.getText());
        prod.setCouleur(AjouterProduitCouleur.getValue().toString());
        prod.setDescription(TextAreaDescription.getText());
        
    }
    
    
    private void restechamp()
    {
        AjouterProduitReference.setText("");
        AjouterProduitCodeBarre.setText("");
        AjouterProduitdesignation.setText("");
        AjouterProduitGarantie.setText("");
        AjouterProduitcategorie.setText("");
        AjouterProduittvaAchat.setText("");
        AjouterProduitPrixAchatHT.setText(""); 
        AjouterProduitPrixVenteHT.setText("");
        AjouterProduittvaVente.setText("");
        AjouterProduitGarantie.setText("");
        AjouterProduitMarque.setText("");
        AjouterProduitPoids.setText("");
        AjouterProduitPrixAchatTTC.setText("");
        AjouterProduitPrixVenteTTC.setText("");
        AjouterProduitMarge.setText("");
        AjouterProduitDimensions.setText("");
        AjouterProduitVitesse.setText("");
        AjouterProduitPuissance.setText("");
        AjouterProduitCapacite.setText("");
        AjouterProduitCouleur.setValue(Color.TRANSPARENT);  
        TextAreaDescription.setText(""); 
        
    }
    
    private void setCategorieFormData()
    {
        ProgressBarAjouterProduit.setVisible(true);
        
        ThreadAjouterProduit = new Service<Void>(){
            @Override
            protected Task<Void> createTask(){
                return new Task<Void>(){
                    @Override
                    protected Void call() throws Exception{
                        
                        TextFields.bindAutoCompletion(AjouterProduitcategorie, new CategorieDB().getListCategorie());
        
                        return null;
                    }
                };
            }
	};
        ThreadAjouterProduit.setOnSucceeded(new EventHandler<WorkerStateEvent>(){
            @Override
            public void handle(WorkerStateEvent event){
                ProgressBarAjouterProduit.setVisible(false);
            }
        });
        ThreadAjouterProduit.start();
    }
}
