package projects.bitAlterne.nodes.nodeImplementations;

import java.awt.Color;
import java.awt.Graphics;
import java.util.Arrays;
import java.util.LinkedList;
import java.util.Queue;

import projects.bitAlterne.nodes.messages.*;
import projects.defaultProject.nodes.messages.Msg;
import projects.defaultProject.nodes.nodeImplementations.TimerNode;
import sinalgo.gui.transformation.PositionTransformation;

public class BANode extends TimerNode {
 
	// Entrée
    Queue<String> Depart = new LinkedList<String>();
    
    // Sortie
    Queue<String> Arrivee = new LinkedList<String>();    
	
    // Variables
    int Tag;
    String Buffer;
    
    // utilisez cette fonction pour savoir qui est le processus émetteur
	boolean Emetteur(){ 
		return this.root();
	}
	
	void inverseTag(){
		this.Tag=(this.Tag+1)%2;
	}

	// Lors de l'initialisation, il faut initialiser la file Depart avec cette fonction 
	// afin de la remplir avec les données à envoyer
	public void initDepart() {
		String chaine="Bonjour les enfants, comment allez-vous ? bien ? ou bien ?";
		this.Depart.addAll(Arrays.asList(chaine.split("\\s* \\s*")));
	}

	// Cette fonction permet de visualiser le succès de l'algorithme
	// Elle doit être appelé à chaque réception de nouveaux messages 
	void AfficheArrivee(){
		String message="\n";
		for(String s : Arrivee) {
			message=message+s+" ";
		}
		message=message+"\n";
		this.affiche(message);
	}
		
	
	public void initialization() {
		// à compléter 
	}
	
	// Cette fonction est appelée régulièrement par un minuteur
	// Elle doit donc contenir le code à exécuter régulièrement 
	// (c'est-à-dire, le code à exécuter sur expiration du minuteur dans l'algorithme)
	// N.B. ce code s'exécute avec exactement deux processus donc pour l'envoi de message utilisez "sendSuccessor"
	public void regularly() {
	}

	
	public void receipt(LinkedList<Msg> inbox) {

		for(Msg m: inbox) {		
			if(m instanceof DATA){
				// à compléter
			}
				
			else if(m instanceof Ack){		
				// à compléter
			}
		}				
			
	}
 

	public Color Couleur(){
		if(this.Tag==1) return Color.green;
		return Color.cyan;
	}
  
    public void draw(Graphics g, PositionTransformation pt, boolean highlight){	 
    	String text=""+this.Tag;
    	this.setColor(Couleur());
    	super.drawNodeAsDiskWithText(g, pt, highlight, text, 30, Color.black);
	 
    }	
    
}
