package chatapp.Model;

import java.io.Serializable;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;

/**
 * <p>
 * Classe représentant les messages envoyés en TCP lors d'une session de clavardage.
 * <br> Un message Horodaté est composé :
 * <br> - d'un destintaire,
 * <br> - d'une source,
 * <br> - d'un message,
 * <br> - d'une date d'envoi.
 * </p>
 */
public class MessageHorodate implements Serializable {
    private Utilisateur destinataire ;
    private Utilisateur source ;
    private Date dateHorodatage ;
    private int type; // 0 = debut de la communication, 1= message de communication, 2 = fin de la communicataion
    private String Message;

    /**
     * <p>
     * Constructeur , le message va etre horodaté
     * @param destinataire - Destinataire du message
     * @param source - Source du message
     * @param Message - Message envoyé
     * @param type - Le type du message
     * </p>
     */
    public MessageHorodate(Utilisateur destinataire, Utilisateur source, String Message, int type) {
        this.setDestinataire(destinataire) ;
        this.setSource(source) ;
        this.setMessage(Message) ;
        this.setDateHorodatage(new Date());
        this.type = type;
    }

    /**
     * Setter: Date d'horodatage
     * <br> On modifie le date d'horodatage
     * @param d  La nouvelle date d'horodatage
     */
    public void setDate(Date d) {
        this.setDateHorodatage(d);
    }

    /**
     * <p>
     * Permet de créer une représentation string du message
     * @return Les différents attributs de la classe sous forme de string
     * </p>
     */
    @Override
    public String toString() {
        String Msg = "";
        Msg += ("Destinataire::" + this.getDestinataire() + "\n") ;
        Msg += ("Source::" + this.getSource()+ "\n") ;
        Msg += ("Type::"+ this.type+ "\n");
        Msg += ("Date::" + this.dateToString() + "\n") ;
        Msg += ("Message::" + this.getMessage() + "\n" );
        return Msg ;
    }

    /**
     * <p>
     * Permet de créer une représentation string de la date d'horodatage
     * @return La date d'horodatage du message en format yyyy/MM/dd HH:mm:ss
     * </p>
     */
    public String dateToString() {
        DateFormat format = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
        return format.format(this.getDateHorodatage());
    }


    /**
     * <p>
     * Permet de re créer un message horodaté à partir d'un string
     * @param s Le message permettant de re créer un msg horodaté
     * @return un messageHorodate
     * </p>
     */
    public static MessageHorodate stringToMessageHorodate(String s) {
        String[] mots = s.split("\n");
        Utilisateur destinataire = Utilisateur.stringToUtilisateur(mots[0].split("::")[1]);
        Utilisateur source = Utilisateur.stringToUtilisateur(mots[1].split("::")[1]);
        int type = Integer.parseInt(mots[2].split("::")[1]);
        String payload = "";
        for(int i=4; i< mots.length; i++) {
            if(mots[i].startsWith("Message::")) {
                mots[i]=mots[i].split("::")[1];
            }
            payload += mots[i]+"\n";
        }
        return new MessageHorodate(destinataire, source, payload, type);
    }

    /**
     * Getter: Utilisateur Source
     * @return Utilisateur a l'origine du message
     */
    public Utilisateur getSource() {
        return source;
    }

    /**
     * Setter: Utilisateur Source
     * <br> On modifie l'utilisateur source
     * @param source Le nouvel utilisateur source
     */
    public void setSource(Utilisateur source) {
        this.source = source;
    }

    /**
     * Getter: Utilisateur Destinataire
     * @return Utilisateur recevant le message
     */
    public Utilisateur getDestinataire() {
        return destinataire;
    }

    /**
     * Setter: Utilisateur Destinataire
     * <br> On modifie l'utilisateur Destinataire
     * @param destinataire Le nouveau destinataire
     */
    public void setDestinataire(Utilisateur destinataire) {
        this.destinataire = destinataire;
    }

    /**
     * Getter: Message envoye
     * @return Le message envoye
     */
    public String getMessage() {
        return Message;
    }

    /**
     * Setter: Message envoye
     * <br> On modifie le message envoyé
     * @param message Nouveau message
     */
    public void setMessage(String message) {
        Message = message;
    }

    /**
     * Getter: 'Type' du message
     * @return On recupere le Type du message
     */
    public int getType() {
        return type;
    }
    /**
     * Setter: 'Type' du message horodate
     * <br> On modifie l'integer 'Type'
     * @param Type Nouveau type
     */
    public void setType(int Type) {
        this.type = type;
    }

    /**
     * Getter: Date d'horodatage
     * @return On recupere le date
     */
    public Date getDateHorodatage() {
        return dateHorodatage;
    }

    /**
     * Setter: Date d'horodatage
     * <br> On modifie le date.
     * @param dateHorodatage Nouvelle date d'horodatage
     */
    public void setDateHorodatage(Date dateHorodatage) {
        this.dateHorodatage = dateHorodatage;
    }

}
