/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package sdsimulator.runnable;
import java.util.*;

/**
 * Guarda todos los mensajes que quedan pendientes de terminarse por el hecho de
 * ser asíncronos. En cada paso, lo primero que se hará será decidir si efecti-
 * vamente se ha terminado de ejecutar el mensaje asíncrono.
 * @author Miguel Herreros
 */

public class AsincronosPendientes extends Vector{
    private int frecuencia; //frecuencia de llegada de mensajes asíncronos.
    private boolean prioridadAntiguos;
    private int pasoActual;  //Variable auxiliar, a partir de ella se informa el vector de debajo en cada inserción.
    private Vector pasoEnvio;//Guarda, para cada mensaje guardado, el paso en el que se envió.
    private java.util.ResourceBundle  bundle; //Para recuperar los strings.
    //..........................................................................
    
    public AsincronosPendientes(){
        super(10,10);
        pasoEnvio = new Vector(10,10);
        pasoActual=0;
        bundle = java.util.ResourceBundle.getBundle("sdsimulator/resources/runnable");
        frecuencia=sdsimulator.Main.FRECUENCIA_LLEGADA_ASINCRONOS_DEFECTO;
        prioridadAntiguos=sdsimulator.Main.PRIORIDAD_ASINCRONOS_ANTIGUOS_DEFECTO;
    }
    
    //..........................................................................
    @Override
    public boolean add(Object o){
        if (o instanceof MensajeEjecutable && ((MensajeEjecutable)o).getAsin()){
            pasoEnvio.add(pasoActual);
            return super.add(o);
        }
        else
            return false;                
    }
    
    //..........................................................................
    
    public void paramametros(int frecuencia, boolean prioridadAntiguos){
        this.frecuencia=frecuencia;
        this.prioridadAntiguos=prioridadAntiguos;
    }
    
    //..........................................................................
    
    public int getFrecuenciaLlegadas(){
        return frecuencia;
    }
    
    //..........................................................................
    
    public boolean getPrioridadAntiguos(){
        return prioridadAntiguos;
    }
    
    //..........................................................................
    
    public String llegadas(){
        //Recorre todos los mensajes (salvo el más reciente) para ver si el mensaje
        //ha llegado ---- cálculo meramente estadístico ----. Los mensajes más an-
        //tiguos tienen más probabilidad de llegar.
        String retorno="";
        double probabilidadLlegada;
                
        for (int i=0; i<size(); i++){
            MensajeEjecutable asincrono=(MensajeEjecutable)get(i);
            probabilidadLlegada=Math.random(); 
            
            if (prioridadAntiguos) probabilidadLlegada*= (1/(i+1)); //penaliza a los más antiguos
             
            if (probabilidadLlegada >= ((double)frecuencia)/10){ //si el aleatorio supera el umbral, llega
                retorno+=asincrono.LlegaAsincrono((Integer)(pasoEnvio.get(i)));
                retorno+=bundle.getString("SEPARADOR_EVENTOS");
                this.remove(i);
                pasoEnvio.remove(i);
            }
        }
        return retorno;
    }
    
    //..........................................................................
    public void reset(){
        this.removeAllElements();
        pasoEnvio.removeAllElements();
        pasoActual=0;
    }
    //..........................................................................
    public void setPaso(int paso){
        pasoActual=paso;
    }
    //..........................................................................
    public String asincronosPendientes(){
        if  (size()==0)
            return "";
        else
            return bundle.getString("PENDIENTES") + size() + bundle.getString("PENDIENTES1");
    }
}
