package chatapp.Model;


import java.net.InetAddress;
import java.net.UnknownHostException;

/**
 * <p>
 * Classe representant un Utilisateur.
 * <br> Un Utilisateur est associé avec :
 * <br> - un pseudo,
 * <br> - un numéro de port,
 * <br> - une addresse IP
 * <br> - un ID.
 * </p>
 */
public class Utilisateur {

    private String pseudo ;
    private Integer port;
    private final InetAddress ip ;
    private final String id ;

    Integer TAILLE_MAX = 5;
    /**
     * Constructeur : Utilisateur
     * @param pseudo Le pseudo associé
     * @param port Le port
     * @param ip L'adresse IP
     */
    public Utilisateur(String pseudo,Integer port, InetAddress ip ){
        this.setPseudo(pseudo) ;
        this.setPort(port);
        this.ip = ip ;
        String aux= ip.getHostName() ;
        if(aux.length() > TAILLE_MAX)
            aux = aux.substring(0, TAILLE_MAX);
        this.id = aux ;
    }

    /**
     * Getter Pseudo
     * @return Le pseudo de l'utilisateur
     */
    public String getPseudo() {
        return pseudo;
    }

    /**
     * Setter Pseudo
     * @param pseudo Le nouveau pseudo que l'on souhaite
     */
    public void setPseudo(String pseudo) {
        this.pseudo = pseudo;
    }

    /**
     * Getter Port
     * @return Le numéro de port de l'utilisateur
     */
    public Integer getPort() {
        return port;
    }

    /**
     * Setter Port
     * @param port Le nouveau numéro de port
     */
    public void setPort(Integer port) {
        this.port = port;
    }

    /**
     * Getter IP
     * @return L'adresse IP de l'utilisateur
     */
    public InetAddress getIp() {
        return ip;
    }

    /**
     * Getter ID
     * @return L'ID de l'utilisateur
     */
    public String getId() {
        return id;
    }

    /**
     * Méthode permettant de convertir un objet Utilisateur en String
     * <br> Format du string :
     * <br> pseudo ___ | port ___ | ip ___ | id ___ | ( '___' sont à remplacer par les valeurs réels)
     * @return L'utilisateur sous forme de String
     */
    @Override
    public String toString(){
        String s = "";
        s+="pseudo " + this.pseudo + " | ";
        s+="port " + (this.port).toString() + " | ";
        s+="ip " + (this.ip).toString() + " | ";
        s+="id " + (this.id).toString() + " | ";
        return s;
    }

    /**
     * Méthode permettant de convertir un string en Utilisateur
     * @param s Le paramètre String a transformé
     * @return Un utilisateur
     */
    public static Utilisateur stringToUtilisateur(String s) {
        String name;
        Integer port = 0;
        String ip = "" ;
        String id = "";
        String mots[] = s.split(" ");
        name=mots[1];
        port=Integer.parseInt(mots[4]);
        ip=mots[7];
        id=mots[10];
        Utilisateur user = null;
        try {
            user = new Utilisateur(name,port,InetAddress.getByName(ip.split("/")[1]));
        } catch (UnknownHostException e) {
            e.printStackTrace();
        }
        return user;
    }

    /**
     * Méthode permettant de comparer deux utilisateurs entre eux grace à leur ID.
     * @param u L'utilisateur avec lequel on veut être comparer.
     * @return True si ils ont le même ID, False sinon.
     */
    public Boolean equals(Utilisateur u) {
        return this.getId().equals( u.getId() ) ;
    }

}
