package edu.calpoly.csc480.Corral.Seer;

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

import edu.calpoly.csc480.Corral.Agent.*;
import edu.calpoly.csc480.Corral.Agent.InformedAgent.*;
import edu.calpoly.csc480.Corral.Agent.UninformedAgent.*;
import edu.calpoly.csc480.Corral.Area.*;

public class StatusView extends BaseStatusView
{
	public StatusView() {
	}
	
	public void agentSelected(BaseMeans baseMeans) {
		super.agentSelected(means);
		
		this.baseMeans = baseMeans;
		this.baseAgent = baseMeans.getAgent();
		
		if (baseMeans instanceof Means) {
			means = (Means)baseMeans;
			location = addTidbit(
			 "Location:", pointToString(means.getLocation()));
			pathCost = addTidbit(
			 "Path Cost:", means.getPathCost());
		}

		if (baseAgent instanceof IDAgent) {
			idAgent = (IDAgent)baseAgent;
			depthLevel = addTidbit("Depth Level:", idAgent.getCurrentDepth());
		}
		else if (baseAgent instanceof GreedyAgent) {
			greedyAgent = (GreedyAgent)baseAgent;
			guessCost = addTidbit(
			 "Goal Cost:", ((InformedMeans)means).getGuessCost());
		}
		else if (baseAgent instanceof StarAgent) {
			starAgent = (StarAgent)baseAgent;
			guessCost = addTidbit(
			 "Goal Cost:", ((InformedMeans)means).getGuessCost());
			totalCost = addTidbit(
			 "Total Cost:", ((InformedMeans)means).getTotalCost());
		}
		
		next();
	}
	
	public void agentUnselected() {
		super.agentUnselected();
		
		baseMeans = means = informedMeans = null;
		next();
	}
	
	public void next() {
		super.next();
		
		if (means != null) {
			setTidbit(location, pointToString(means.getLocation()));
			setTidbit(pathCost, means.getPathCost());
		}
		
		if (idAgent != null) {
			setTidbit(depthLevel, idAgent.getCurrentDepth());
		}
		else if (greedyAgent != null) {
			setTidbit(guessCost, ((InformedMeans)means).getGuessCost());
		}
		else if (starAgent != null) {
			setTidbit(guessCost, ((InformedMeans)means).getGuessCost());
			setTidbit(totalCost, ((InformedMeans)means).getTotalCost());
		}
	}
	
	protected BaseAgent baseAgent;
	protected IDAgent idAgent;
	protected GreedyAgent greedyAgent;
	protected StarAgent starAgent;
	
	protected BaseMeans baseMeans;
	protected Means means;
	protected InformedMeans informedMeans;

	protected int location, pathCost;
	protected int depthLevel;
	protected int guessCost, totalCost;

	static protected String pointToString(Point point) {
		return "(" + point.x + ", " + point.y + ")";
	}
}