package ambienteGrafico.ferramentas;

import auxiliar.Conversor;
import algoritmo.ConjuntoDeAlvos;


public class DefaultTool {

	private ConjuntoDeAlvos alvos = ConjuntoDeAlvos.getInstance();
	private int raioLimiteDeContinuidade = 10;
	
	
	/**@author Mar�lia
	 * 
	 * @param x
	 * @param y
	 * @param dragged - se o mouse esta pressionado
	 * @param theCanvas
	 * @return Se o mapeamento teve sucesso, se sim podemos pintar o ponto no canvas
	 */
	public boolean mapeamento(int x, int y, boolean dragged, main_canvas theCanvas){
		boolean podePintar = true;
		int yInvertido;
		
		if(x<0)
			x=0;
		else if(x>theCanvas.widt)
			x=theCanvas.widt;
		
		if(y<0)
			y=0;
		else if(y>theCanvas.heig)
			y=theCanvas.heig;
		
		
		
		if(theCanvas.left_color_button.getFuncao().equalsIgnoreCase("alvo")){
			//Aqui se mapeia os alvos
			///System.out.println("Localiza��o do pincel: "+x+ "   "+y);
			int id_do_alvo = theCanvas.left_color_button.getIdAlvo();
			
			if( !alvos.existeAlvo(id_do_alvo) ){
				alvos.addAlvo(id_do_alvo, theCanvas.left_color_button.getDiametroTubo() );
			}
			//System.out.println("diametro do tubo: "+theCanvas.left_color_button.getDiametroTubo());
		
			int size = alvos.getAlvos().get(id_do_alvo).getListaDePontos().size();
			if((size != 0) && !dragged){//Se n�o for o primeiro ponto e se n�o estiver dragging o bot�o do mouse
				double[] ultimoPonto = alvos.getAlvos().get(id_do_alvo).getListaDePontos().get(size-1);
				int[] posicaoEmPx = Conversor.converterMetroParaPx(ultimoPonto[0], ultimoPonto[1],theCanvas.widt, theCanvas.heig,theCanvas.getEscalaHorizontal(),theCanvas.getEscalaVertical());
				//System.out.println("Posicao Ultimo Ponto(em pixels): "+ posicaoEmPx[0]+","+posicaoEmPx[1]);
				//PS: O valor de Y no ultimoPonto j� est� invertido
				//Inverte o valor de y pra crescer de baixo pra cima e n�o de cima pra baixo
				yInvertido = Math.abs(y - theCanvas.heig); 
				//System.out.println("Posicao Ponto Atual(em pixels): "+ x+","+yInvertido);
				double[] posicao = Conversor.converterEscalaCanvasParaEscalaMetro(x,yInvertido,theCanvas.widt,theCanvas.heig,theCanvas.getEscalaHorizontal(),theCanvas.getEscalaVertical());

				//Se o pr�ximo ponto est� pr�ximo o bastante do ponto anterior para pertencer ao mesmo alvo
				if((x<=posicaoEmPx[0]+raioLimiteDeContinuidade) && (x>=posicaoEmPx[0]-raioLimiteDeContinuidade)
					&& (yInvertido<=posicaoEmPx[1]+raioLimiteDeContinuidade) && (yInvertido>=posicaoEmPx[1]-raioLimiteDeContinuidade)){
					
					alvos.adicionarPonto(posicao,id_do_alvo );
					podePintar = true;
				}
				else{
					//Dist�ncia euclidiana entre os pontos 
					double distancia = Math.sqrt(Math.pow(posicao[0]-ultimoPonto[0], 2) + Math.pow(posicao[1]-ultimoPonto[1], 2) );
					distancia = distancia/100;
					String mensagem =  "O pr�ximo ponto escolhido para este alvo est� a\n"
										+ distancia + " km do ponto anterior. Se o ponto escolhido\n"+
										" pertence a outro alvo, defina outro alvo no painel de cores.\n"+
										" Caso contr�rio, aumente o limite de continuidade entre os pontos:";
					raioLimiteDeContinuidade = (int)OptionPaneMultiple.showLimiteDeContinuidadeDialog(raioLimiteDeContinuidade,"Limites de Continuidade dos Pontos", mensagem, theCanvas);
					//System.out.println("Limite de COntinuidade: "+ raioLimiteDeContinuidade);
					podePintar = false;
				}
			}
			else{
				yInvertido = Math.abs(y - theCanvas.heig); 
				double[] posicao = Conversor.converterEscalaCanvasParaEscalaMetro(x,yInvertido,theCanvas.widt,theCanvas.heig,theCanvas.getEscalaHorizontal(),theCanvas.getEscalaVertical());
				alvos.adicionarPonto(posicao,id_do_alvo );
				podePintar = true;
			}

			//System.out.println("-------------------\nAmbiente:\n "+alvos.toString()+ "---------------");
			
				
			
			///////TESTE///////////
			/*double[] pontoTeste= new double[2];
			if (alvos.getAlvos().get(id_do_alvo).getListaDePontos().size()>=2)
				pontoTeste = alvos.getAlvos().get(id_do_alvo).getListaDePontos().get(1);
			
			System.out.println(pontoTeste[0]+","+pontoTeste[1]);
			//System.out.println("AvaliarAmbiente: "+alvos.avaliarAmbiente(posicao));
			System.out.println("Ambiente: "+alvos.toString());
			System.out.println("Quantidade de Alvos: "+alvos.getQuantidadeDeAlvos()+"\n--------------");
			*/
			///////TESTE///////////
		}
		else if(theCanvas.left_color_button.getFuncao().equalsIgnoreCase("obstaculo")){
			//Aqui se mapeia os obstaculos
			System.out.println("Tinta de obstaculo! id: "+ theCanvas.left_color_button.getIdObstaculo());
		}
		else
			System.out.println("Tinta de ambiente");
		
		
		return podePintar;
	}
}
