package main;

import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.util.ArrayList;

import javax.swing.JPanel;

import entity.Enemy;
import entity.Entity;
import entity.Player;
import tile.TileManager;

public class GamePanel extends JPanel implements Runnable {
	
	Thread thread;
	final int FPS = 60;
	
	public Sound sound = new Sound();
	KeyHandler keyH = new KeyHandler();
	public CollisionHandler colH = new CollisionHandler(this);
	TileManager tileM = new TileManager(this);
	
	public Player player = new Player(this, keyH, colH);
	
	public ArrayList<Entity> entities = new ArrayList<>();
	
	public final int originalTileSize = 16;
	public final int tileSize = originalTileSize * 3;
	
	public final int screenWidth = 24 * tileSize;
	public final int screenHeight = 14 * tileSize;
	
	public final int maxWorldRow = 50;
	public final int maxWorldCol = 50;

	
	public GamePanel() {
		this.setPreferredSize(new Dimension(screenWidth, screenHeight));
		this.addKeyListener(keyH);
		this.setFocusable(true);
		
		setupGame();
		
		thread = new Thread(this);
		thread.start();
	}

	private void setupGame() {
		//Enemy testEnemy = new Enemy(this, 400, 300);
		
		//entities.add(testEnemy);
		//entities.add(new Enemy(this, 200, 100));
		//int x= 0;
		//int y= 0;
		//for(int i = 0; i < 0; i++) {
		//	entities.add(new Enemy(this, (x + i) * tileSize, (y + i) * tileSize));
		//}
		
	}
	

	@Override
	public void run() {
		double drawInterval = 1000000000 / FPS;
		
		double delta = 0;
		long lastTime = System.nanoTime();
		long currentTime;
		
		while(thread != null) {
			currentTime = System.nanoTime();
			delta += (currentTime - lastTime) / drawInterval;
			lastTime = currentTime;
			
			if(delta >= 1) {
				update();
				repaint();
				delta--;
			}
		}	
	}
	
	@Override
	public void paintComponent(Graphics g) {
		Graphics2D g2 = (Graphics2D)g;
		super.paintComponent(g2);
		draw(g2);
		g2.dispose();
	}

	private void update() {
		
		for(int i = 0; i < entities.size(); i++) {
			entities.get(i).update();
		}
		
		player.update();
	}

	private void draw(Graphics2D g2) {
		
		tileM.draw(g2);
		
		for(int i = 0; i < entities.size(); i++) {
			entities.get(i).draw(g2);
		}
		
		player.draw(g2);
	}

}
