package Controllers.Fournisseur;

import Controllers.Traitement.contro;
import Models.Fournisseur.Fournisseur;
import Models.Fournisseur.FournisseurContactDB;
import Models.Fournisseur.FournisseurContactList;
import Models.Fournisseur.FournisseurDB;
import java.io.IOException;
import java.net.URL;
import java.util.ResourceBundle;
import org.apache.log4j.Logger;
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.fxml.Initializable;
import javafx.scene.Node;
import javafx.scene.control.Button;
import javafx.scene.control.ChoiceBox;
import javafx.scene.control.TableColumn;
import javafx.scene.control.TableView;
import javafx.scene.control.TextField;
import javafx.scene.control.cell.PropertyValueFactory;
import javafx.scene.image.Image;
import javafx.scene.image.ImageView;
import javafx.scene.input.MouseEvent;
import javafx.scene.layout.AnchorPane;
import javafx.scene.text.Text;

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

    Logger logger = Logger.getLogger(FournisseurGererController.class.getName());
    
    @FXML public AnchorPane PanePrincipalFournisseur;
    @FXML public AnchorPane AnchorPaneLoadingFournisseur;
    
    @FXML public Text TitreSecondaire;
    
    @FXML private AnchorPane PaneFournisseurAjouter;
    
    @FXML public Button AjouterContactFrsButton;
    @FXML public Button ButtonGererAjouterFrs;
    @FXML public Button ButtonGererModifierFrs;
    
    @FXML public TextField TextFieldNomFrs ;
    @FXML public TextField TextFieldSpecialiteFrs ;
    @FXML public TextField TextFieldTele1Frs ;
    @FXML public TextField TextFieldTele2Frs ;
    @FXML public TextField TextFieldFaxFrs ;
    @FXML public TextField TextFieldMailFrs ;
    @FXML public TextField TextFieldSiteWebFrs ;
    @FXML public TextField TextFieldAdresseFrs ;
    @FXML public ChoiceBox ChoiceBoxFormes;
    
    
    @FXML public Text TextNomFrs ;
    @FXML public Text TextSpecialiteFrs ;
    @FXML public Text TextTele1Frs ;
    @FXML public Text TextTele2Frs ;
    @FXML public Text TextFaxFrs ;
    @FXML public Text TextMailFrs ;
    @FXML public Text TextSiteWebFrs ;
    @FXML public Text TextAdresseFrs ;
    
    @FXML public TableView<FournisseurContactList> TableViewFournisseurContactFrs;
    @FXML public TableColumn<FournisseurContactList ,String> TabColCodeContactFrs;
    @FXML public TableColumn<FournisseurContactList ,String> TabColNomContactFrs;
    @FXML public TableColumn<FournisseurContactList ,String> TabColPrenomContactFrs;
    @FXML public TableColumn<FournisseurContactList ,String> TabColTele1ContactFrs;
    @FXML public TableColumn<FournisseurContactList ,String> TabColTele2ContactFrs;
    @FXML public TableColumn<FournisseurContactList ,String> TabColEmailContactFrs;
    
    @FXML public TextField TextFieldNomContactFrs ;
    @FXML public TextField TextFieldPrenomContactFrs ;
    @FXML public TextField TextFieldTele1ContactFrs ;
    @FXML public TextField TextFieldTele2ContactFrs ;
    @FXML public TextField TextFieldMailContactFrs ;
    
    @FXML public Text TextNomCltContactFrs ;
    @FXML public Text TextPrenomCltContactFrs ;
    @FXML public Text TextTele1CltContactFrs ;
    @FXML public Text TextTele2CltContactFrs ;
    @FXML public Text TextMailCltContactFrs ;
    
    public ObservableList<FournisseurContactList> ObservableListContactFrs = FXCollections.observableArrayList();
    
    private Service<Void> ThreadFournisseurGerer;
    
    contro Controle = new contro();
    
    Fournisseur Frs;
    
    /**
     * Initializes the controller class.
     */
    @Override
    public void initialize(URL url, ResourceBundle rb) {
        
        ChoiceBoxFormes.setItems(FXCollections.observableArrayList("SARL","EURL","SAS","SASU","SA","SNC"));
        ChoiceBoxFormes.getSelectionModel().selectFirst();
        
        TabColCodeContactFrs.setStyle( "-fx-alignment: CENTER; -fx-font-weight:bold; -fx-font-size: 10pt;");
        TabColCodeContactFrs.getStyleClass().add("Center");
        TabColCodeContactFrs.setCellValueFactory(new PropertyValueFactory<FournisseurContactList, String>("Code"));
        
        TabColNomContactFrs.setStyle( "-fx-alignment: CENTER; -fx-font-weight:bold; -fx-font-size: 10pt;");
        TabColNomContactFrs.getStyleClass().add("Center");
        TabColNomContactFrs.setCellValueFactory(new PropertyValueFactory<FournisseurContactList, String>("Nom"));
        
        
        TabColPrenomContactFrs.setStyle( "-fx-alignment: CENTER; -fx-font-weight:bold; -fx-font-size: 10pt;");
        TabColPrenomContactFrs.getStyleClass().add("Center");
        TabColPrenomContactFrs.setCellValueFactory(new PropertyValueFactory<FournisseurContactList, String>("Prenom"));
        
        
        TabColTele1ContactFrs.setStyle( "-fx-alignment: CENTER; -fx-font-weight:bold; -fx-font-size: 10pt;");
        TabColTele1ContactFrs.getStyleClass().add("Center");
        TabColTele1ContactFrs.setCellValueFactory(new PropertyValueFactory<FournisseurContactList, String>("Tele1"));
        
        TabColTele2ContactFrs.setStyle( "-fx-alignment: CENTER; -fx-font-weight:bold; -fx-font-size: 10pt;");
        TabColTele2ContactFrs.getStyleClass().add("Center");
        TabColTele2ContactFrs.setCellValueFactory(new PropertyValueFactory<FournisseurContactList, String>("Tele2"));
        
        
        TabColEmailContactFrs.setStyle( "-fx-alignment: CENTER; -fx-font-weight:bold; -fx-font-size: 10pt;");
        TabColEmailContactFrs.getStyleClass().add("Center");
        TabColEmailContactFrs.setCellValueFactory(new PropertyValueFactory<FournisseurContactList, String>("Mail"));
        
        
        AjouterContactFrsButton.getStyleClass().add("btn-primary");
        Image coffeeImage = new Image(getClass().getResourceAsStream("/Public/icon/iconaffecter.png"));
        ImageView buttonGraphic = new ImageView();
        buttonGraphic.setImage(coffeeImage);
        AjouterContactFrsButton.setGraphic(buttonGraphic);
        
        
        //Bouton Ajouter
        ButtonGererAjouterFrs.setOnAction(new EventHandler<ActionEvent>() {
            @Override 
            public void handle(ActionEvent e) {
                if( Controle.ContrNull(TextFieldNomFrs, TextNomFrs) &&
                    Controle.ContrNull(TextFieldSpecialiteFrs, TextSpecialiteFrs) &&
                    Controle.ContrNumeriqueNotnull(TextFieldTele1Frs, TextTele1Frs) &&
                    Controle.ContrNumerique(TextFieldTele2Frs, TextTele2Frs) &&
                    Controle.ContrNumerique(TextFieldFaxFrs, TextFaxFrs) &&
                    Controle.ContrNull(TextFieldAdresseFrs, TextAdresseFrs)
                    ){
                        

                        Fournisseur fournisseur = SetDataFournissuer();
                        FournisseurDB FrsDB = new FournisseurDB();   
                        fournisseur = FrsDB.SetFournisseurDB(fournisseur);

                        if(fournisseur.getCode()!= null){
                            PaneFournisseurAjouter.getChildren().clear();
                            try {
                                PaneFournisseurAjouter.getChildren().add((Node) FXMLLoader.load(getClass().getResource("/Views/Fournisseur/FournisseurGestion.fxml")));
                            } catch (IOException ex) {
                                logger.error("FournisseurGererController  : FournisseurGestion.fxml :" + ex.getMessage());
                            }
                        }

                }
            }
        });
            
    }

    
    @FXML
    public void clickItem(MouseEvent event)
    {
        if (event.getClickCount() == 2) //Checking double click
        {
            FournisseurContactList FrsContact = TableViewFournisseurContactFrs.getSelectionModel().getSelectedItem();
            TextFieldNomContactFrs.setText(FrsContact.getNom());
            TextFieldPrenomContactFrs.setText(FrsContact.getPrenom());
            TextFieldTele1ContactFrs.setText(FrsContact.getTele1());
            TextFieldTele2ContactFrs.setText(FrsContact.getTele2());
            TextFieldMailContactFrs.setText(FrsContact.getMail());
    
        }
    }
    
    public Fournisseur SetDataFournissuer(){
        Fournisseur fournisseur=  new Fournisseur();
        fournisseur.setNom(TextFieldNomFrs.getText());
        fournisseur.setSpecialite(TextFieldSpecialiteFrs.getText());
        fournisseur.setFormes(ChoiceBoxFormes.getValue().toString());
        fournisseur.setTele1(TextFieldTele1Frs.getText());
        fournisseur.setTele2(TextFieldTele2Frs.getText());
        fournisseur.setFax(TextFieldFaxFrs.getText());
        fournisseur.setMail(TextFieldMailFrs.getText());
        fournisseur.setSiteWeb(TextFieldSiteWebFrs.getText());
        fournisseur.setAdresse(TextFieldAdresseFrs.getText());
        fournisseur.setContactFrs(ObservableListContactFrs);
        return fournisseur;
    }
    
    @FXML
    private void AjouterContactFrsButtonAction(ActionEvent event) throws IOException {
        
        if( Controle.ContrNull(TextFieldNomContactFrs, TextNomCltContactFrs) &&
            Controle.ContrNull(TextFieldPrenomContactFrs, TextPrenomCltContactFrs) &&
            Controle.ContrNumeriqueNotnull(TextFieldTele1ContactFrs, TextTele1CltContactFrs) &&
            Controle.ContrNumerique(TextFieldTele2ContactFrs, TextTele2CltContactFrs) ){
            int indise = 0;
            boolean notexiste = true;
            while(indise<ObservableListContactFrs.size() && notexiste){
                if( (TextFieldNomContactFrs.getText().equals(ObservableListContactFrs.get(indise).getNom())) && (TextFieldPrenomContactFrs.getText().equals(ObservableListContactFrs.get(indise).getPrenom()) ) )
                {
                    ObservableListContactFrs.get(indise).SetTele1(TextFieldTele1ContactFrs.getText());
                    ObservableListContactFrs.get(indise).SetTele2(TextFieldTele2ContactFrs.getText());
                    ObservableListContactFrs.get(indise).SetMail(TextFieldMailContactFrs.getText());
                    notexiste = false;
                }
                indise++;
            }
            
            if(notexiste){
                ObservableListContactFrs.add(new FournisseurContactList("", TextFieldNomContactFrs.getText(), TextFieldPrenomContactFrs.getText(), TextFieldTele1ContactFrs.getText(), TextFieldTele2ContactFrs.getText(), TextFieldMailContactFrs.getText()));
            }
            
            TableViewFournisseurContactFrs.setItems(ObservableListContactFrs);
            TableViewFournisseurContactFrs.refresh();
        }
    }
    
    
    
    
    
    
    public void SetDataFournissuer(final String CodeFrs){
        PanePrincipalFournisseur.setVisible(false);
        AnchorPaneLoadingFournisseur.setVisible(true);
        TitreSecondaire.setText("Fournisseur / Modifier");
        ButtonGererModifierFrs.setVisible(true);
        ButtonGererAjouterFrs.setVisible(false);
        
        ThreadFournisseurGerer = new Service<Void>(){
            @Override
            protected Task<Void> createTask(){
                return new Task<Void>(){
                    @Override
                    protected Void call() throws Exception{
                        
                        Frs = new FournisseurDB().GetFournisseurDB(CodeFrs);
                        
                        return null;
                    }
                };
            }
	};
        ThreadFournisseurGerer.setOnSucceeded(new EventHandler<WorkerStateEvent>(){
            @Override
            public void handle(WorkerStateEvent event){
                ObservableListContactFrs = Frs.getContactFrs();
                TableViewFournisseurContactFrs.setItems(Frs.getContactFrs());
                
                TextFieldNomFrs.setText(Frs.getNom());
                TextFieldSpecialiteFrs.setText(Frs.getSpecialite()) ;
                TextFieldTele1Frs.setText(Frs.getTele1()) ;
                TextFieldTele2Frs.setText(Frs.getTele2()) ;
                TextFieldFaxFrs.setText(Frs.getFax()) ;
                TextFieldMailFrs.setText(Frs.getMail()) ;
                TextFieldSiteWebFrs.setText(Frs.getSiteWeb()) ;
                TextFieldAdresseFrs.setText(Frs.getAdresse()) ;
                
                if(Frs.getFormes() != null){
                    if(Frs.getFormes().equals("SARL")){
                        ChoiceBoxFormes.getSelectionModel().select(0);
                    }else if(Frs.getFormes().equals("EURL")){
                        ChoiceBoxFormes.getSelectionModel().select(1);
                    }else if(Frs.getFormes().equals("SAS")){
                        ChoiceBoxFormes.getSelectionModel().select(2);
                    }else if(Frs.getFormes().equals("SASU")){
                        ChoiceBoxFormes.getSelectionModel().select(3);
                    }else if(Frs.getFormes().equals("SA")){
                        ChoiceBoxFormes.getSelectionModel().select(4);
                    }else if(Frs.getFormes().equals("SNC")){
                        ChoiceBoxFormes.getSelectionModel().select(5);
                    }
                }
                
                PanePrincipalFournisseur.setVisible(true);
                AnchorPaneLoadingFournisseur.setVisible(false);
            
            }
        });
        ThreadFournisseurGerer.start();
        
        
        ButtonGererModifierFrs.setOnAction(new EventHandler<ActionEvent>() {
            
            @Override 
            public void handle(ActionEvent e) {
                
                if( Controle.ContrNull(TextFieldNomFrs, TextNomFrs) &&
                    Controle.ContrNull(TextFieldSpecialiteFrs, TextSpecialiteFrs) &&
                    Controle.ContrNumeriqueNotnull(TextFieldTele1Frs, TextTele1Frs) &&
                    Controle.ContrNumerique(TextFieldTele2Frs, TextTele2Frs) &&
                    Controle.ContrNumerique(TextFieldFaxFrs, TextFaxFrs) &&
                    Controle.ContrNull(TextFieldAdresseFrs, TextAdresseFrs)
                    ){
                    Fournisseur fournisseur = SetDataFournissuer();
                    fournisseur.setCode(CodeFrs);
                    FournisseurDB FrourDB= new FournisseurDB();
                    boolean ResultUpdate = FrourDB.UpdFournisseurDB(fournisseur);
                    if(ResultUpdate){
                        FournisseurContactDB FrsContactDB= new FournisseurContactDB();
                        ObservableList<FournisseurContactList> ObservableNewListContactFrs = FXCollections.observableArrayList();
                        for(FournisseurContactList ContactList : ObservableListContactFrs){
                            if(ContactList.getCode().length()>0){
                               FrsContactDB.UpdListFournisseurContact(ContactList.getCode(), ContactList.getNom(), ContactList.getPrenom(), ContactList.getTele1(), ContactList.getTele2(), ContactList.getMail());
                            }else{
                                ObservableNewListContactFrs.add(ContactList);
                            }
                        }
                        if(ObservableNewListContactFrs.size()>0){
                            FrsContactDB.SetListFournisseurContact(ObservableNewListContactFrs, CodeFrs);
                            PaneFournisseurAjouter.getChildren().clear();
                        }
                        try {
                            PaneFournisseurAjouter.getChildren().add((Node) FXMLLoader.load(getClass().getResource("/Views/Fournisseur/FournisseurGestion.fxml")));
                        } catch (IOException ex) {
                            logger.error("FournisseurGererController  : FournisseurGestion.fxml :" + ex.getMessage());
                        }
                    }
                }
            }
        });
    }
    
    
}
