package Naves2;

import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.event.KeyEvent;
import java.util.ArrayList;
import java.util.ConcurrentModificationException;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.ImageIcon;
import javax.swing.JPanel;

public class Dibujar extends JPanel {
    Nave miNave;
    List <Bala> balazos;
    MueveBalas disparo;
    int dx, dy;
    MueveNave mueveNave;
    Monstruo miMonstruo;
    MueveMonstruo mueveMonstruo;
    private int aciertos;
    private String path = 
    "/Users/felix/fie_mac/public_html/programacion_java/codigos/Capitulo_8/Naves2/";
    private ImageIcon Img;
            
    public Dibujar() {
        miNave = new Nave();
        balazos = new ArrayList <Bala> ();      
        disparo = new MueveBalas();
        disparo.start();
        dx=0; dy =0;
        mueveNave = new MueveNave();
        mueveNave.start();
        miMonstruo = new Monstruo();
        mueveMonstruo = new MueveMonstruo();
        mueveMonstruo.start();
        aciertos = 0;
        Img = new ImageIcon(path+"fondo.jpg");
        
        this.setPreferredSize(new Dimension(400, 400)); // Tamanio del lienzo
        this.setBackground(Color.WHITE); // Pone un color de fondo
        this.setVisible(true);
    }
    
    @Override
    public void paint(Graphics g) {
        super.paint(g);
        g.drawImage(Img.getImage(), 0,0, 400, 400, null);
        g.setColor(Color.WHITE);
        g.drawString("Score " + aciertos, 330, 20);
        
        try {
            if(miMonstruo.estado())
                miMonstruo.dibuja(g);
            miNave.dibuja(g); 
            for(Bala b: balazos)
                b.dibuja(g);
        } catch (ConcurrentModificationException e) {}
    }

    public void keyPressed(KeyEvent arg0) {
        if(arg0.getKeyCode() == KeyEvent.VK_LEFT)  dx--;
        if(arg0.getKeyCode() == KeyEvent.VK_RIGHT) dx++;
        if(arg0.getKeyCode() == KeyEvent.VK_UP)  dy--;        
        if(arg0.getKeyCode() == KeyEvent.VK_DOWN) dy++;
        
        if(arg0.getKeyCode() == KeyEvent.VK_A) 
            balazos.add(new Bala(miNave.getX(), miNave.getY(), -1, 0));
        
        if(arg0.getKeyCode() == KeyEvent.VK_S) 
            balazos.add(new Bala(miNave.getX(), miNave.getY(), 1, 0));
        
        if(arg0.getKeyCode() == KeyEvent.VK_W) 
            balazos.add(new Bala(miNave.getX(), miNave.getY(), 0, -1));
        
        if(arg0.getKeyCode() == KeyEvent.VK_Z) 
            balazos.add(new Bala(miNave.getX(), miNave.getY(), 0, 1));
        
    }
    
    public void keyReleased(KeyEvent arg0) {
        dx=0;
        dy=0;
    }
    
   
    private class MueveNave extends Thread {
        @Override        
        public void run(){
            while(true) {
                miNave.mueve(dx, dy);
                repaint();
                try {
                    sleep(10);
                } catch (InterruptedException ex) {
                    Logger.getLogger(Dibujar.class.getName()).log(Level.SEVERE, null, ex);
                }
            }
        }        
    }
    
    private class MueveBalas extends Thread {      
        public int distancia(int x0, int y0, int x1, int y1) {
            return (x0-x1)*(x0-x1) + (y0 - y1)*(y0 - y1);
        }
        
        void borra() {
            int k, elimina =-1;
            
            if (balazos.isEmpty()) return;
            
            do {
                k=0;
                elimina = -1;
                for(Bala b: balazos) {
                    /*
                    if(b.getX() <= 0   ) { elimina = k; break;}
                    if(b.getX() >= 400 ) { elimina = k; break;}
                    if(b.getY() <= 0   ) { elimina = k; break;}
                    if(b.getY() >= 400 ) { elimina = k; break;}
                     * */
                    if(b.getX() <= 0   || 
                       b.getX() >= 400 ||
                       b.getY() <= 0   ||
                       b.getY() >= 400 ) { elimina = k; break;}
                    
                    k++;
                }
                if(elimina >= 0) balazos.remove(elimina);
            } while(elimina >=0);
        }

        
        @Override        
        public void run(){
            while(true) {
                try{
                    for(Bala b: balazos) {
                        b.mueve();
                        if(distancia(b.getX(), b.getY(), 
                                miMonstruo.getX(), miMonstruo.getY()) < 100) {
                            miMonstruo.muere();
                        }
                    }
                    borra();
                    repaint();
                } catch(ConcurrentModificationException e) {}
                
                try {
                    sleep(10);
                } catch (InterruptedException ex) {
                }
            }         
        }
    }
    
    private class MueveMonstruo extends Thread {
          @Override        
        public void run(){
            while(true) {
                miMonstruo.mueve();
                if(miMonstruo.estado() == false) {
                    miMonstruo.revive();
                    aciertos++;
                }
                repaint();
                try {
                    sleep(10);
                } catch (InterruptedException ex) {
                }
            }         
        }      
    }
}
