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

package ambienteGrafico.principal;

import algoritmo.EspacoDeBusca;
import ambienteGrafico.componentes.Canvas;
import auxiliar.Arquivo;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.util.Observable;
import java.util.Observer;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.imageio.ImageIO;

/**
 *
 * @author Marília
 */
public class ThreadExecutarSimulacao extends Thread implements ActionListener, Observer{
    EspacoDeBusca espBusca = EspacoDeBusca.getInstance();

    StringBuffer stringResultados =  new StringBuffer();
    int simulacao = 1;
    int repeticao = 1;
    int[] numAgentes = null;

    public ThreadExecutarSimulacao(){
        numAgentes = new int[1];
        numAgentes[0]=8;
        //numAgentes[1]=4;
        //numAgentes[2]=8;
        //numAgentes[3]=4;
        //numAgentes[4]=5;
        //numAgentes[5]=10;

        espBusca.addObserver(this);
    }


    public void run(){
                
                //espBusca.setNumMaxCiclos(2000);
                espBusca.setPorcentagemMinimaCompleta(75);
                espBusca.setIntervaloGatilho(500);

                Canvas canvas = espBusca.getCanvas();
                
                stringResultados.append("----------------------------");
                stringResultados.append("Simulacao: ");
                stringResultados.append(simulacao);
                stringResultados.append(" (sem obstáculos)");
                stringResultados.append("\n");
                stringResultados.append(numAgentes[simulacao-1]);
                stringResultados.append(" agentes");
                stringResultados.append("\n");
                stringResultados.append(" porcentagem mínima: ");
                stringResultados.append(espBusca.getPorcentagemMinimaCompleta());
                stringResultados.append(" %");
                stringResultados.append("\n");
                stringResultados.append(" gatilho: a cada ");
                stringResultados.append(espBusca.getIntervaloGatilho());
                stringResultados.append(" ciclos");
                stringResultados.append("\n");
                stringResultados.append("\n");


                //javax.swing.Timer animationTimer = new javax.swing.Timer(10,this);//canvas.getAnimationTimer();
                //canvas.setAnimationTimer(animationTimer);

                System.out.println("simulacao3: " + simulacao);
                System.out.println("repeticao3: " + repeticao);
                espBusca.clear();
                espBusca.setCicloAtual(0);
                espBusca.setIntervaloGatilho(500);
                espBusca.setCicloGatilho(500);
                espBusca.setExecucaoFinalizada(false);
                //espBusca.adicionarObstaculosPadroes();
                espBusca.adicionarAgentesAleatoriamente(numAgentes[simulacao-1]);
                

                System.out.println("NUm agentes: "+numAgentes[simulacao-1]);
                espBusca.estabelecerObjetivoDaExecucao(2);
                try {
                    //restart a imagem
                    BufferedImage imPrincipal = ImageIO.read(getClass().getResource("/imagens/Exemplos de Ambientes/ModeloAmbiente1420x800comTubos.jpg"));
                    canvas.setImagemPrincipal(imPrincipal);
                    canvas.setImagemAmbiente(canvas.getCopia(imPrincipal));
                } catch (IOException ex) {
                    Logger.getLogger(EspacoDeBusca.class.getName()).log(Level.SEVERE, null, ex);
                }
                //canvas.repaint();
                canvas.startAnimation();

    }

    @Override
    public void actionPerformed(ActionEvent e) {
       //espBusca.getCanvas().repaint();
       //System.out.println("Animation: repaint..");
       //System.out.println("Num observers: "+espBusca.countObservers());
    }

    @Override
    public void update(Observable o, Object arg) {
        System.out.println("Recebeu Notificação");
        if(arg instanceof Integer){
            System.out.println(arg.toString());
        }
        if (arg instanceof String)
        {
            
            String arg2 = (String) arg;
            if(arg2.equalsIgnoreCase("simulacaoFinalizada")){

                BufferedImage mapaFinal =  espBusca.criarMapaFinal();
                BufferedImage mapaOtimo =  espBusca.getMelhorSolucaoPossivel().getFotoRegiao();

                double porcentagemDePixelsIguais = espBusca.compararImagens(mapaFinal, mapaOtimo);

                stringResultados.append(repeticao);
                stringResultados.append("\n");
                stringResultados.append("Porcentagem: ");
                stringResultados.append(porcentagemDePixelsIguais);
                stringResultados.append("\n");
                stringResultados.append("Num Total Ciclos: ");
                stringResultados.append(espBusca.getCicloAtual());
                stringResultados.append("\n");
                stringResultados.append("\n");
                repeticao++;

                 Canvas canvas = espBusca.getCanvas();
                 if(repeticao>10){
                     simulacao++;
                     if(simulacao <= numAgentes.length ){

                            stringResultados.append("----------------------------");
                            stringResultados.append("Simulacao: ");
                            stringResultados.append(simulacao);
                            stringResultados.append(" (sem obstáculos)");
                            stringResultados.append("\n");
                            stringResultados.append(numAgentes[simulacao-1]);
                            stringResultados.append(" agentes");
                            stringResultados.append("\n");
                            stringResultados.append(" porcentagem mínima: ");
                            stringResultados.append(espBusca.getPorcentagemMinimaCompleta());
                            stringResultados.append(" %");
                            stringResultados.append("\n");
                            stringResultados.append(" gatilho: a cada ");
                            stringResultados.append(espBusca.getIntervaloGatilho());
                            stringResultados.append(" ciclos");
                            stringResultados.append("\n");
                            stringResultados.append("\n");
                            repeticao=1;
                     }
                     else{
                         //gravarArquivo
                        Arquivo arquivo = new Arquivo();
                        String conteudo = stringResultados.toString();
                        arquivo.gravarArquivo(conteudo, "resultadosSimulacoes.txt");
                         System.out.println("ARQUIVO SALVO");
                     }
                 }
                 if(repeticao <= 10){

                        //javax.swing.Timer animationTimer = new javax.swing.Timer(10,this);//canvas.getAnimationTimer();
                        //canvas.setAnimationTimer(animationTimer);

                        System.out.println("repeticao: " + repeticao);
                        espBusca.clear();
                        espBusca.setCicloAtual(0);
                        espBusca.setIntervaloGatilho(500);
                        espBusca.setCicloGatilho(500);
                        espBusca.setExecucaoFinalizada(false);
                        //espBusca.adicionarObstaculosPadroes();
                        espBusca.adicionarAgentesAleatoriamente(numAgentes[simulacao-1]);
                       
                        System.out.println("Num agentes: "+numAgentes[simulacao-1]);
                        espBusca.estabelecerObjetivoDaExecucao(2);
                        try {
                            //restart a imagem
                            BufferedImage imPrincipal = ImageIO.read(getClass().getResource("/imagens/Exemplos de Ambientes/ModeloAmbiente1420x800comTubos.jpg"));
                            canvas.setImagemPrincipal(imPrincipal);
                            canvas.setImagemAmbiente(canvas.getCopia(imPrincipal));
                        } catch (IOException ex) {
                            Logger.getLogger(EspacoDeBusca.class.getName()).log(Level.SEVERE, null, ex);
                        }
                        //canvas.repaint();
                        canvas.startAnimation();
                        
                 }
            }
        }
    }

}



