package ambienteGrafico.ferramentas;

import javax.imageio.ImageIO;
import javax.swing.*;


import ambienteGrafico.componentes.Canvas;
import algoritmo.Agente;
import algoritmo.ConjuntoDeAgentes;
import algoritmo.ConjuntoDeAlvos;
import algoritmo.EspacoDeBusca;
import ambienteGrafico.componentes.PainelFerramentaAgentes;
import auxiliar.Conversor;

import java.awt.*;
import java.awt.event.*;
import java.awt.image.*;
	
public class FerramentaInserirAgente extends Ferramenta {


	private BufferedImage imagemAntesDaInsercaoDoAgente;
	private BufferedImage imagem;
	
	private Graphics2D g2D;

	private int posicaoXIcon;
	private int posicaoYIcon;
	private int posicaoXAgente;
	private int posicaoYAgente;
	private int angulo;
    private Canvas painelCanvas;

    private Cursor cursor;
    private PainelFerramentaAgentes painelFerramenta;

    private double[] tamanhoPadraoAgente = new double[2];
    private double[] velocidadePolarPadraoAgente = new double[2];//valor default:{5,0} definido em PainelFerramentaAgentes

    public FerramentaInserirAgente(PainelFerramentaAgentes painel) {
        super();
        this.cursor = new Cursor(Cursor.CROSSHAIR_CURSOR);
        this.painelFerramenta = painel;
    }

    public PainelFerramentaAgentes getPainel() {
        return painelFerramenta;
    }

    public void setPainel(PainelFerramentaAgentes painel) {
        this.painelFerramenta = painel;
    }

    public Cursor getCursor() {
        return cursor;
    }

    public double[] getTamanhoPadraoAgente() {
        return tamanhoPadraoAgente;
    }

    public void setTamanhoPadraoAgente(double[] tamanhoPadraoAgente) {
        this.tamanhoPadraoAgente = tamanhoPadraoAgente;
    }

    public double[] getVelocidadePolarPadraoAgente() {
        return velocidadePolarPadraoAgente;
    }

    public void setVelocidadePolarPadraoAgente(double[] velocidadePolarPadraoAgente) {
        this.velocidadePolarPadraoAgente = velocidadePolarPadraoAgente;
    }

	public void mousePressed(MouseEvent mevt) {
                System.out.println("clicked");
                
		painelCanvas = (Canvas) mevt.getSource();
        imagem = painelCanvas.getImagemPrincipal();
        imagemAntesDaInsercaoDoAgente = painelCanvas.getCopia(imagem);
                
		posicaoXAgente = mevt.getX();
		posicaoYAgente = mevt.getY();
		
		g2D = imagem.createGraphics();
               
		angulo=0;
               
        if (SwingUtilities.isLeftMouseButton(mevt)) {

            int anguloInicial = 0;
            ImageIcon[] spritesAgentes = painelCanvas.getSpritesAgentes();
            ImageIcon figura = spritesAgentes[anguloInicial];
            //Converte a posicão da escala do canvas para a escala da imagem
            int[] posicaoAgenteEmPx = Conversor.converterEscalaCanvasParaEscalaImagem(
                                                                                posicaoXAgente,posicaoYAgente,
                                                                                painelCanvas.getWidth(),painelCanvas.getHeight(),
                                                                                imagem.getWidth(), imagem.getHeight());
            
            int posicaoAesquerda = figura.getIconWidth()/2;
            int posicaoTopo = figura.getIconHeight()/2;
            //Centra o meio da imagem na posição que queremos
            posicaoXIcon = posicaoAgenteEmPx[0]-posicaoAesquerda;
            posicaoYIcon = posicaoAgenteEmPx[1]-posicaoTopo;

            System.out.println("Posicao Agente(escl.imagem)="+posicaoAgenteEmPx[0]+","+posicaoAgenteEmPx[1]
                                +" posicaoIcon="+posicaoXIcon+","+posicaoYIcon
                                +" imagemWidth="+imagem.getWidth()+" imagemHeight"+imagem.getHeight()
                                +" canvasWidth="+painelCanvas.getWidth()+" canvasHeight="+painelCanvas.getHeight());
            figura.paintIcon(painelCanvas, g2D, posicaoXIcon,posicaoYIcon );

        }
		velocidadePolarPadraoAgente[1] = angulo;
		imagem.flush();
        painelCanvas.repaint();

	}

	public void mouseDragged(MouseEvent mevt) {
		System.out.println("dragged");
        painelCanvas = (Canvas) mevt.getSource();
        imagem = painelCanvas.getCopia(imagemAntesDaInsercaoDoAgente);
		g2D = imagem.createGraphics();
		painelCanvas.setImagemPrincipal(imagem);
                
		//PS: O valor de Y está invertido
		//Inverte o valor de y pra crescer de baixo pra cima e não de cima pra baixo
		int yAtualInvertido = Math.abs(mevt.getY() - painelCanvas.getHeight()); 
		int yIconInvertido = Math.abs(posicaoYAgente - painelCanvas.getHeight()); 
		//Deixa as coordenadas em funçao do ponto de origem representado pela posição onde o bot foi adicionado
		int x = mevt.getX() - posicaoXAgente;
		int y = yAtualInvertido - yIconInvertido;
		
		double[] coordPolar = Conversor.coordCartesianaParaPolar(x, y);
		//double angulo = coordPolar[1];
		angulo = (int) Math.round(coordPolar[1]);
		if(angulo==360)
             angulo=0;
                
        ImageIcon[] spritesAgentes = painelCanvas.getSpritesAgentes();
		ImageIcon figura = spritesAgentes[angulo];
		
		figura.paintIcon(painelCanvas, g2D, posicaoXIcon , posicaoYIcon);

        velocidadePolarPadraoAgente[1] = angulo;
        imagem.flush();
        painelCanvas.repaint();
                //System.out.println("Adicionar Agente: Ângulo:"+angulo+ " ; Posição: "+posicaoXAgente+","+ posicaoYAgente);
	}

	//Ao liberar o mouse, cria-se um agente no ambiente
	public void mouseReleased(MouseEvent mevt) {
        System.out.println("released");
        EspacoDeBusca espacoDeBusca = EspacoDeBusca.getInstance();
        ConjuntoDeAgentes agentes = espacoDeBusca.getAgentes();

        painelCanvas = (Canvas) mevt.getSource();
		Agente agente = new Agente(agentes.getNumAgentes());
		
		int posicaoYAgenteInvertida = Math.abs(posicaoYAgente - painelCanvas.getHeight());
		double[] posicao = Conversor.converterEscalaCanvasParaEscalaMetro(posicaoXAgente,
                                                                  posicaoYAgenteInvertida, 
                                                                  painelCanvas.getWidth(), 
                                                                  painelCanvas.getHeight(),
                                                                  espacoDeBusca.getLimiteMaxCoordX(),
                                                                  espacoDeBusca.getLimiteMaxCoordY());
                       

		if(!agentes.existeAgente(posicao)){//já está testando o volume do agente tb
			agente.setPosicao(posicao);
            agente.setPosicaoDestino(posicao.clone());
            agente.setComprimentoHorizontal(tamanhoPadraoAgente[0]);
            agente.setComprimentoVertical(tamanhoPadraoAgente[1]);
			agente.setVelocidadePolar(velocidadePolarPadraoAgente.clone());
			painelFerramenta.getTf_IdAgente().setText(""+agente.getIdAgente());
            painelFerramenta.getTf_Posicao().setText("("+(int)Math.round(posicao[0])+","
                                                       +(int)Math.round(posicao[1])+")");
            painelFerramenta.getTf_TamanhoAgente().setText("("+tamanhoPadraoAgente[0]+","+tamanhoPadraoAgente[1]+")");
            painelFerramenta.getTf_VelocPolar().setText("("+velocidadePolarPadraoAgente[0]+","+velocidadePolarPadraoAgente[1]+"º)");
			agentes.inserirAgente(agente);
			
			//System.out.println("Novo "+agentes.toString());

		}else{
            //Se o agente não pôde ser inserirdo, a imagem dele fica até que começe a simulação...
            JOptionPane.showMessageDialog(painelCanvas, "Agente não foi inserido!");
        }

                /////////////////////////////////
                int[] posicaoEmPx = Conversor.converterEscalaMetroParaEscalaCanvas(posicao[0],
                                                                   posicao[1],
                                                                   painelCanvas.getWidth(), 
                                                                   painelCanvas.getHeight(),
                                                                   espacoDeBusca.getLimiteMaxCoordX(),
                                                                   espacoDeBusca.getLimiteMaxCoordY());
                posicaoEmPx[1] = Math.abs(painelCanvas.getHeight() - posicaoEmPx[1]);
                System.out.println("posicao: "+ posicao[0]+","+ posicao[1] +" posicaoEmPx: "+ posicaoEmPx[0]+","+posicaoEmPx[1]);
	}


   


   
   




}
