/*
 * GridVector.java
 *
 * Created on 24 November 2006, 17:55
 *
 * To change this template, choose Tools | Template Manager
 * and open the template in the editor.
 */

package ants;

/**
 *
 * @author James Hamilton
 */
public class GridVector extends java.util.Vector<GridSquare> {
    
    /** Creates a new instance of GridVector */
    public GridVector() {
        super();
    }
    
    public double getFoodStrength() {
        double sum = 0;
        for(GridSquare gs : this)
            sum += gs.getFoodStrength();
        return sum;
    }
 
    public double getPheromoneStrength() {
        double sum = 0;
        for(GridSquare gs : this)
            sum += gs.getPheromoneStrength();
        return sum;
    }    
    
    public int getPheromoneStrength(int direction) {
        int sum = 0;
        for(GridSquare gs : this)
            if(gs.getPheromone().getDirection() == direction)
                sum += gs.getPheromoneStrength();
        return sum;
    }    
    
    public boolean containsFood() {
        return getFoodGridSquares().size() != 0;
    }

    public GridVector getGridSquaresInDirection(GridSquare gs1, int direction) {
        GridVector gridVector = new GridVector();
        for(GridSquare gs : this)
            if(gs1.getDirectionOf(gs) == direction || 
                gs1.getDirectionOf(gs) == GridSquare.getPreviousDirection(direction) || 
                gs1.getDirectionOf(gs) == GridSquare.getNextDirection(direction))
                gridVector.add(gs);
        return gridVector;        
    }
 
    public GridVector getFoodGridSquares() {
        GridVector gridVector = new GridVector();
        for(GridSquare gs : this)
            if(gs.containsFood())
                gridVector.add(gs);
        return gridVector;
    }
 
    public GridVector getFoodStrengthGridSquares() {
        GridVector gridVector = new GridVector();
        for(GridSquare gs : this)
            if(gs.getFoodStrength() > 0)
                gridVector.add(gs);
        return gridVector;
    }    
    
     public boolean containsNest() {
        GridVector gridVector = new GridVector();
        for(GridSquare gs : this)
            if(gs.isNest())
                return true;
        return false;
    }
     
    public GridVector getPheromoneGridSquares() {
        GridVector gridVector = new GridVector();
        for(GridSquare gs : this)
            if(gs.getPheromoneStrength() > 0)
                gridVector.add(gs);
        return gridVector;
    }    
    
    public GridVector getPheromoneGridSquares(int direction) {
        GridVector gridVector = new GridVector();
        for(GridSquare gs : this)
            if(gs.getPheromoneStrength() > 0 && gs.getPheromone().getDirection() == direction)
                gridVector.add(gs);
        return gridVector;
    }     
  
    public GridVector getPheromoneGridSquares(int direction, Ant ant) {
        GridVector gridVector = new GridVector();
        for(GridSquare gs : this)
            if(gs.getPheromoneStrength() > 0 && 
		gs.getPheromone().getDirection() == direction && 
		gs.getPheromone().laidBy(ant))
                	gridVector.add(gs);
        return gridVector;
    }   
    
    public GridSquare getGridSquare(Ant ant) {
        for(GridSquare gs : this)
            if(gs.getPheromoneStrength() > 0 && gs.getPheromone().laidBy(ant))
                return gs;
        return null;       
    }
    
    public GridVector getPheromoneGridSquares(Ant ant, boolean own) {
        GridVector gridVector = new GridVector();
        if(own) {
            for(GridSquare gs : this)
                if(gs.getPheromoneStrength() > 0 && gs.getPheromone().laidBy(ant))
                    gridVector.add(gs);
        }else{
             for(GridSquare gs : this)
                if(gs.getPheromoneStrength() > 0 && !gs.getPheromone().laidBy(ant))
                    gridVector.add(gs);           
            
        }
        return gridVector;
    }
    
    public GridVector getPheromoneGridSquares(Ant ant) {
        return getPheromoneGridSquares(ant, true);
    }    
    
    public GridVector getFreeGridSquares() {
        GridVector gridVector = new GridVector();
        
        for(GridSquare gs : this)
            if(!gs.containsObstacle() && !gs.containsAnt())
                gridVector.add(gs);
        return gridVector;
    }

    public GridVector getEmptyGridSquares() {
        GridVector gridVector = new GridVector();
        for(GridSquare gs : this)
            if(gs.getObject() == null || gs.isNest())
                gridVector.add(gs);
        return gridVector;
    }
    
    public GridVector getGridSquaresWithoutNest() {
        GridVector gridVector = new GridVector();
        for(GridSquare gs : this)
            if(!gs.isNest())
                gridVector.add(gs);
        return gridVector;           
    }
    
    public GridSquare getRandomGridSquare() {
        return elementAt((int)(Math.random() * size()));
    }
    
    public GridSquare getRandomGridSquare(boolean bias) {
        return elementAt((int)(Math.random() * Math.sqrt(size())) * (int)(Math.random() *Math.sqrt(size())));
    }
    
    public GridSquare getMiddleGridSquare() {
        return elementAt((int)Math.floor(size() / 2));
    }
    
    public GridSquare firstElementNot(GridSquare otherGS) {
        
        for(GridSquare gs : this)
            if(!gs.equals(otherGS))
                 return gs;       
       return firstElement();
    }

    public void addObstacles() {
        for(GridSquare gs : this)
            gs.setObject(new Obstacle(gs));    
    }
    
    public void addFood() {
        for(GridSquare gs : this)
            gs.setObject(new Food(gs));    
    }
}

