package algoritmo;

import java.util.Vector;

public class ConjuntoDeObstaculos {
	
	Vector<Obstaculo> obstaculos = new Vector<Obstaculo>();
	
	private ConjuntoDeObstaculos(){
		
	}
	public static ConjuntoDeObstaculos getInstance(){
		return ConjuntoDeObstaculosHolder.instancia;
	}
	
	 //Classe auxiliar para criacao da instancia. Evita problemas de sincronizacao de threads.
	private static class ConjuntoDeObstaculosHolder{
		private static ConjuntoDeObstaculos instancia = new ConjuntoDeObstaculos();
	}
	public void inserirObstaculo(Obstaculo obstaculo){
		obstaculos.add(obstaculo);
	}

	public void removerObstaculo(Obstaculo obstaculo){
		obstaculos.remove(obstaculo);
	}

    public void removerTodos(){
        obstaculos.removeAllElements();
    }
    
    //Detecta se existe o obstaculo cuja area  engloba a posição passada como parametro
	public boolean existeObstaculo(double[] posicao){
		double[] posicaoObstaculo;
        //espaço ocupado pelo obstaculo
        double comprimentoHorizontal;
        double comprimentoVertical;
		for(int i = 0; i< obstaculos.size(); i++){
			posicaoObstaculo = obstaculos.get(i).getPosicao();
            comprimentoHorizontal = obstaculos.get(i).getTamanho()[0];
            comprimentoVertical = obstaculos.get(i).getTamanho()[1];

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

    public boolean existeAreaDeRepulsao(double[] pos){
        double[] posicao = pos;
		double[] posicaoObstaculo;
        //espaço ocupado pelo obstaculo
        double raioRepulsao;
        double dist;
		for(int i = 0; i< obstaculos.size(); i++){
			posicaoObstaculo = obstaculos.get(i).getPosicao();
            raioRepulsao = obstaculos.get(i).getRaioAreaRepulsao();
            dist = Math.sqrt(Math.pow((posicaoObstaculo[0] - posicao[0]), 2) + Math.pow(posicaoObstaculo[1] - posicao[1], 2));
			if(dist < raioRepulsao){
				return true;
			}
		}
		return false;
	}

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

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

	public Obstaculo get(int index){
		return obstaculos.get(index);
	}

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

    public int getNumObstaculos(){
		return obstaculos.size();
	}


}
