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

package ambienteGrafico.ferramentas;
import algoritmo.Alvo;
import algoritmo.ConjuntoDeAlvos;
import algoritmo.EspacoDeBusca;
import ambienteGrafico.componentes.Canvas;
import ambienteGrafico.componentes.PainelFerramentaAlvos;
import auxiliar.Conversor;
import java.awt.Color;
import java.awt.Cursor;
import java.awt.Graphics2D;
import java.awt.event.MouseEvent;
import java.awt.image.BufferedImage;
import javax.swing.ImageIcon;
import javax.swing.JOptionPane;
import javax.swing.SwingUtilities;

/**
 *
 * @author Marília
 */
public class FerramentaInserirAlvo extends Ferramenta{
    
    private Cursor cursor;
    private PainelFerramentaAlvos painelFerramenta;
    private Canvas painelCanvas;
    
    private BufferedImage imagemPrincipal;
    private BufferedImage imagemAmbiente;
    private Graphics2D g2DPrincipal;
    private Graphics2D g2DAmbiente;
    private ImageIcon figura;
    
    private int posicaoXIcon;
    private int posicaoYIcon;
    private int posicaoXAlvo;
    private int posicaoYAlvo;
    
    private double[] tamanhoAlvo = new double[2];
    private java.awt.Color corTexturaAlvo = new java.awt.Color(255, 255, 255, 150);
    //Ajuda a determinar o tipo do alvo (alvo de posição x alvo de textura)
    private boolean emParaleloComFerramentasDeDesenho = false;
    
    public FerramentaInserirAlvo(PainelFerramentaAlvos painel) {
        this.cursor = new Cursor(Cursor.DEFAULT_CURSOR);
        this.painelFerramenta = painel;
    }

    public double[] getTamanhoAlvo() {
        return tamanhoAlvo;
    }

    public void setTamanhoAlvo(double[] tamanhoPadraoAlvo) {
        this.tamanhoAlvo = tamanhoPadraoAlvo;
    }

    public Color getCorTexturaAlvo() {
        return corTexturaAlvo;
    }

    public void setCorTexturaAlvo(Color corTexturaAlvo) {
        this.corTexturaAlvo = corTexturaAlvo;
    }

    public boolean isEmParaleloComFerramentasDeDesenho() {
        return emParaleloComFerramentasDeDesenho;
    }

    public void setEmParaleloComFerramentasDeDesenho(boolean emParaleloComFerramentasDeDesenho) {
        this.emParaleloComFerramentasDeDesenho = emParaleloComFerramentasDeDesenho;
    }

    public void setCursor(Cursor cursor){
        this.cursor = cursor;
    }
    
    private void inserirIconeAlvo(){
        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);

         
        if(!emParaleloComFerramentasDeDesenho){
            posicaoXAlvo = e.getX();
            posicaoYAlvo = e.getY();


            if (SwingUtilities.isLeftMouseButton(e)) {

                figura = new ImageIcon(getClass().getResource("/imagens/ImagemAlvoX.png"));
                //Converte a posicão da escala do canvas para a escala da imagem
                int[] posicaoAlvoEmPx = Conversor.converterEscalaCanvasParaEscalaImagem(
                                                        posicaoXAlvo,posicaoYAlvo,
                                                        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 = posicaoAlvoEmPx[0]-posicaoAesquerda;
                posicaoYIcon = posicaoAlvoEmPx[1]-posicaoTopo;


                System.out.println("Posicao Alvo(escl.imagem)="+posicaoAlvoEmPx[0]+","+posicaoAlvoEmPx[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));
            }
        }
        else{ //não executa escopo do mouse pressed, não cria um icone de alvo na imagem
            System.out.println("Inserir Alvo em Paralelo Com Ferramentas De Desenho -não executa MousePressed");
        }
         
    }

    @Override
    public void mouseDragged(MouseEvent e) {
        
    }

    @Override
    public void mouseReleased(MouseEvent e) {
        EspacoDeBusca espacoDeBusca = EspacoDeBusca.getInstance();
        ConjuntoDeAlvos alvos = espacoDeBusca.getAlvos();

        painelCanvas = (Canvas) e.getSource();
		Alvo alvo = new Alvo(alvos.getNumAlvos());
		
		int posicaoYAlvoInvertida = Math.abs(posicaoYAlvo - painelCanvas.getHeight());
		double[] posicao = Conversor.converterEscalaCanvasParaEscalaMetro(posicaoXAlvo,
                                                                  posicaoYAlvoInvertida, 
                                                                  painelCanvas.getWidth(), 
                                                                  painelCanvas.getHeight(),
                                                                  espacoDeBusca.getLimiteMaxCoordX(),
                                                                  espacoDeBusca.getLimiteMaxCoordY());
                
		if( !emParaleloComFerramentasDeDesenho && !alvos.existeAlvo(posicao) ){//já está testando o volume do alvo tb
			alvo.setPosicao(posicao);
            alvo.setTamanho(tamanhoAlvo);
            alvo.setCorTextura(corTexturaAlvo);
            alvo.setAtivo(true);
            
            painelFerramenta.getTf_ID().setText(""+alvo.getId());
            painelFerramenta.getTf_Posicao().setText("("+(int)Math.round(posicao[0])+","
                                                       +(int)Math.round(posicao[1])+")");
            painelFerramenta.getTf_Tamanho().setText("("+tamanhoAlvo[0]+","+tamanhoAlvo[1]+")");
            painelFerramenta.getTf_CorTextura().setText("("+alvo.getCorTextura().getRed()+","+
                                      alvo.getCorTextura().getGreen()+","+
                                      alvo.getCorTextura().getBlue()+","+
                                      alvo.getCorTextura().getAlpha()+")");
            painelFerramenta.getChb_AlvoAtivo().setSelected(alvo.isAtivo());

            alvos.inserirAlvo(alvo);
			this.painelFerramenta.getListModel().addElement("Alvo "+ alvo.getId());
			System.out.println("Alvo "+ alvo.getId());

             //Insere o icone na imagem
            inserirIconeAlvo();
		}
        else if(emParaleloComFerramentasDeDesenho && !alvos.existeAlvo(corTexturaAlvo)){
            alvo.setPosicao(posicao);
            alvo.setTamanho(tamanhoAlvo);
            alvo.setCorTextura(corTexturaAlvo);
            alvo.setAtivo(true);

            painelFerramenta.getTf_ID().setText(""+alvo.getId());
            painelFerramenta.getTf_Posicao().setText("("+(int)Math.round(posicao[0])+","
                                                       +(int)Math.round(posicao[1])+")");
            painelFerramenta.getTf_Tamanho().setText("("+tamanhoAlvo[0]+","+tamanhoAlvo[1]+")");
            painelFerramenta.getTf_CorTextura().setText("("+alvo.getCorTextura().getRed()+","+
                                      alvo.getCorTextura().getGreen()+","+
                                      alvo.getCorTextura().getBlue()+","+
                                      alvo.getCorTextura().getAlpha()+")");
            painelFerramenta.getChb_AlvoAtivo().setSelected(alvo.isAtivo());

            alvos.inserirAlvo(alvo);
			this.painelFerramenta.getListModel().addElement("Alvo "+ alvo.getId());
			System.out.println("Alvo "+ alvo.getId());
        }
        else{
            System.out.println("Não é possível inserir alvo. Espaço inviável ou cor já utilizada.");
            JOptionPane.showMessageDialog(painelCanvas, "O alvo não foi inserido!");
        }
        
    }

}
