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

package ambienteGrafico.ferramentas;

import algoritmo.Obstaculo;
import algoritmo.ConjuntoDeObstaculos;
import algoritmo.EspacoDeBusca;
import ambienteGrafico.componentes.Canvas;
import ambienteGrafico.componentes.PainelFerramentaObstaculos;
import auxiliar.Conversor;
import java.awt.Cursor;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.Toolkit;
import java.awt.event.MouseEvent;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.imageio.ImageIO;
import javax.swing.ImageIcon;
import javax.swing.JOptionPane;
import javax.swing.SwingUtilities;
/**
 *
 * @author Marília
 */
public class FerramentaInserirObstaculo extends Ferramenta {
    private Cursor cursor;
    private PainelFerramentaObstaculos painelFerramenta;
    private Canvas painelCanvas;

    private BufferedImage imagemPrincipal;
    private BufferedImage imagemAmbiente;
    private Graphics2D g2DPrincipal;
    private Graphics2D g2DAmbiente;
    private ImageIcon figura;
    private String caminhoFigura;

    private int posicaoXIcon;
    private int posicaoYIcon;
    private int posicaoXObstaculo;
    private int posicaoYObstaculo;

    private double[] tamanhoObstaculo = new double[2];
    double raioAreaRepulsaoDoObstaculo = 1;//1m

    public FerramentaInserirObstaculo(PainelFerramentaObstaculos painel) {
        this.cursor = new Cursor(Cursor.DEFAULT_CURSOR);
        this.painelFerramenta = painel;
        this.figura = new ImageIcon(getClass().getResource("/imagens/ImagemAlvoX.png"));
        this.caminhoFigura = "/imagens/ImagemAlvoX.png";
    }

    public double[] getTamanhoObstaculo() {
        return tamanhoObstaculo;
    }

    public void setTamanhoObstaculo(double[] tamanhoPadraoObstaculo) {
        this.tamanhoObstaculo = tamanhoPadraoObstaculo;
    }

    public double getRaioAreaRepulsaoDoObstaculo() {
        return raioAreaRepulsaoDoObstaculo;
    }

    public void setRaioAreaRepulsaoDoObstaculo(double raioAreaRepulsaoDoObstaculo) {
        this.raioAreaRepulsaoDoObstaculo = raioAreaRepulsaoDoObstaculo;
    }

    public void setCursor(Cursor cursor){
        this.cursor = cursor;
    }

    public void  mudarFiguraObstaculo(String caminhoImagem){
        
        this.figura = new ImageIcon(Toolkit.getDefaultToolkit().getImage((getClass().getResource(caminhoImagem))));
        this.caminhoFigura = caminhoImagem;
    }
    private void inserirIconeObstaculo(Obstaculo obstaculo){

        painelCanvas.pintarAreaRepulsaoDoObstaculo(obstaculo, null);

        figura.paintIcon(painelCanvas, g2DPrincipal, posicaoXIcon,posicaoYIcon );
        //figura.paintIcon(painelCanvas, g2DAmbiente, posicaoXIcon,posicaoYIcon );

        imagemPrincipal.flush();
        //imagemAmbiente.flush();
        painelCanvas.repaint();
    }

    @Override
    public Cursor getCursor() {
        return this.cursor;
    }

    @Override
    public void mousePressed(MouseEvent e) {
        painelCanvas = (Canvas) e.getSource();

        imagemPrincipal = painelCanvas.getImagemPrincipal();
        imagemAmbiente = painelCanvas.getImagemAmbiente();
        g2DPrincipal = imagemPrincipal.createGraphics();
        g2DAmbiente = imagemAmbiente.createGraphics();

        painelCanvas.setImagemPrincipal(imagemPrincipal);
        painelCanvas.setImagemAmbiente(imagemAmbiente);

        posicaoXObstaculo = e.getX();
        posicaoYObstaculo = e.getY();


        if (SwingUtilities.isLeftMouseButton(e)) {

           
            //Converte a posicão da escala do canvas para a escala da imagem
            int[] posicaoObstaculoEmPx = Conversor.converterEscalaCanvasParaEscalaImagem(
                                                    posicaoXObstaculo,posicaoYObstaculo,
                                                    painelCanvas.getWidth(),painelCanvas.getHeight(),
                                                    imagemPrincipal.getWidth(), imagemPrincipal.getHeight());

            int posicaoAesquerda = figura.getIconWidth()/2;
            int posicaoTopo = figura.getIconHeight()/2;
            //Centra o meio da imagem na posição que queremos
            posicaoXIcon = posicaoObstaculoEmPx[0]-posicaoAesquerda;
            posicaoYIcon = posicaoObstaculoEmPx[1]-posicaoTopo;


            System.out.println("Posicao Obstaculo(escl.imagem)="+posicaoObstaculoEmPx[0]+","+posicaoObstaculoEmPx[1]
                                +" posicaoIcon="+posicaoXIcon+","+posicaoYIcon
                                +" imagemWidth="+imagemPrincipal.getWidth()+" imagemHeight"+imagemPrincipal.getHeight()
                                +" canvasWidth="+painelCanvas.getWidth()+" canvasHeight="+painelCanvas.getHeight());

            /*Obs: Espera para inserir o ícone quando tiver certeza que a
                   inserção foi completada com sucesso na lista de obstaculos
                   Ver método: MouseRelease*/
         }
        else{
            painelCanvas.mudarFerramenta(new FerramentaNula(null));
        }

    }

    @Override
    public void mouseDragged(MouseEvent e) {

    }

    @Override
    public void mouseReleased(MouseEvent e) {
        EspacoDeBusca espacoDeBusca = EspacoDeBusca.getInstance();
        ConjuntoDeObstaculos obstaculos = espacoDeBusca.getObstaculos();

        painelCanvas = (Canvas) e.getSource();
		Obstaculo obstaculo = new Obstaculo(obstaculos.getNumObstaculos());

		int posicaoYObstaculoInvertida = Math.abs(posicaoYObstaculo - painelCanvas.getHeight());
		double[] posicao = Conversor.converterEscalaCanvasParaEscalaMetro(posicaoXObstaculo,
                                                                  posicaoYObstaculoInvertida,
                                                                  painelCanvas.getWidth(),
                                                                  painelCanvas.getHeight(),
                                                                  espacoDeBusca.getLimiteMaxCoordX(),
                                                                  espacoDeBusca.getLimiteMaxCoordY());

		if(!obstaculos.existeObstaculo(posicao)){//já está testando o volume do obstaculo tb
			obstaculo.setPosicao(posicao);
            obstaculo.setTamanho(tamanhoObstaculo);
            obstaculo.setRaioAreaRepulsao(raioAreaRepulsaoDoObstaculo);
            obstaculo.setAtivo(true);
            obstaculo.setCaminhoImagem(caminhoFigura);
            painelFerramenta.getTf_ID().setText(""+obstaculo.getId());
            painelFerramenta.getTf_Posicao().setText("("+(int)Math.round(posicao[0])+","
                                                       +(int)Math.round(posicao[1])+")");
            painelFerramenta.getTf_Tamanho().setText("("+tamanhoObstaculo[0]+","+tamanhoObstaculo[1]+")");
            painelFerramenta.getTf_RaioRepulsao().setText(""+raioAreaRepulsaoDoObstaculo);

            obstaculos.inserirObstaculo(obstaculo);
			this.painelFerramenta.getListModel().addElement("Obstaculo "+ obstaculo.getId());
			System.out.println("Obstaculo "+ obstaculo.getId());

            //Insere o icone na imagem
            inserirIconeObstaculo(obstaculo);
           
		}
        else{
            System.out.println("Não é possível inserir obstaculo. Espaço inviável.");
            JOptionPane.showMessageDialog(painelCanvas, "Obstáculo não foi inserido!");
        }

    }



}
