package ac.essex.gp.interfaces.graphical;

import javax.swing.*;
import java.util.Vector;
import java.awt.*;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;

/**
     * Gives a digest of the results of the milestones in the evolution process.
 */
class ResultsSummary extends JDialog {

    JTextArea area;

    public ResultsSummary(final MainWindow owner, Vector<GenerationResult> results) {

        super(owner);
        area = new JTextArea();
        JScrollPane pane = new JScrollPane(area);

        getContentPane().add(pane, BorderLayout.CENTER);

        JPanel buttons = new JPanel(new FlowLayout(FlowLayout.RIGHT));

        JButton ok = new JButton("Close");

        ok.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                ResultsSummary.this.dispose();
                owner.mnuGpSummary.setSelected(false);
            }
        });

        addWindowListener(new WindowAdapter() {
            public void windowClosing(WindowEvent e) {
                ResultsSummary.this.dispose();
            }
        });

        buttons.add(ok);

        getContentPane().add(buttons, BorderLayout.SOUTH);

        setTitle("GP Summary");
        setSize(300, 340);
        setLocation(200, 200);
        setVisible(true);

        addWindowListener(new WindowAdapter() {

            public void windowClosing(WindowEvent e) {
                dispose();
            }
            
        });

        displayResults(results);

    }

    double bestFitness = Double.MAX_VALUE;
    
    public void displayResults(Vector<GenerationResult> results) {

        // get the best fitness
        double fitness = results.lastElement().individual.getKozaFitness();

        // only update if a better individual is found.
        if (fitness != bestFitness) {

            bestFitness = fitness;

            StringBuffer text = new StringBuffer(GenerationResult.getCSVHeader());
            text.append("\n");

            int lastResultHits = -1;

            for (int i = 0; i < results.size(); i++) {
                GenerationResult generationResult = results.elementAt(i);
                if (generationResult.individual.getHits() != lastResultHits) {
                    lastResultHits = generationResult.individual.getHits();
                    text.append(generationResult.toCSV());
                    text.append("\n");
                }
            }

            area.setText(text.toString());

        }

    }

}
