package chatapp.View;


import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.net.URL;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.ResourceBundle;

import chatapp.Controller.ChatApp;
import chatapp.Model.MessageHorodate;
import chatapp.Model.Utilisateur;
import chatapp.Protocol.SessionClavardage;
import javafx.application.Platform;
import javafx.event.ActionEvent;
import javafx.fxml.FXML;
import javafx.fxml.Initializable;
import javafx.scene.control.Button;
import javafx.scene.control.TextArea;
import javafx.scene.control.TextField;
import javafx.scene.text.Text;
import javafx.stage.Stage;

/**
 * <p>
 *     Classe representant l'interface graphique permettant de clavarder avec un utilisateur.
 * </p>
 */
public class Clavardage implements Initializable, PropertyChangeListener {
    @FXML //fx:id="plusButton"
    public Button plusButton;

    @FXML // ResourceBundle that was given to the FXMLLoader
    private ResourceBundle resources;

    @FXML // URL location of the FXML file that was given to the FXMLLoader
    private URL location;

    @FXML // fx:id="AEnvoyer"
    private TextField AEnvoyer; // Value injected by FXMLLoader

    @FXML // fx:id="EnvoyerButton"
    private Button EnvoyerButton; // Value injected by FXMLLoader

    @FXML // fx:id="pseudonyme1"
    private Text pseudonyme1; // Value injected by FXMLLoader

    @FXML // fx:id="ChatText"
    private TextArea ChatText; // Value injected by FXMLLoader

    @FXML // fx:id="MenuButton"

    private Utilisateur u2;
    private SessionClavardage session;
    private String nomTable;
    @FXML
    /**
     * <p>Handler gerant l'envoi du message contenu dans le TextField AEnvoyer et sur pression du bouton EnvoyerButton</p>
     * @param event L'utilisateur vient d'appuyer sur le bouton Envoyer
     */
    void envoyerMessage(ActionEvent event) {
        String msg = AEnvoyer.getText();
        AEnvoyer.clear();
        if(!msg.equals("")) {
            session.envoiMsg(msg);
            Date d = new Date();
            DateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss:0");
            msg = "Moi (" + format.format(d).toString() + ") : " + msg + "\n";
            ChatText.appendText(msg);

        }
    }


    /**
     * Setter : Session
     * @param session La session a associer a la classe
     */
    public void setSession(SessionClavardage session) {
        this.session = session;
        this.session.addPropertyChangeListener(this);
        this.u2=session.getU2();
        this.pseudonyme1.setText(u2.getPseudo());
    }

    /**
     * <p>Handler des differents evenements auxquels s'est abonne le PropertyChangeListener
     * <br> La classe est informee lorsque la session recoit un message ou lorsque la session se termine </p>
     * @param evt L'evenement informe par le pcs
     */
    @Override
    public void propertyChange(PropertyChangeEvent evt) {
        switch (evt.getPropertyName()){
            case "MessageRecu" :
                MessageHorodate msgh = session.getDernierMsg();
                DateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss:0");
                Date d = new Date();
                String msg = u2.getPseudo();
                msg += " ("+ format.format(d).toString() +") ";
                msg+=": "+msgh.getMessage();
                ChatText.appendText(msg);
                break;
            case "FinDeLaSession" :
                this.session.arretSession();
                Platform.runLater(new Runnable() {
                    @Override
                    public void run() {
                        Stage stage = (Stage) AEnvoyer.getScene().getWindow();
                        stage.close();
                    }
                });
        }

    }

    /**
     * Getter : Session
     * @return La session de Clavardage
     */
    public SessionClavardage getSession(){
        return session;
    }

    /**
     * Permet d'initialiser les differents parametres de la classe
     * @param location
     * @param resources
     */
    @Override
    public void initialize(URL location, ResourceBundle resources) {
        EnvoyerButton.setDefaultButton(true);
        this.ChatText.setEditable(false);
    }

    /**
     * <p> Permet de recupérer plus de messages stoces dans la database en appuyant sur le bouton plusButton</p>
     * @param actionEvent L'utilisateur a appuye sur le bouton plus pour obtenir tout l'utilisateur
     */
    public void ajouterMessagesHistorique(ActionEvent actionEvent) {
        //this.nomTable = this.session.getApp().getDb().getNomTable(u2,this.session.getApp().getMe());
        //String historique = this.session.getApp().getDb().recupNMsg(session.getApp().getMe().getId(),this.u2.getId(), this.session.getApp().getDb().tailleBDD(nomTable));
        ChatText.clear();
        //ChatText.insertText(0,historique);
    }
}