package chatapp.Model;

import java.net.InetAddress;
import java.util.ArrayList;

/**
 * <p>
 * Classe representant La liste des utilisateurs actifs, stockée localement
 * </p>
 */
public class ListUtilisateurs {

    // On conserve dans cette liste tout les utilisateurs actuellement actifs
    private ArrayList<Utilisateur> actifUsers ;

    /**
     * Constructeur : initialise la liste 'actifUsers'
     */
    public ListUtilisateurs() {
        this.actifUsers = new ArrayList<>() ;
    }

    /**
     * Ajouter des utilisateurs actifs dans l'attribut liste 'actifUsers'
     * @param u on va rajouter cet utilisateur dans la liste
     */
    public void addList(Utilisateur u) {
        if((verifierUnicite(u.getPseudo()))) {
            this.actifUsers.add(u);
        }
    }

    /**
     * Recuperer un utilisateur a partir de son pseudo
     * @param pseudo Pseudo de l'utilisateur que l'on souhaite retrouver
     */
    public Utilisateur getPseudoList(String pseudo) {
        for(Utilisateur elem: this.actifUsers)
        {
            if (elem.getPseudo().equals(pseudo) ) {
                return elem ;
            }
        }
        return null ;
    }

    /**
     * Recuperer un utilisateur a partir de son addresse IP
     * @param ip @IP de l'utilisateur que l'on souhaite retrouver
     */
    public Utilisateur getIPList(InetAddress ip) throws Exception {
        for(Utilisateur elem: this.actifUsers)
        {
            if (elem.getIp().equals(ip) ) {
                return elem ;
            }
        }
        throw new Exception("No such user with this IP address") ;
    }

    /**
     * Supprimer de la liste des utilisateurs actifs 'actifUsers' un certain utilisateur
     * @param u on va supprimer cet utilisateur dans la liste
     */
    public void supprimerList(Utilisateur u) {
        boolean Sup = false ;
        for(Utilisateur elem: this.actifUsers)
        {
            if (elem.equals(u) ) {
                this.actifUsers.remove(elem);
                Sup = true ;
                this.afficherListeUtilisateurs();
            }
        }
        if (!Sup) {
            System.out.println("Tentative de retirer un objet non contenu dans la liste");
        }
    }

    /**
     * Modifier le pseudo d'un utilisateur dans la liste des utilisateurs actifs 'actifUsers'
     * @param ancien correspond au pseudo remplacer
     * @param nouveau correspond au nouveau pseudo
     */
    public void modifierList(String ancien , String nouveau) {
        for(Utilisateur elem: this.actifUsers)
        {
            if (ancien.equals( elem.getPseudo() ) ) {
                this.actifUsers.remove(elem);
                elem.setPseudo(nouveau);
                this.addList(elem);
            }
        }
        this.afficherListeUtilisateurs();
    }

    /**
     * Methode permettant de savoir si un utilisateur est contenu dans la liste 'actifUsers'
     * @param u on souhait savoir si cette utilisateur appartient a la liste
     * @return True si il appartient, false sinon
     */
    public Boolean appartient(Utilisateur u) {
        return this.actifUsers.contains(u);
    }


    /**
     * Verifie qu'aucun autre utilisateur ne possede le meme pseudo
     * @param pseudo on va supprimer cet utilisateur dans la liste
     * @return True si aucun utilisateur de la liste possede ce pseudo, false sinon
     */
    public Boolean verifierUnicite(String pseudo) {
        for(Utilisateur elem: this.actifUsers)
        {
            if (pseudo.equals( elem.getPseudo() ) ) {
                return false ;
            }
        }
        return true;
    }

    /**
     * Methode affichant la liste des utilisateurs actifs
     */
    public void afficherListeUtilisateurs() {
        System.out.println ("Liste des utilisateurs actifs : ");
        StringBuilder Utilisateur = new StringBuilder();
        for(Utilisateur elem: this.actifUsers)
        {
            System.out.println (elem.toString());
            Utilisateur.append(elem).append("\n");
        }
    }

    /**
     * Getter
     * @return La liste des utilisateurs actifs
     */
    public ArrayList<Utilisateur> getActifUsers(){
        return this.actifUsers;
    }
}
