package edu.calpoly.csc480.Corral.Area;

import java.awt.*;
import java.io.*;
import java.util.*;

import edu.calpoly.csc480.Corral.Agent.*;
import edu.calpoly.csc480.Corral.Agent.Util.*;
import edu.calpoly.csc480.Corral.Tile.*;
import edu.calpoly.csc480.Corral.Tile.PlotTile.*;

public class Area
{
	public Area() {
	}

	final public BaseTile getDawnTile()	{return dawnTile;}
	final public BaseTile getGoalTile()	{return goalTile;}
	
	protected DawnTile dawnTile;
	protected GoalTile goalTile;
	
	protected BaseAreaView makeView()	{return new AreaView();}
	protected BeamTiles  makeTiles()		{return new Tiles();}
	

	protected BaseTile toTile(char in) {
		BaseTile tile;

		switch (in) {
		case '-':
		case '|':
		case 'X': tile = new WallTile(); break;
		case 'S': tile = dawnTile = new DawnTile(); break;
		case 'G': tile = goalTile = new GoalTile(); break;
		case ' ': tile = new DirtTile(0); break;
		default:
			if (Character.isDigit(in)) {
				tile = new DirtTile(Character.getNumericValue(in));
			}
			else {
				tile = null;
			}
		}

		return tile;
	}

	public void initMeans() {
		int drift;
		Point point, nearPoint;
		BaseTile nearTile;

		point = dawnTile.getLocation();
		means.setTeleportation(point);
		means.setLocation(point);

		for (drift = 0; drift < Direction.numDirections; drift++) {
			nearPoint = Direction.points[drift];
			nearTile  = tiles[point.y + nearPoint.y][point.x + nearPoint.x];

			if (!(nearTile instanceof WallTile)) {
				means.setDirection(new Direction(drift));
				break;
			}
		}
	}
}