package algoritmo;

import java.util.Vector;

public class ConjuntoDeAlvos {

	
	Vector<Alvo> alvos= new Vector<Alvo>();
	
	
	private ConjuntoDeAlvos(){
		
	}
	
	//Retorna a instancia unica da classe SingletonLog
    public static ConjuntoDeAlvos getInstance() {
        return ConjuntoDeAlvosHolder.instancia;
    }

	 //Classe auxiliar para criacao da instancia. Evita problemas de sincronizacao de threads.
    private static class ConjuntoDeAlvosHolder {
           private static ConjuntoDeAlvos instancia = new ConjuntoDeAlvos();
    }

	
    public void inserirAlvo(Alvo alvo){
		alvos.add(alvo);
	}

	public void removerAlvo(Alvo alvo){
		alvos.remove(alvo);
	}

    public void removerTodos(){
        alvos.removeAllElements();
    }

    //Detecta se existe o alvo cuja area  engloba a posição passada como parametro
	public boolean existeAlvo(double[] posicao){
		double[] posicaoAlvo;
        //espaço ocupado pelo alvo
        double comprimentoHorizontal;
        double comprimentoVertical;
		for(int i = 0; i< alvos.size(); i++){
			posicaoAlvo = alvos.get(i).getPosicao();
            comprimentoHorizontal = alvos.get(i).getTamanho()[0];
            comprimentoVertical = alvos.get(i).getTamanho()[1];

			if(posicaoAlvo[0]-comprimentoHorizontal<=posicao[0] && posicao[0]<=posicaoAlvo[0]+comprimentoHorizontal
                           && posicaoAlvo[1]-comprimentoVertical<=posicao[1] && posicao[1]<=posicaoAlvo[1]+comprimentoVertical){
				return true;
			}
		}
		return false;
	}

    //Detecta se existe o alvo cuja cor é igual a cor passada como parametro
	public boolean existeAlvo(java.awt.Color corTexturaNovoAlvo){
		java.awt.Color corAlvo;

        int novoRed = corTexturaNovoAlvo.getRed();
        int novoGreen = corTexturaNovoAlvo.getGreen();
        int novoBlue = corTexturaNovoAlvo.getBlue();
        int novoAlpha = corTexturaNovoAlvo.getAlpha();

        int red,green,blue,alpha;

		for(int i = 0; i< alvos.size(); i++){
			corAlvo = alvos.get(i).getCorTextura();
            
            red = corAlvo.getRed();
            green = corAlvo.getGreen();
            blue = corAlvo.getBlue();
            alpha = corAlvo.getAlpha();

			if(red == novoRed && green == novoGreen && blue == novoBlue && alpha == novoAlpha){
				return true;
			}
		}
		return false;
	}

    //Detecta o alvo cuja area  engloba a posição passada como parametro
    public Alvo buscarAlvo(double[] posicao){
		double[] posicaoAlvo;
        //espaço ocupado pelo alvo
        double comprimentoHorizontal;
        double comprimentoVertical;
		for(int i = 0; i< alvos.size(); i++){
			posicaoAlvo = alvos.get(i).getPosicao();
            comprimentoHorizontal = alvos.get(i).getTamanho()[0];
            comprimentoVertical = alvos.get(i).getTamanho()[1];

			if(posicaoAlvo[0]-comprimentoHorizontal<=posicao[0] && posicao[0]<=posicaoAlvo[0]+comprimentoHorizontal
                           && posicaoAlvo[1]-comprimentoVertical<=posicao[1] && posicao[1]<=posicaoAlvo[1]+comprimentoVertical){
				return alvos.get(i);
			}
		}
		return null;
	}

	public Alvo get(int index){
		return alvos.get(index);
	}

	public String toString(){
		String retorno = "Conjunto de Alvos:";
		for(int i =0; i<alvos.size();i++){
			retorno += "\n"+ alvos.get(i).toString();
		}
		return retorno;
	}

    public int getNumAlvos(){
		return alvos.size();
	}
}
