package game.buildings
{
	import flash.geom.Point;

	import game.GameObject;

	import managers.LandscapeAssetManager;

	import starling.display.DisplayObject;
	import starling.display.Image;
	import starling.display.QuadBatch;
	import starling.utils.HAlign;
	import starling.utils.VAlign;

	import util.IsoPoint;
	import util.IsoTransformer;
	import util.ScreenPoint;

	public class Building extends GameObject
	{
		protected var _buildingWidth:int  = 0;
		protected var _buildingLength:int = 0;

		private var _life:int             = 0;

		private const tileSize:int        = 72;
		private const tileHeight:int      = 32;

		public function get life():int
		{
			return _life;
		}

		public function get buildingWidth():int
		{
			return _buildingWidth;
		}

		public function get buildingLength():int
		{
			return _buildingLength;
		}

		public function Building()
		{
			super();

			useHandCursor = true;

			calculateLife();
			build();
		}

		//на случай если понадобится что-то дополнительное добавить на здание-наследника
		//или вообще по другому реализовать внешний вид
		protected function build():void
		{
			var blocks:QuadBatch = new QuadBatch();
			blocks.touchable = false;
			addChild(blocks);

			//влом искать СпрайтШит с готовыми зданиями нужной величины, так что буду конструировать сам
			var block:Image = new Image(LandscapeAssetManager.instance.getTexture("landscapeTiles_083.png"));
			block.alignPivot(HAlign.CENTER, VAlign.TOP);

			for (var col:int = 0; col < _buildingWidth; col++)
			{
				for (var row:int = 0; row < _buildingLength; row++)
				{
					var screenPoint:ScreenPoint = IsoTransformer.isoToScreen(col * tileSize, row * tileSize);
					block.touchable = false;
					block.x = screenPoint.x;
					block.y = screenPoint.y - tileHeight;
					blocks.addImage(block);
				}
			}

			flatten();
		}

		//на случай если наследник захочет по другому рассчитывать количество жизней
		protected function calculateLife():void
		{
			_life = 3 + Math.floor(Math.random() * 3);
		}

		override protected function calculateIsoRect():void
		{
			_isoRect.width = _buildingWidth * tileSize;
			_isoRect.height = _buildingLength * tileSize;
		}

		override protected function calculateScreenRect():void
		{
			_screenRect.left = IsoTransformer.isoToScreen(_buildingWidth * tileSize, 0).x;
			_screenRect.right = IsoTransformer.isoToScreen(0, _buildingLength * tileSize).x;
			_screenRect.top = -tileHeight;
			_screenRect.bottom = IsoTransformer.isoToScreen(_buildingWidth * tileSize, _buildingLength * tileSize).y;
		}

		public function hit():void
		{
			_life--;
		}

		public override function hitTest(localPoint:Point, forTouch:Boolean = false):DisplayObject
		{
			if (!(touchable || visible))
				return null;

			var isoPoint:IsoPoint = IsoTransformer.screenToIso(localPoint.x, localPoint.y);
			return (isoPoint.x >= 0) && (isoPoint.x <= _isoRect.width) && (isoPoint.y >= 0) && (isoPoint.y <= _isoRect.height) ? this : null;
		}
	}
}
