import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.event.*;

public class Game extends JFrame implements ActionListener {
	
	private Graphics paper;
	private Defender defender;
	private Laser laser;
	private Bomb bomb;
	private Timer timer;
	private JButton startButton;
	private JPanel panel;
	private Alien alien;
	

	
	
	public static void main(String[] args) {
        Game frame = new Game();
        frame.setSize(250,260);
        frame.createGUI();
        frame.show();
    }

    private void createGUI() {
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        Container window = getContentPane();
        window.setLayout(new FlowLayout());
       

        panel = new JPanel();
        panel.setPreferredSize(new Dimension(150, 150));
        panel.setBackground(Color.white);
        window.add(panel);
        
        panel.addMouseMotionListener(new MouseMotionAdapter() {
         
         	public void mouseMoved(MouseEvent event) {
		
				defender.move(event.getX());

    		}                 
                 
        });
        
        panel.addMouseListener(new MouseAdapter() {
         
        	public void mouseClicked(MouseEvent event) {
		
				int initialX = defender.getX();
				int initialY = defender.getY();
		
				if (laser == null) {
			
				laser = new Laser(initialX, initialY);

				}

			}                
                 
        });

        
        startButton = new JButton("start");
        window.add(startButton);
        startButton.addActionListener(this);
        
        timer = new Timer(1000, this);
        
    }
    
    public void actionPerformed(ActionEvent event) {
        
        if (event.getSource() == startButton) {
            newGame();
            drawAll();
        }
        
        if (event.getSource() == timer) {
            timer_Tick();
        }
        
        
       
    }
    
    
    private void newGame() {
    	
    	defender = new Defender();
		alien = new Alien();
		timer.start();
    }
    
    private void timer_Tick() { 
    
    	if (bomb == null) {
    		
			bomb = new Bomb(alien.getX(), alien.getY());
			
		}
		
		moveAll();
		drawAll();
		checkHits();
		
		}
		

	
	

    
    private void moveAll() { 
    	
    	alien.move();
    	
		if (bomb != null) {
				
			bomb.move();
		}
		
		if (laser != null) {
			
			laser.move();
			
		}
	}
	
		
	private void drawAll() {
		
		Graphics paper = panel.getGraphics();
		paper.setColor(Color.white);
		paper.fillRect(0,0,panel.getWidth(), panel.getHeight());
		paper.setColor(Color.black);
		defender.draw(panel);
		alien.draw(panel);
		
		if (laser != null) { 
		
			laser.draw(panel) ;
		}
		
		if (bomb != null) { 
		
			bomb.draw(panel);
		}
		
	}
	
		
	private void checkHits() {
		
		if (collides(laser, alien)) {
			
			endGame("user");
			
		}
		
		else {
			
			if (collides(bomb, defender)) { 
		
				endGame("alien");
				
			}
		}
		
		if (bomb != null) {
			
			if (bomb.getY() > panel.getHeight()) { 
			
				bomb = null;
				
			}
			
		}
		
		if (laser != null) {
			
			if (laser.getY() < 0) { 
				
				laser = null;
				
			}
			
		}
             
	}
	
	
	private boolean collides(Sprite one, Sprite two) {
		
		if (one == null || two == null) {
			
			return false;
		}	
			

		if (one.getX() > two.getX()
		
			&&  one.getY() < (two.getY() + two.getHeight())
			&& (one.getX() + one.getWidth()) < (two.getX() + two.getWidth())
			&& (one.getY() + one.getWidth()) > (two.getY())) {
			
		return true;
		
		} else {

		return false;
		
		}
		
	}	



	private void endGame(String winner) {
		
		laser = null;
		bomb = null;
		timer.stop();
		JOptionPane.showMessageDialog(null,"game over - " + winner + " wins");		
		
	}











}


