// This file is part of MicropolisJ.
// Copyright (C) 2013 Jason Long
// Portions Copyright (C) 1989-2007 Electronic Arts Inc.
//
// MicropolisJ is free software; you can redistribute it and/or modify
// it under the terms of the GNU GPLv3, with additional terms.
// See the README file, included in this distribution, for details.

package micropolisj.engine;

import static micropolisj.engine.TileConstants.*;

/**
 * Enumerates the various tools that can be applied to the map by the user.
 * Call the tool's apply() method to actually use the tool on the map.
 */
public enum MicropolisTool
{
	BULLDOZER,
	WIRE,
	ROADS,
	RAIL,
	RESIDENTIAL,
	COMMERCIAL,
	INDUSTRIAL,
	FIRE,
	POLICE,
	STADIUM,
	PARK,
	SEAPORT,
	POWERPLANT,
	NUCLEAR,
	AIRPORT,
	QUERY;

	public int getWidth()
	{
		switch(this)
		{
		case RESIDENTIAL:
		case COMMERCIAL:
		case INDUSTRIAL:
		case FIRE:
		case POLICE:
			return 3;

		case STADIUM:
		case SEAPORT:
		case POWERPLANT:
		case NUCLEAR:
			return 4;

		case AIRPORT:
			return 6;

		default:
			return 1;
		}
	}

	public int getHeight()
	{
		return getWidth();
	}

	public ToolStroke beginStroke(Micropolis engine, int xpos, int ypos)
	{
		if (this == BULLDOZER) {
			return new Bulldozer(engine, xpos, ypos);
		}
		else if (this == WIRE ||
			this == ROADS ||
			this == RAIL) {
			return new RoadLikeTool(engine, this, xpos, ypos);
		}
		else {
			return new ToolStroke(engine, this, xpos, ypos);
		}
	}

	public ToolResult apply(Micropolis engine, int xpos, int ypos)
	{
		return beginStroke(engine, xpos, ypos).apply();
	}

	public int getToolCost()
	{
		switch (this)
		{
		case BULLDOZER: return 1;
		case WIRE: return 5; //25 for underwater
		case ROADS: return 10;  //50 for over water
		case RAIL: return 20;   //100 for underwater
		case RESIDENTIAL: return 100;
		case COMMERCIAL: return 100;
		case INDUSTRIAL: return 100;
		case FIRE: return 500;
		case POLICE: return 500;
		case STADIUM: return 5000;
		case PARK: return 10;
		case SEAPORT: return 3000;
		case POWERPLANT: return 3000;
		case NUCLEAR: return 5000;
		case AIRPORT: return 10000;
		case QUERY: return 0;
		default:
			assert false;
			return 1;
		}
	}
}
