/**Permet de créer une extrémité. 
 *@author Julien VAN DEN BOSSCHE / Benoît MOULIN   cmoi__at__julienvdb__dot__com / bmoulin@etu.info.unicaen.fr
 *@param numero le numero de l'extrémité
 *@param adressesX25 les clients X25 qui arrivent sur l'extrémité
 *@param numeroTrameRecu le nombre de trame recue, et numéro de la trame attendue modulo 8
 *@param numeroTrameEnvoye le nombre de trame envoyée modulo 8
 *@param nbTrameSansAcq le nombre de trame envoyées sans acquittements
 */

import java.io.*;
public class Extremite{
    int numero;
    AdresseX25[] adressesX25;
    int numeroTrameRecu = 0;
    int numeroTrameEnvoye = 0;
    int nbTrameSansAcq = 0;

    /**Permet de créer une extrémité. 
     *@param numero le numero de l'extrémité
     *@param adressesX25 les clients X25 qui arrivent sur l'extrémité
     */
    public Extremite(int numero, AdresseX25[] adresses){
	this.numero = numero;
	this.adressesX25 = adresses;
	numeroTrameRecu = 0;
	numeroTrameEnvoye = 0;
    }

    /**Permet d'encapsuler un paquet X25. 
     *@param paquet le paquet à encpasuler
     *@param flagAcq si true bit pf à 1 sinon à 0
     */
    public TrameHDLC encapsule(PaquetX25 paquet, boolean flagAcq){
	TrameHDLC trameAEnvoyer;
	Extremite e = paquet.getExtremite();
	Voie v = paquet.getVL();
	String data = paquet.getDonnees();
	
	if(paquet.getType()==0){
	    if(flagAcq){
	       trameAEnvoyer = new TrameHDLC(e, (""+numeroTrameEnvoye), (""+1), (""+numeroTrameRecu));
	    }
	    else{
		trameAEnvoyer = new TrameHDLC(e, (""+numeroTrameEnvoye), (""+0), (""+numeroTrameRecu));
	    }
	}
	//Etablissement circuit virtuel
	if(paquet.getType()==1){
	    AdresseX25 adr1 = paquet.getAdresseEmetteur();
	    AdresseX25 adr2 = paquet.getAdresseRecepteur();
	    if(flagAcq){
		trameAEnvoyer = new TrameHDLC(e, (""+numeroTrameEnvoye), (""+1), (""+numeroTrameRecu), adr1, adr2, v, data);
	    }
	    else{
		trameAEnvoyer = new TrameHDLC(e, (""+numeroTrameEnvoye), (""+0), (""+numeroTrameRecu), adr1, adr2, v, data);
	    }
	}
	//envoi de données ou DL
	else{
	    if(flagAcq){
		trameAEnvoyer = new TrameHDLC(e, (""+numeroTrameEnvoye), (""+1), (""+numeroTrameRecu), v, data);   
	    }
	    else{
		trameAEnvoyer = new TrameHDLC(e, (""+numeroTrameEnvoye), (""+0), (""+numeroTrameRecu), v, data); 
	    }	  
	}
	return trameAEnvoyer;
    }

    /**Permet d'encapsuler un paquet X25. 
     *@param destinataire l'extrémité qui va recevoir le paquet
     *@param t la trame HDLC à envoyer
     */
    public void envoiEncapsulation(Extremite destinataire, TrameHDLC t){
	//System.out.println("extremite "+getNumero()+" : "+nbTrameSansAcq);
	destinataire.setNumeroTrameRecu();
	destinataire.setNbTrameSansAcq(0);
	System.out.println("L'extremité "+destinataire.getNumero()+" a recu de l'extremité "+t.getExtremite().getNumero()+" la trame hdlc suivante :");
	System.out.println(t);	
	setNumeroTrameEnvoye();
	setNbTrameSansAcq(nbTrameSansAcq+1);
	System.out.println("----------------------------------------------------------------------------");

    }

    /**Permet de renvoyer le numero de la trame.
     */
    public int getNumero(){
	return numero;
    }

    /**Permet de renvoyer les adresses X25 qui arrivent sur l'extrémité.
     */
    public AdresseX25[] getArrivants(){
	return adressesX25;
    }

    /**Permet de renvoyer le numéro de trames reçues.
     */
    public int getNumeroTrameRecu(){
	return numeroTrameRecu;
    }

    /**Permet de renvoyer le numéro de trames envoyées.
     */
    public int getNumeroTrameEnvoye(){
	return numeroTrameEnvoye;
    }

    /**Permet d'augmenter le nombre de trames recues modulo 8.
     */
    public void setNumeroTrameRecu(){
	if(numeroTrameRecu == 7){
	    numeroTrameRecu = 0;
	}
	else{
	    numeroTrameRecu =  numeroTrameRecu + 1; 
	}
    }

    /**Permet d'augmenter le nombre de trames envoyées modulo 8.
     */
    public void setNumeroTrameEnvoye(){
	if(numeroTrameEnvoye == 7){
	    numeroTrameEnvoye = 0;
	}
	else{
	    numeroTrameEnvoye =  numeroTrameEnvoye + 1; 
	}
    }
   
    /**Permet de donner le nombre de trame ss acq
     */
    public int getNbTrameSansAcq(){
	return nbTrameSansAcq;
    }

    /**Permet de changer le nombre de trame ss acq
     *@param n le nouveau nombre
     */
    public void setNbTrameSansAcq(int n){
	nbTrameSansAcq = n;
    }

    /**méthode qui permet d'afficher les adresses X25 arrivantes
     */
    public void affiche(){
	for (int i=0; i<adressesX25.length; i++){
	  System.out.println(adressesX25[i].getNom());
	}
    }
}
