/*
 * Nest.java
 *
 * Created on 13 October 2006, 22:47
 *
 * To change this template, choose Tools | Template Manager
 * and open the template in the editor.
 */

package ants;

import ants.control.AntControl;
import ants.event.EnterNestAntEvent;
import ants.event.ExitNestAntEvent;
import ants.event.NewAntEvent;
import java.awt.Color;
import java.util.Vector;

/**
 *
 * @author James Hamilton
 */
public class Nest extends MyObject implements Runnable {
    
    private Vector<Ant> ants = new Vector<Ant>();
    private Vector<Food> food = new Vector<Food>();
    
    private int totalAnts = 0;
    
    private Thread move;
    
    /** Creates a new instance of Nest */
    public Nest() {

    }
    
    public Nest(GridSquare gs) {
        setGridSquare(gs);
        move = new Thread(this);
        move.setDaemon(true);
        move.start();       
    }
    
    public Nest(int n, GridSquare gs) {
        this(gs);
        addAnts(n);
        
        totalAnts = n;
    }
    
    public void addAnt() {
        Ant ant = new Ant(getGridSquare());
        ants.add(ant);
        ant.addAntListener(AntControl.getInstance());
        ant.notifyListeners(new NewAntEvent(ant));
        totalAnts++;
        AntControl.getInstance().setTotalAnts(totalAnts);
    }
    
    public void addAnts(int n) {
        for(int i = 0; i < n; i++)
            addAnt();    
    }
    
    public void releaseAnt() {
        if(ants.size() != 0) {
        //    System.out.println("Releasing Ant..");
            
            Vector<GridSquare> surroundingSquares = getGridSquare().getGridSquares(1).getFreeGridSquares();
        
           // int n = (int)(surroundingSquares.size() * Math.random());
      
        
            Ant ant = ants.remove(0);
          //  ant.setGridSquare(surroundingSquares.elementAt(n));
           // surroundingSquares.elementAt(n).setAnt(ant);
            ant.start();
            ant.notifyListeners(new ExitNestAntEvent(ant));
            
        }
    }
    
    public void addAnt(Ant ant) {
        food.add(ant.getFood());
        ant.setFood(null);
        ants.add(ant);
        System.out.println("ANT Returned to NEST");
        ant.stop();
        ant.notifyListeners(new EnterNestAntEvent(ant));
    }
    
    public void run() {

        while(move != null) {
            try {
                
                releaseAnt();
              //  System.out.println(ants.size() + " ants in nest");
                move.sleep((int)(10000 * Math.random()) + 1);
            }catch (InterruptedException e) {}
        }
    }
    
    
    public Vector<Ant> getAnts() {
        return ants;
        
    }
    
    public Color getColor() {
        return Color.LIGHT_GRAY;
    }
        
    public String toString() {
        return "Nest";
    }

    public int getTotalAnts() {
        return totalAnts;
    }
}

