import java.awt.*;
import java.awt.event.*;
import java.io.File;
import java.io.IOException;
import java.net.MalformedURLException;
import java.util.ArrayList;

import javax.imageio.ImageIO;
import javax.sound.sampled.AudioInputStream;
import javax.sound.sampled.AudioSystem;
import javax.sound.sampled.Clip;
import javax.sound.sampled.LineUnavailableException;
import javax.sound.sampled.UnsupportedAudioFileException;
import javax.swing.*;

@SuppressWarnings("serial")
public class AnimalTestG extends JFrame {
	public static final boolean AUDIO = false;
	static ArrayList<Projectile> projectiles = new ArrayList<Projectile>();
	static Animal player1 = null;
	static Animal player2 = null;
	static CharacterSelector characterSelector;
	private static Image backgroundImage = null;

	static final String BG_1 = "Background city Seamless.png";
	static final String BG_2 = "BG City.jpg";
	static String BG = BG_2;

	public static final int W = 800;
	public static final int H = 549;

	DrawPanel drawPanel = new DrawPanel();

	public AnimalTestG() {
		super("AnimalTestG v.1.0_0");
		ActionListener listener = new AbstractAction() {
			public void actionPerformed(ActionEvent e) {
				drawPanel.repaint();

				if (player1 != null && player2 != null) {
					player1.move();
					player2.move();

					int i = 0;
					while (i < projectiles.size()) {
						Projectile p = projectiles.get(i);
						p.move();
						if (p.destroyed) {
							projectiles.remove(i);
							continue;
						}
						i++;
					}
				}
				else {
					characterSelector.update();
				}
			}
		};
		Timer timer = new Timer(1, listener);
		timer.start();

		drawPanel.setBackground(new Color(0,0,0));
		drawPanel.setForeground(new Color(0,255,0));

		add(drawPanel);

		pack();
		setDefaultCloseOperation(EXIT_ON_CLOSE);
		setLocationRelativeTo(null);

		addKeyListener(new KeyListener() {
			public void keyPressed(KeyEvent evt) {
				if (player1 != null && player2 != null) {
					player1.keyPressed(evt);
					player2.keyPressed(evt);
				}
				else {
					characterSelector.keyPressed(evt);
				}
			}
			public void keyReleased(KeyEvent evt) {
				if (player1 != null && player2 != null) {
					player1.keyReleased(evt);
					player2.keyReleased(evt);
				}
				else {
					characterSelector.keyReleased(evt);
				}
			}
			public void keyTyped(KeyEvent e) {}
		});
		setVisible(true);
	}

	private class DrawPanel extends JPanel {
		protected void paintComponent(Graphics g) {
			super.paintComponent(g);

			if (player1 == null || player2 == null) {
				characterSelector.draw(g);
			}
			else {
				g.drawImage(backgroundImage, 0, 0, null);

				player1.draw(g);
				player1.drawString(g, 10, H - 100);

				player2.draw(g);
				player2.drawString(g, W - 100, H - 100);	

				for (Projectile p : projectiles) {
					p.draw(g);
				}
			}
		}

		public Dimension getPreferredSize() {
			return new Dimension(W, H);
		}
	}

	public static void main(String[] args) {
		characterSelector = new CharacterSelector();

		try {
			backgroundImage = ImageIO.read(new File(BG)).getScaledInstance(W, -1, Image.SCALE_DEFAULT);
		} 
		catch (IOException e) {
			e.printStackTrace();
		}
		EventQueue.invokeLater(new Runnable() {
			public void run() {
				new AnimalTestG();
			}
		});
	}
}