package model;

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


public class LocalUser extends User{

	
	/*** ATTRIBUTS ***/
	private int portUDPsend;
	private int portUDPlistening;
	private ArrayList<RemoteUser> remoteUsersList = new ArrayList<RemoteUser>(); // listes des utilisateurs actifs
	private ArrayList<Chat> chats = new ArrayList<Chat>();
	
	/**
	 *  Constructor of LocalUser
	 * @parametres
	 * 	 	@param pseudo : String
	 * 		@param addIP : InetAddress
	 * 		@param portUDPsend : int => le numéro de port pour envoyé ces informations lors d'un changements ou d'une nouvelle connexion
	 * 		@param portUDPlistening : int => le numéro de port pour recevoir les informations des nouveaux utilisateurs ou les changements
	 * 		@param portTCP : int => le numéro de port pour commencer une nouvelle conversation
	 * @description
	 * <p>
	 * 		
	 * </p>
	 */
	public LocalUser(String pseudo,InetAddress addIP,int portUDPsend,int portUDPlistening,int portTCP){
		super(pseudo,addIP,portTCP);
		this.portUDPsend = portUDPsend;
		this.portUDPlistening = portUDPlistening;
	}

	/*** GETTERS ***/
	public int getPortUDPsend() {
		return portUDPsend;
	}
	public int getPortUDPlistening() {
		return portUDPlistening;
	}
	public ArrayList<RemoteUser> getRemoteUsersList() {
		return remoteUsersList;
	}
	public ArrayList<Chat> getChats() {
		return chats;
	}
	
	/*** SETTERS ***/
	public void setPortUDPsend(int portUDPsend) {
		this.portUDPsend = portUDPsend;
	}
	public void setPortUDPlistening(int portUDPlistening) {
		this.portUDPlistening = portUDPlistening;
	}

	
	
	/**
	 * @parameters
	 * 		@param remoteUserIP : InetAddress => l'adresse IP de l'utilisateur distant
	 * 		@param remoteUserPortTCP : int => le numéro de port TCP d'écoute de l'utilisateur distant
	 * 		@param remoteUserPseudo : String => le pseudo de l'utilisateur distant
	 * <p>
	 * 		Ajout ou mise à jour l'utilisateur distant dans notre liste d'utilisateur distant
	 * </p>
	 */
	public void addRemoteUser(InetAddress remoteUserIP, int remoteUserPortTCP,String remoteUserPseudo) {
		RemoteUser tmpRemoteUser = new RemoteUser(remoteUserPseudo,remoteUserIP,remoteUserPortTCP);
		int index = this.remoteUsersList.indexOf(tmpRemoteUser);
		if(index!=-1) {
			System.out.println("("+this.pseudo+") - "+"MAJ, IP(port) of user : "+remoteUserPseudo+" => "+remoteUserIP+"("+remoteUserPortTCP+")");
			this.remoteUsersList.set(index,tmpRemoteUser);
		}
		else {
			System.out.println("("+this.pseudo+") - "+"Add new user IP(port) of user : "+remoteUserPseudo+" => "+remoteUserIP+"("+remoteUserPortTCP+")");
			this.remoteUsersList.add(tmpRemoteUser);
		}
	}
	
	public Chat addChats(RemoteUser rm) {
		Chat newChat= new Chat(rm);

		if(getChatIndexOf(rm)==-1) {
			this.getChats().add(newChat);
		}/*
		else {
			System.out.println("pb add chat, déjà un chat avec cet rm user");
		}*/
		
		return newChat;
	}
	

	public int getChatIndexOf(RemoteUser rm) {
		int index=0;
		
		Boolean found = false;
		while(index<this.chats.size() && !found) {
			
			found = (this.chats.get(index).getRemoteUser() == rm);
			index++;
		}
		if(found) {
			return index-1;
		}
		else {
			return -1;
		}
	}
	
	public int getActiveUserIndexOf(RemoteUser rm) {
		int index = 0;
		Boolean found = false;
		while(index<this.remoteUsersList.size() && !found) { 
			found = (this.remoteUsersList.get(index) == rm);
			index++;
		}
		if(found) {
			return index-1;
		}
		else {
			return -1;
		}
	}
	
	public void closeChat(Chat c) {
		this.chats.get(getChatIndexOf(c.getRemoteUser())).close();
		this.chats.remove(c);
	}
	
	public void closeAllChat() {
		int length =this.chats.size();
		for(int i=0;i<length;i++) {
			this.closeChat(this.chats.get(0));
		}
	}
}
