package graficos;

import java.util.Vector;

import javax.swing.JFrame;

import algoritmo.Agente;
import algoritmo.Alvo;
import algoritmo.ConjuntoDeAgentes;
import algoritmo.ConjuntoDeAlvos;
import algoritmo.ConjuntoDeObstaculos;
import algoritmo.Obstaculo;



public class SourceForGraphics {

	Vector<Ponto> conjuntoDePontos;

	public SourceForGraphics(){
		 conjuntoDePontos = new Vector<Ponto>();
	}
	
    public Vector<Ponto> getConjuntoDePontos() {
		return conjuntoDePontos;
	}

	public void setConjuntoDePontos(Vector<Ponto> cardume) {
		this.conjuntoDePontos = cardume;
	}
	
	public void removerTodosOsPontos(){
		if(!conjuntoDePontos.isEmpty())
    		conjuntoDePontos.removeAllElements();
	}
/*
	public void lerArquivoSwarm(int dimensaoX, int dimensaoY, String nomeArquivo){
        
		String stringArquivo = null;
	    String [] peixesIDSeparation = null; 
	    String [] peixeLinhas = null;
	        
		//Arquivo arquivo = new Arquivo();
        if(nomeArquivo.contains("simulation")){
        	//stringArquivo = arquivo.abrirArquivo("reports/simulations/"+nomeArquivo);
        	//Separa a string com as posi��es do peixe GBEST
            peixesIDSeparation = stringArquivo.split("GBEST:");
        }
        else{
        	//stringArquivo = arquivo.abrirArquivo("reports/swarm/"+nomeArquivo);
        	//Separa a string com as posi��es de cada peixe por id
            peixesIDSeparation = stringArquivo.split("Id");
        }
        removerTodosOsPontos();
   
        //TEm que come�ar de 1 porque a primeira posi��o do array � inv�lida, ou seja, ou � vazia, ou � uma mensagem sem import�ncia
        for(int i = 1; i < peixesIDSeparation.length; i++){
        
        	Ponto ponto = new Ponto(i-1);//O Id dos pontos come�am de 0 e n�o de 1
        	//Para o peixe i fa�a:
        	peixeLinhas = peixesIDSeparation[i].split("\n");
        	double[] peixeValorPosicao = new double [2];//Posi��o X e Y
        	int dimension = 0; //precisa disso pra n�o pegar a posic�o do centro de massa que est� no arquivo
        	for (int j = 0; j < peixeLinhas.length; j++){
        		if(    (peixeLinhas[j].contains("Position["+dimensaoX+"]") 
        				|| peixeLinhas[j].contains("Position["+ dimensaoY+"]"))
        				&& dimension<peixeValorPosicao.length)//essa linha evita que peguemos a posi��o do Centro de Massa que est� no arquivo
        		{
        			//Pega o valor da posi��o e coloca no array
        			String valorPosicaoTemp = peixeLinhas[j].split(": ")[1];
        			peixeValorPosicao[dimension] = Double.parseDouble(valorPosicaoTemp);
        			dimension++;
        			
        		}
        		//////////////ADICIONEI
        		else if(peixeLinhas[j].contains("Weight") && (!peixeLinhas[j].contains("Total"))){
        			String valorPesoTemp = peixeLinhas[j].split(": ")[1];
        			ponto.setWeight(Double.parseDouble(valorPesoTemp));
        		}
        		//////////
        	}
        	/////ADICIONEI///////
        	
        	ponto.setPosition(peixeValorPosicao);
        	conjuntoDePontos.add(ponto);
        	System.out.println(conjuntoDePontos.isEmpty());
        	
        	
        }
        
        
        /////////Esse c�igo s� serve para imprimir na tela/////////////
        for(int h=0; h<conjuntoDePontos.size();h++){
        	;//System.out.println("peixe "+conjuntoDePontos.get(h).getId());
        	for(int g=0; g<conjuntoDePontos.get(h).getPosition().length;g++)
        		;//System.out.println(conjuntoDePontos.get(h).getPosition()[g]);
        }
        //////////////////////////////////////////////////////////////
       
        
    }
    
*/	
	
	public void lerLivingSwarm(ConjuntoDeAlvos conjuntoDeAlvos,
							ConjuntoDeObstaculos conjuntoDeObstaculos, 
							ConjuntoDeAgentes conjuntoDeAgentes, 
							int dimensaoX, int dimensaoY) 
	{
		removerTodosOsPontos();
		
		Vector<Alvo> alvos = conjuntoDeAlvos.getAlvos();
		Vector<Obstaculo> obstaculos = conjuntoDeObstaculos.getObstaculos();
	
		Alvo alvoAtual;
		Obstaculo obstaculoAtual;
		Agente agenteAtual;
		
		double[] posicaoPonto = new double [2];//Posi��o X e Y
		double[] posicao;
		
		//Cria os pontos que representam alvos
		for(int i = 0; i < alvos.size(); i++){
	        	
        	alvoAtual =  alvos.get(i);
        	Vector<double[]> pontosAlvoAtual = alvoAtual.getListaDePontos();
        	for(int j = 0; j < pontosAlvoAtual.size(); j++){
        		Ponto ponto = new Ponto(i+","+j);//i=alvo,j=pontoId
        		
        		posicao = pontosAlvoAtual.get(j);
        		posicaoPonto[0]= posicao[dimensaoX];
        		posicaoPonto[1]= posicao[dimensaoY];
        	
        		
        		ponto.setTipo(0);//Tipo 0 => posi��es do mouse mapeadas no ambiente como alvos
        		ponto.setPosition(posicaoPonto.clone());
        		conjuntoDePontos.add(ponto);
        		//System.out.println("posicaoX: "+ conjuntoDePontos.get(j).getPosition(0)+ " posicaoY: "+ conjuntoDePontos.get(j).getPosition(1));
        		
        	}
		}
		//Cria os pontos que representam obstaculos
		for(int i = 0; i < obstaculos.size(); i++){
        	
        	obstaculoAtual =  obstaculos.get(i);
        	Vector<double[]> pontosObstaculoAtual = obstaculoAtual.getListaDePontos();
        	for(int j = 0; j < pontosObstaculoAtual.size(); j++){
        		Ponto ponto = new Ponto(i+","+j);//i=obstaculo,j=pontoId
        		
        		posicao = pontosObstaculoAtual.get(j);
        		posicaoPonto[0]= posicao[dimensaoX];
        		posicaoPonto[1]= posicao[dimensaoY];
        	
        		
        		ponto.setTipo(1);//Tipo 1 => posi��es do mouse mapeadas no ambiente como obstaculos
        		ponto.setPosition(posicaoPonto.clone());
        		conjuntoDePontos.add(ponto);
        		//System.out.println("posicaoX: "+ conjuntoDePontos.get(j).getPosition(0)+ " posicaoY: "+ conjuntoDePontos.get(j).getPosition(1));
        		
        	}
		}
		//Cria os pontos que representam agentes
		for(int i = 0; i < conjuntoDeAgentes.getNumAgentes(); i++){
        	
        	agenteAtual =  conjuntoDeAgentes.get(i);
        	
        	Ponto ponto = new Ponto(i+", agente.");//i=alvo,j=pontoId
        		
        	posicao = agenteAtual.getPosicao();
        	posicaoPonto[0]= posicao[dimensaoX];
        	posicaoPonto[1]= posicao[dimensaoY];
        	
        	ponto.setTipo(2);//Tipo 2 => posi��es dos agentes
        	ponto.setPosition(posicaoPonto.clone());
        	conjuntoDePontos.add(ponto);
        	//System.out.println("posicaoX: "+ conjuntoDePontos.get(j).getPosition(0)+ " posicaoY: "+ conjuntoDePontos.get(j).getPosition(1));
        	
		}
		
	}
	
	public void adicionarPontoAlvo(double[] posicaoPonto){
		int index = conjuntoDePontos.size()-1;
		Ponto ponto = new Ponto("PontoTeste, pontoId:"+index);//i=alvo,j=pontoId
		ponto.setTipo(3);//Tipo 3 => posi��es dos pontos que mapeiam a reta gerada pelos pontos tipos 0
		ponto.setPosition(posicaoPonto);
		conjuntoDePontos.add(ponto);
	}
	
	public void adicionarPosicaoAgente(double[] posicaoPonto){
		int index = conjuntoDePontos.size()-1;
		Ponto ponto = new Ponto("PontoTeste, pontoId:"+index);//i=alvo,j=pontoId
		ponto.setTipo(2);//Tipo 2 => posi��es dos agentes 
		ponto.setPosition(posicaoPonto);
		conjuntoDePontos.add(ponto);
	}
	
	public void adicionarPontoErrado(double[] posicaoPonto){
		int index = conjuntoDePontos.size()-1;
		Ponto ponto = new Ponto("PontoTeste, pontoId:"+index);//i=alvo,j=pontoId
		ponto.setTipo(5);//Tipo 5 => posi��es dos pontos que n�o mapeiam a reta gerada pelos pontos tipos 0
		ponto.setPosition(posicaoPonto);
		conjuntoDePontos.add(ponto);
	}
    
    public double[][] getPosicoesDosPontos(){
    	
    	int qtdDimensoes = conjuntoDePontos.get(0).getPosition().length;
    	//[N�mero de pontos][N�mero de dimens�es]
    	double[][] posicoesDosPontos = new double [conjuntoDePontos.size()][qtdDimensoes];
    	
    	for(int i = 0; i < conjuntoDePontos.size(); i++)
    		posicoesDosPontos[i] = conjuntoDePontos.get(i).getPosition();
		
    	
    	return posicoesDosPontos;
    		
    		
    }

    public double[] calcularCentroDeMassa(){
    	
    	int qtdDimensoes;
    	
    	if(!conjuntoDePontos.isEmpty() ){
    		qtdDimensoes = conjuntoDePontos.get(0).getPosition().length;
    	}
    	else
    	{
    		return null;
    	}
    	
		double[] barycenter=new double[qtdDimensoes];
		double weight=0;
		
		for(int i=0;i<conjuntoDePontos.size();i++){
			
			weight+=conjuntoDePontos.get(i).getTipo();
			
			for(int k=0; k < qtdDimensoes;k++){
				barycenter[k]+=conjuntoDePontos.get(i).getTipo()*conjuntoDePontos.get(i).getPosition()[k];
			}
		}
		
		for(int j=0;j < qtdDimensoes; j++){
			barycenter[j]=barycenter[j]/weight;
		}
		
		System.out.println("C�lculo do centro de massa. Peso total:" + weight);
		return barycenter;
    	
		
	}
    
    
    

}
