package tile;

import java.awt.Graphics2D;
import java.awt.image.BufferedImage;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;

import javax.imageio.ImageIO;

import main.GamePanel;

public class TileManager {
	GamePanel gp;
	public Tile[] tile;
	public int mapTileNum[][];
	
	public TileManager(GamePanel gp) {
		
		this.gp = gp;
		
		tile = new Tile[10];
		mapTileNum = new int[gp.maxWorldCol][gp.maxWorldRow];
		
		getTileImage();
		loadMap("/maps/clumpedMapWithWaterBorder15.txt");
		
	}
	
	public void getTileImage() {
		
		try {
			BufferedImage tileSheet = ImageIO.read(getClass().getResourceAsStream("/tiles/terrain.png"));
			
			tile[0] = new Tile();
			tile[0].image = tileSheet.getSubimage(32, 16, 16, 16);
			tile[0].collision = false;
			tile[1] = new Tile();
			tile[1].image = tileSheet.getSubimage(16 * 3, 16 * 4, 16, 16);
			
			tile[2] = new Tile();
			tile[2].image = tileSheet.getSubimage(16 * 4, 16 * 5, 16, 16);
			tile[2].kills = true;
			tile[3] = new Tile();
			tile[3].image = tileSheet.getSubimage(16 * 23, 16 * 5, 16, 16);
			
			tile[4] = new Tile();
			tile[4].image = tileSheet.getSubimage(16 * 27, 16 * 6, 16, 16);
			
			tile[5] = new Tile();
			tile[5].image = tileSheet.getSubimage(16 * 7, 16 * 19, 16, 16);
			
			tileSheet = ImageIO.read(getClass().getResourceAsStream("/tiles/water.png"));
			
			tile[6] = new Tile();
			tile[6].image = tileSheet.getSubimage(16 * 2, 16 * 4, 16, 16); //water
			tile[6].collision = true;
			tile[7] = new Tile();
			tile[7].image = tileSheet.getSubimage(16 * 5, 16 * 4, 16, 16); //water

			
		} catch(IOException e) {
			e.printStackTrace();
		}
		
	}
	
	public void loadMap(String filePath) {
		
		try {
			InputStream is = getClass().getResourceAsStream(filePath);
			BufferedReader br = new BufferedReader(new InputStreamReader(is));
			
			int col = 0;
			int row = 0;
			int running = 1;
			while(!(running==-2)) {
				
				String line = br.readLine();
				running = 1;
				while(running==1) {
					
					String numbers[] = line.split(" ");
					
					int num = Integer.parseInt(numbers[col]);
					if (num==-2) {running=2;}
					if (num==-1) {running=0;}else {
					mapTileNum[col][row] = num;
					col++;
					}
						
					
				}
					col = 0;
					row++;
				
			}
			br.close();
			
			
		}catch(Exception e) {
			
		}
		
	}
	
	public void draw(Graphics2D g2) {
		
		int worldCol = 0;
		int worldRow = 0;
		
		while(worldCol < gp.maxWorldCol && worldRow < gp.maxWorldRow) {
			
			int tileNum = mapTileNum[worldCol][worldRow];
			
			int posX = worldCol * gp.tileSize;
			int posY = worldRow * gp.tileSize;
			int screenX = posX - gp.player.posX + gp.player.screenX;
			int screenY = posY - gp.player.posY + gp.player.screenY;
			
			if(posX + gp.tileSize > gp.player.posX - gp.player.screenX &&
			   posX - gp.tileSize< gp.player.posX + gp.player.screenX && 
		   	   posY + gp.tileSize> gp.player.posY - gp.player.screenY && 
			   posY - gp.tileSize< gp.player.posY + gp.player.screenY) {		
				
				g2.drawImage(tile[tileNum].image, screenX, screenY, gp.tileSize, gp.tileSize, null);
			}
			
			
			worldCol++;


			if (worldCol == gp.maxWorldCol) {
				worldCol = 0;
				worldRow++;
			}
		}
	}
	
}