/** FILE: fine.java **/

package SIMULA;

import java.awt.*;
import java.io.*;

// Referenced classes of package SIMULA:
//            simulator


/*
 * CLASS fine
 *
 * classe che riepiloga tutti i dati ricavati dalla simulazione in una finestra grafica
 * inoltre aggiorna (o li crea) i file nella directory Statistiche che riguardano appunto
 * le statistiche. 
 */
class fine extends Frame
{

    /*
     * COSTRUTTORE
     * 
     * calcola alcuni risultati
     */

    fine(double d, double d1)
    {
        entro = true;
        setTitle("Risultati della Simulazione");
        resize(580, 560);
        a = d;
        b = d1;
        minuti = (int)(simulator.millisecondi / 60000L);
        secondi = (int)(simulator.millisecondi - (long)(minuti * 60000)) / 1000;
        millesimi = (int)simulator.millisecondi % 1000;
        protime = (int)simulator.millisecondi / (simulator.numparole * 2);
        prominuti = protime / 60000;
        prosecondi = (protime - prominuti * 60000) / 1000;
        promillesimi = protime % 1000;
        onesecpro = (2 * simulator.numparole * 1000) / (int)simulator.millisecondi;
        risultati();  // aggiorna le statistiche
        if(!simulator.nograp)  // non visualizza l'oggetto se è settato -NOGRAPHICS 
            show();
    }



    /*
     * METODO paint()
     *
     * visualizza i risultati
     */

    public void paint(Graphics g)
    {
        g.setColor(Color.red);
        g.drawString("Simulazione by Caponi, Convertino e Federici", 50, 70);
        g.setColor(Color.blue);
        g.drawString("Il simulatore ha usato la politica " + simulator.politica, 50, 120);
        rig = 180;
        if(simulator.politica == "Personalizzata")
        {
            g.drawString("con tolleranza = " + simulator.tolleranza, 50, 140);
            rig += 20;
        }
        g.drawString("ANALISI DEL FILE:", 50, rig - 20);
        g.drawString("Ci sono " + simulator.numparole + " messaggi", 50, rig);
        g.drawString("che variano tra " + simulator.piupiccola + " e " + simulator.piugrande + " caratteri", 50, rig + 20);
        g.drawString("La loro lunghezza media \350 " + simulator.totcaratteri / simulator.numparole + " caratteri", 50, rig + 40);
        g.drawString("IMPOSTAZIONI DEL SIMULATORE:", 50, rig + 80);
        g.drawString("Il fattore Alpha \350 " + simulator.alpha, 50, rig + 100);
        g.drawString("Il fattore Beta \350 " + simulator.beta, 50, rig + 120);
        g.drawString("Ogni processo ha dormito un tempo a caso tra 0 e " + simulator.modulo + " millisecondi", 50, rig + 140);
        g.drawString("RAPPORTO", 50, rig + 180);
        g.drawString("Il tempo medio di esecuzione dei Mittenti \350 " + a, 50, rig + 200);
        g.drawString("Il tempo medio di esecuzione dei Destinatari \350 " + b, 50, rig + 220);
        g.drawString("Il tempo medio di esecuzione di tutti i processi \350 " + (a + b) / 2D, 50, rig + 240);
        g.drawString("Il tempo medio di ATTESA di tutti i processi \350 " + ((a + b) - 2D) / 2D, 50, rig + 260);
        g.drawString("Il tempo massimo impiegato da un processo Mittente \350 " + simulator.maxput, 50, rig + 280);
        g.drawString("Il tempo massimo impiegato da un processo Destinatario \350 " + simulator.maxget, 50, rig + 300);
        g.drawString("Il simulatore ha impiegato " + minuti + " minuti, " + secondi + " secondi e " + millesimi + " millisecondi", 50, rig + 320);
        g.drawString("Un processo ha impiegato in media " + prominuti + " minuti, " + prosecondi + " secondi e " + promillesimi + " millisecondi", 50, rig + 340);
        g.drawString("In un secondo verrebbero eseguiti mediamente " + onesecpro + " processi", 50, rig + 360);
        if(entro)
        {
            setBounds(240, 80, 580, rig + 400);
            entro = false;
        }
    }

    /*
     * METODO handleEvent() // RIDEFINIZIONE
     *
     * gestore degli eventi
     */

    public boolean handleEvent(Event event)
    {
        if(event.id == 201)  // se viene premuto la X
        {
            hide();  // chiudi la finestra
            simulator.chiudi++;
        }
        return super.handleEvent(event);
    }




    /*
     * SOVRACCARICO di METODI incolonna()
     *
     * dato un intero, un double, un float o una stringa restituisce una stringa di 9
     * caratteri che lo rappresenta.
     * visto che la lunghezza dei dati è variabile, per avere dei file di statistiche
     * ordinati vogliamo da loro solo le prime 8 cifre (se le hanno)+ uno spazio.
     */

    String incolonna(int i)
    {
        return incolonna(String.valueOf(i));
    }

    String incolonna(long l)
    {
        return incolonna(String.valueOf(l));
    }

    String incolonna(float f)
    {
        return incolonna(String.valueOf(f));
    }

    String incolonna(double d)
    {
        return incolonna(String.valueOf(d));
    }

    String incolonna(String s)
    {
        byte abyte0[] = new byte[9];
        if(s.length() < 8)
            s.getBytes(0, s.length(), abyte0, 0);
        else
            s.getBytes(0, 8, abyte0, 0);
        return new String(abyte0, 0, 9);
    }


    /*
     * METODO risultati()
     *
     * restituisce su dei file, nella directory Statistiche, i risultati della simulazione.
     * il nome del file viene ricavato nel seguente modo ab-c_d-e-f.txt dove a=iniziale politica, 
     * b=tolleranza, c_d=alpha, e=beta e f=primi due caratteri del file.
     */

    void risultati()
    {
        char ac[] = new char[simulator.nomefile.length()];
        ac = simulator.nomefile.toCharArray();
        String s = "Statistiche/" + simulator.politica.charAt(0);
        s = s + simulator.tolleranza + "-" + (int)simulator.alpha + "_";
        s = s + (int)((simulator.alpha - (float)(int)simulator.alpha) * 1000F) + "-" + simulator.beta;
        s = s + "-" + new String(ac, 0, 2) + ".txt";
        byte abyte0[];
        try
        {
            FileInputStream fileinputstream = new FileInputStream(s);
            abyte0 = new byte[fileinputstream.available()];
            fileinputstream.read(abyte0);
            fileinputstream.close();
        }
        catch(Exception _ex)
        {
            String s1 = "POLITICA TOLLER   NOMEFILE ALPHA    BETA     PUTEXE   GETEXE   TOTEXE";
		s1 = s1 + "   TOTWAIT  TOTREAL  SINGREAL 1secPROC MAXPUT   MAXGET";
            abyte0 = new byte[s1.length()];
            abyte0 = s1.getBytes();
        }
        try
        {
            FileOutputStream fileoutputstream = new FileOutputStream(s);
            fileoutputstream.write(abyte0);
            fileoutputstream.write(("\n" + incolonna(simulator.politica) + incolonna(simulator.tolleranza)).getBytes());
            fileoutputstream.write((incolonna(simulator.nomefile)+incolonna(simulator.alpha)).getBytes());
            fileoutputstream.write((incolonna(simulator.beta)+incolonna(a) + incolonna(b) + incolonna((a + b) / 2D)).getBytes());
            fileoutputstream.write((incolonna(((a + b) - 2D) / 2D) + incolonna(simulator.millisecondi)).getBytes());
            fileoutputstream.write((incolonna(protime) + incolonna(onesecpro) + incolonna(simulator.maxput)).getBytes());
            fileoutputstream.write((incolonna(simulator.maxget)).getBytes());
            fileoutputstream.close();  
            return;
        }
        catch(IOException _ex)
        {
            return;
        }
    }

   /*
    * VARIABILI
    */

    double a;
    double b;
    int rig;
    int minuti;
    int secondi;
    int millesimi;
    int prominuti;
    int prosecondi;
    int promillesimi;
    int protime;
    int onesecpro;
    boolean entro;
}