/*
 * AntControl.java
 *
 * Created on 28 November 2006, 00:49
 */

package ants.control;

import ants.Ant;
import ants.Grid;
import ants.event.AntEvent;
import ants.event.AntListener;
import ants.event.EnterNestAntEvent;
import ants.event.ExitNestAntEvent;
import ants.event.FoodUpdateEvent;
import ants.event.NewAntEvent;
import ants.event.PickedUpFoodAntEvent;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.DefaultListModel;

/**
 *
 * @author  James Hamilton
 */
public class AntControl extends javax.swing.JFrame implements AntListener, Runnable {
    
    private static AntControl singleton = null;
    
    private int totalAnts = 0;
    private int antsInNest = 0;
    private int antsRoaming = 0;
    private int antsCarryingFood = 0;
    
    private int totalFood = 0;
    private int collectedFood = 0;
    private int remainingFood = 0;

    private long startTime = System.currentTimeMillis();

    private boolean running = true;
    
    private Thread move;
    private DefaultListModel myAnts = new DefaultListModel();
    /** Creates new form AntControl */
    public AntControl() {
        initComponents();
        
        this.setLocation(500, 0);
 
       btnPause.addActionListener( new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                for(Ant a : Grid.getInstance().getNest().getAnts()) {
                    a.pause();
                }
            }
        });
        
        move = new Thread(this);
        move.setDaemon(true);
        move.start();   
        

    }
    
    public void antEventHandler(AntEvent event) {
        if(event instanceof NewAntEvent) {
            totalAnts++;
            antsInNest++;
            Ant a = (Ant)event.getSource();
            myAnts.addElement(a);
            lstAnts.setModel(myAnts);
           
        }else if(event instanceof ExitNestAntEvent) {
            antsRoaming++;
            antsInNest--;
        }else if(event instanceof EnterNestAntEvent) {
            antsCarryingFood--;
            antsInNest++;
            collectedFood++;
            remainingFood = Grid.getInstance().getGridSquares().getFoodGridSquares().size();//totalFood - collectedFood;
        }else if(event instanceof PickedUpFoodAntEvent) {
            antsCarryingFood++;
            antsRoaming--;
        }else if(event instanceof FoodUpdateEvent) {
            totalFood = Grid.getInstance().getGridSquares().getFoodGridSquares().size();
            remainingFood = totalFood;
        }     
        
        txtNumberOfAnts.setText(Integer.toString(getTotalAnts()));
        txtNumberOfAntsInNest.setText(Integer.toString(getAntsInNest()));
        txtNumberOfAntsCarryingFood.setText(Integer.toString(getAntsCarryingFood()));
        txtNumberOfAntsRoaming.setText(Integer.toString(getAntsRoaming()));
 
        txtTotalFood.setText(Integer.toString(getTotalFood()));
        txtCollectedFood.setText(Integer.toString(getCollectedFood()));
        txtRemainingFood.setText(Integer.toString(getRemainingFood()));
         if(remainingFood == 0) running = false;
         else running = true;
    }
 
    public void run() {
        while(running) {
            long currentTime = (System.currentTimeMillis() - startTime);
            
            txtTime.setText(millisecondsToString(currentTime));
               
            try {
                
                move.sleep(1000);
            }catch (InterruptedException e) {
                
            }
        }
    }

    public static String millisecondsToString(long time) {
        //http://www.uk-dave.com/bytes/java/long2time.php
        int milliseconds = (int)(time % 1000);
        int seconds = (int)((time/1000) % 60);
        int minutes = (int)((time/60000) % 60);
        int hours = (int)((time/3600000) % 24);
        String millisecondsStr = (milliseconds<10 ? "00" : (milliseconds<100 ? "0" : ""))+milliseconds;
        String secondsStr = (seconds<10 ? "0" : "")+seconds;
        String minutesStr = (minutes<10 ? "0" : "")+minutes;
        String hoursStr = (hours<10 ? "0" : "")+hours;
        return new String(hoursStr+":"+minutesStr+":"+secondsStr);//+"."+millisecondsStr);
    }
    
    public static AntControl getInstance() {
        if(getSingleton() == null)
            setSingleton(new AntControl());
        return getSingleton();
    }
    
    /** This method is called from within the constructor to
     * initialize the form.
     * WARNING: Do NOT modify this code. The content of this method is
     * always regenerated by the Form Editor.
     */
    // <editor-fold defaultstate="collapsed" desc=" Generated Code ">//GEN-BEGIN:initComponents
    private void initComponents() {
        jLabel1 = new javax.swing.JLabel();
        jLabel2 = new javax.swing.JLabel();
        jLabel3 = new javax.swing.JLabel();
        txtNumberOfAntsInNest = new javax.swing.JTextField();
        txtNumberOfAntsRoaming = new javax.swing.JTextField();
        jLabel4 = new javax.swing.JLabel();
        jLabel5 = new javax.swing.JLabel();
        txtNumberOfAntsCarryingFood = new javax.swing.JTextField();
        jLabel6 = new javax.swing.JLabel();
        txtNumberOfAnts = new javax.swing.JTextField();
        txtTotalFood = new javax.swing.JTextField();
        jLabel7 = new javax.swing.JLabel();
        jLabel8 = new javax.swing.JLabel();
        jLabel9 = new javax.swing.JLabel();
        txtCollectedFood = new javax.swing.JTextField();
        txtRemainingFood = new javax.swing.JTextField();
        jLabel10 = new javax.swing.JLabel();
        jLabel11 = new javax.swing.JLabel();
        txtTime = new javax.swing.JTextField();
        jScrollPane1 = new javax.swing.JScrollPane();
        lstAnts = new javax.swing.JList();
        btnPause = new javax.swing.JButton();

        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
        jLabel1.setText("Ants");

        jLabel2.setText("Total");

        jLabel3.setText("In Nest");

        txtNumberOfAntsInNest.setEditable(false);

        txtNumberOfAntsRoaming.setEditable(false);

        jLabel4.setText("Roaming");

        jLabel5.setText("Carrying Food");

        txtNumberOfAntsCarryingFood.setEditable(false);

        txtNumberOfAnts.setEditable(false);

        txtTotalFood.setEditable(false);

        jLabel7.setText("Food");

        jLabel8.setText("Total");

        jLabel9.setText("Collected");

        txtCollectedFood.setEditable(false);

        txtRemainingFood.setEditable(false);

        jLabel10.setText("Remaining");

        jLabel11.setText("Time Elapsed");

        txtTime.setEditable(false);

        lstAnts.setSelectionMode(javax.swing.ListSelectionModel.SINGLE_SELECTION);
        jScrollPane1.setViewportView(lstAnts);

        btnPause.setText("Pause");

        org.jdesktop.layout.GroupLayout layout = new org.jdesktop.layout.GroupLayout(getContentPane());
        getContentPane().setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
            .add(layout.createSequentialGroup()
                .addContainerGap()
                .add(jScrollPane1, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 93, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)
                .add(layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
                    .add(layout.createSequentialGroup()
                        .add(40, 40, 40)
                        .add(layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
                            .add(layout.createSequentialGroup()
                                .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED)
                                .add(layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
                                    .add(layout.createSequentialGroup()
                                        .add(41, 41, 41)
                                        .add(jLabel6, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, 27, Short.MAX_VALUE)
                                        .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED)
                                        .add(layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
                                            .add(layout.createSequentialGroup()
                                                .add(layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
                                                    .add(txtNumberOfAntsInNest, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, 27, Short.MAX_VALUE)
                                                    .add(txtNumberOfAntsRoaming, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, 27, Short.MAX_VALUE)
                                                    .add(txtNumberOfAntsCarryingFood, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, 27, Short.MAX_VALUE))
                                                .add(25, 25, 25))
                                            .add(layout.createSequentialGroup()
                                                .add(txtNumberOfAnts, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 27, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)
                                                .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED)))
                                        .add(layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
                                            .add(jLabel2, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 36, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)
                                            .add(jLabel5)
                                            .add(jLabel4)
                                            .add(jLabel3))
                                        .add(391, 391, 391))
                                    .add(layout.createSequentialGroup()
                                        .add(53, 53, 53)
                                        .add(layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
                                            .add(jLabel1)
                                            .add(jLabel7))
                                        .add(506, 506, 506))))
                            .add(layout.createSequentialGroup()
                                .add(68, 68, 68)
                                .add(layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
                                    .add(layout.createSequentialGroup()
                                        .add(txtTotalFood, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 27, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)
                                        .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED))
                                    .add(layout.createSequentialGroup()
                                        .add(txtCollectedFood, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 27, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)
                                        .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED))
                                    .add(layout.createSequentialGroup()
                                        .add(txtRemainingFood, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 27, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)
                                        .add(25, 25, 25)))
                                .add(layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
                                    .add(jLabel9)
                                    .add(jLabel8)
                                    .add(jLabel10))
                                .add(414, 414, 414))))
                    .add(org.jdesktop.layout.GroupLayout.TRAILING, layout.createSequentialGroup()
                        .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED)
                        .add(btnPause)
                        .add(30, 30, 30)
                        .add(jLabel11)
                        .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED)
                        .add(txtTime, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 69, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)
                        .add(178, 178, 178))))
        );

        layout.linkSize(new java.awt.Component[] {txtNumberOfAntsCarryingFood, txtNumberOfAntsInNest, txtNumberOfAntsRoaming}, org.jdesktop.layout.GroupLayout.HORIZONTAL);

        layout.setVerticalGroup(
            layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
            .add(layout.createSequentialGroup()
                .addContainerGap()
                .add(jLabel1)
                .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED)
                .add(layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING, false)
                    .add(jScrollPane1, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 254, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)
                    .add(layout.createSequentialGroup()
                        .add(layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
                            .add(jLabel6, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 17, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)
                            .add(layout.createSequentialGroup()
                                .add(layout.createParallelGroup(org.jdesktop.layout.GroupLayout.BASELINE)
                                    .add(jLabel2)
                                    .add(txtNumberOfAnts, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE))
                                .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED)
                                .add(layout.createParallelGroup(org.jdesktop.layout.GroupLayout.BASELINE)
                                    .add(txtNumberOfAntsInNest, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)
                                    .add(jLabel3))
                                .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED)
                                .add(layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
                                    .add(layout.createSequentialGroup()
                                        .add(txtNumberOfAntsRoaming, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)
                                        .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED)
                                        .add(layout.createParallelGroup(org.jdesktop.layout.GroupLayout.BASELINE)
                                            .add(txtNumberOfAntsCarryingFood, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)
                                            .add(jLabel5)))
                                    .add(jLabel4))
                                .add(10, 10, 10)
                                .add(jLabel7)))
                        .add(27, 27, 27)
                        .add(layout.createParallelGroup(org.jdesktop.layout.GroupLayout.BASELINE)
                            .add(txtTotalFood, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)
                            .add(jLabel8))
                        .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED)
                        .add(layout.createParallelGroup(org.jdesktop.layout.GroupLayout.BASELINE)
                            .add(jLabel9)
                            .add(txtCollectedFood, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE))
                        .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED)
                        .add(layout.createParallelGroup(org.jdesktop.layout.GroupLayout.BASELINE)
                            .add(txtRemainingFood, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)
                            .add(jLabel10))
                        .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                        .add(layout.createParallelGroup(org.jdesktop.layout.GroupLayout.BASELINE)
                            .add(jLabel11)
                            .add(txtTime, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)
                            .add(btnPause))))
                .addContainerGap(26, Short.MAX_VALUE))
        );
        pack();
    }// </editor-fold>//GEN-END:initComponents
    
    /**
     * @param args the command line arguments
     */
    public static void main(String...args) {
        java.awt.EventQueue.invokeLater(new Runnable() {
            public void run() {
                new AntControl().setVisible(true);
            }
        });
    }

    public static AntControl getSingleton() {
        return singleton;
    }

    public static void setSingleton(AntControl aSingleton) {
        singleton = aSingleton;
    }

    public int getTotalAnts() {
        return totalAnts;
    }

    public void setTotalAnts(int totalAnts) {
        this.totalAnts = totalAnts;
    }

    public int getAntsInNest() {
        return antsInNest;
    }

    public void setAntsInNest(int antsInNest) {
        this.antsInNest = antsInNest;
    }

    public int getAntsRoaming() {
        return antsRoaming;
    }

    public void setAntsRoaming(int antsRoaming) {
        this.antsRoaming = antsRoaming;
    }

    public int getAntsCarryingFood() {
        return antsCarryingFood;
    }

    public void setAntsCarryingFood(int antsCarryingFood) {
        this.antsCarryingFood = antsCarryingFood;
    }

    public int getTotalFood() {
        return totalFood;
    }

    public void setTotalFood(int totalFood) {
        this.totalFood = totalFood;
    }

    public int getCollectedFood() {
        return collectedFood;
    }

    public void setCollectedFood(int collectedFood) {
        this.collectedFood = collectedFood;
    }

    public int getRemainingFood() {
        return remainingFood;
    }

    public void setRemainingFood(int remainingFood) {
        this.remainingFood = remainingFood;
    }
    
    // Variables declaration - do not modify//GEN-BEGIN:variables
    private javax.swing.JButton btnPause;
    private javax.swing.JLabel jLabel1;
    private javax.swing.JLabel jLabel10;
    private javax.swing.JLabel jLabel11;
    private javax.swing.JLabel jLabel2;
    private javax.swing.JLabel jLabel3;
    private javax.swing.JLabel jLabel4;
    private javax.swing.JLabel jLabel5;
    private javax.swing.JLabel jLabel6;
    private javax.swing.JLabel jLabel7;
    private javax.swing.JLabel jLabel8;
    private javax.swing.JLabel jLabel9;
    private javax.swing.JScrollPane jScrollPane1;
    private javax.swing.JList lstAnts;
    private javax.swing.JTextField txtCollectedFood;
    private javax.swing.JTextField txtNumberOfAnts;
    private javax.swing.JTextField txtNumberOfAntsCarryingFood;
    private javax.swing.JTextField txtNumberOfAntsInNest;
    private javax.swing.JTextField txtNumberOfAntsRoaming;
    private javax.swing.JTextField txtRemainingFood;
    private javax.swing.JTextField txtTime;
    private javax.swing.JTextField txtTotalFood;
    // End of variables declaration//GEN-END:variables
    
}

