package edu.calpoly.csc480.Entomo.Seer;

import java.awt.*;
import java.util.*;
import javax.swing.*;

import com.bcurry.www.swing.*;

import edu.calpoly.csc480.Entomo.Area.*;

public class StatusView extends BasicPanel
{
	public StatusView() {
		super(new GridBagLayout());
		
		this.delay = 5;

		this.keyCurb = new GridBagConstraints();
		this.valueCurb = new GridBagConstraints();
		
		this.values = new ArrayList();
	}

	public Dimension getMinimumSize()	{return getPreferredSize();}
	public Dimension getMaximumSize()	{return getPreferredSize();}
	public Dimension getPreferredSize() {
		return (
		 preferredSize != null ? preferredSize : super.getPreferredSize()
		);
	}

	public final int getDelay()			{return delay;}

	public void setDelay(int delay) {
		this.delay = delay;
	}

	public void setOwner(SeerView view) {
		this.view = view;
	}
	
	public void setDocument(Seer seer) {
		final Insets keyInsets   = new Insets(2, 2, 2, 4);
		final Insets valueInsets = new Insets(2, 4, 2, 2);
		
		this.seer    = seer;
		this.almanac = seer.getArea().getAlmanac();

		keyCurb.anchor = GridBagConstraints.NORTHWEST;
		keyCurb.gridx = 0;
		keyCurb.gridy = GridBagConstraints.RELATIVE;
		keyCurb.gridwidth = 1;
		keyCurb.gridheight = 1;
		keyCurb.insets = keyInsets;
		keyCurb.weightx = 0.5;
		keyCurb.weighty = 0.0;

		valueCurb.anchor = GridBagConstraints.NORTHEAST;
		valueCurb.gridx = 1;
		valueCurb.gridy = GridBagConstraints.RELATIVE;
		valueCurb.gridwidth = 1;
		valueCurb.gridheight = 1;
		valueCurb.insets = valueInsets;
		valueCurb.weightx = 0.5;
		valueCurb.weighty = 0.0;

		removeAll();

		stateIndex = addLabel("State:", "1234567890");
		cycleIndex = addLabel("Cycle:", 0);

		antsLeftIndex = addLabel("Ants Remaining:", 0);
		antsGoneIndex = addLabel("Ants Perished:", 0);

		foodLeftIndex = addLabel("Food Remaining:", 0);
		foodGoneIndex = addLabel("Food Collected:", 0);

		packWindow();
		preferredSize = getPreferredSize();
	}

	public void updateComponents() {
		doNext();
	}

	public void next() {
		if (seer.getCycle() % delay == 0) {
			doNext();
		}
	}

	protected static String stateNames[];
	
	static {
		stateNames = new String[Seer.numStates];

		stateNames[Seer.waitingState]  = "Waiting";
		stateNames[Seer.runningState]  = "Running";
		stateNames[Seer.pausedState]   = "Paused";
		stateNames[Seer.stoppedState]  = "Stopped";
		stateNames[Seer.finishedState] = "Finished";
	}

	protected Seer seer;
	protected SeerView view;
	protected Almanac almanac;

	protected Font font;
	protected Dimension preferredSize;
	protected GridBagConstraints keyCurb, valueCurb;

	protected java.util.List keys, values;
	
	protected int stateIndex, cycleIndex;
	protected int antsLeftIndex, antsGoneIndex;
	protected int foodLeftIndex, foodGoneIndex;

	protected int delay;

	protected void doNext() {
		setLabel(stateIndex, stateNames[seer.getState()]);
		setLabel(cycleIndex, seer.getCycle());

		setLabel(antsLeftIndex, almanac.antsLeft);
		setLabel(antsGoneIndex, almanac.antsGone);

		setLabel(foodLeftIndex, almanac.foodLeft);
		setLabel(foodGoneIndex, almanac.foodGone);
	}
	
	protected final int addLabel(String key, String value) {
		JLabel valueLabel;
		
		add(new JLabel(key, JLabel.RIGHT), keyCurb);
		add(valueLabel = new JLabel(value, JLabel.LEFT), valueCurb);
		
		values.add(valueLabel);
		return values.size() - 1;
	}

	protected final int addLabel(String key, long value) {
		return addLabel(key, "" + value);
	}
	
	protected final void setLabel(int row, String value) {
		((JLabel)values.get(row)).setText(value);
	}

	protected final void setLabel(int row, long value) {
		setLabel(row, "" + value);
	}
}