package tutorialJava.capitulo5.ej02_independenceDay;

import java.util.Arrays;

import tutorialJava.Utils;

public class CampoBatalla {
	
	private String nombre;
	private Humano humanos[] = new Humano[20];
	private Malvado malvados[] = new Malvado[20];
	
	/**
	 * 
	 * @param nombre
	 */
	public CampoBatalla (String nombre) {
		this.nombre = nombre;
		
		for (int i = 0; i < humanos.length; i++) {
			humanos[i] = new Humano("H-" + i);
		}
//		humanos[humanos.length - 1].setPuntosVida(
//				humanos[humanos.length - 1].getPuntosVida() * 2);
		
		Humano ultimoHumano = humanos[humanos.length - 1];
		ultimoHumano.setPuntosVida(ultimoHumano.getPuntosVida() * 2);
		
		for (int i = 0; i < malvados.length; i++) {
			malvados[i] = new Malvado("M-" + i);
		}
		// Establezco el doble de puntos de vida al último malvado
		Malvado ultimoMalvado = malvados[malvados.length - 1];
		ultimoMalvado.setPuntosVida(ultimoMalvado.getPuntosVida() * 2);
	}

	
	public void mezclaHumanos () {
		for (int i = 0; i < humanos.length; i++) {
			int ind1 = Utils.obtenerNumeroAzar(0, humanos.length - 1);
			int ind2 = Utils.obtenerNumeroAzar(0, humanos.length - 1);
			Humano aux = humanos[ind1];
			humanos[ind1] = humanos[ind2];
			humanos[ind2] = aux;
		}
	}
	
	public void mezclaMalvados () {
		for (int i = 0; i < malvados.length; i++) {
			int ind1 = Utils.obtenerNumeroAzar(0, malvados.length - 1);
			int ind2 = Utils.obtenerNumeroAzar(0, malvados.length - 1);
			Malvado aux = malvados[ind1];
			malvados[ind1] = malvados[ind2];
			malvados[ind2] = aux;
		}
	}
	
	/**
	 * 
	 */
	public void batalla () {
		do {
			// Disparo sobre el primer malvado vivo
			Malvado m = getPrimerMalvadoVivo();
			m.setPuntosVida(m.getPuntosVida() - 
					Utils.obtenerNumeroAzar(5, 25));
			if (m.getPuntosVida() <= 0) {
				m.setVivo(false);
				m.setPuntosVida(0);
			}

			// Sólo si queda algún malvado vivo, disparo sobre humano
			if (getPrimerMalvadoVivo() != null) {
				// Disparo sobre el primer humano vivo
				Humano h = getPrimerHumanoVivo();
				h.setPuntosVida(h.getPuntosVida() - 
						Utils.obtenerNumeroAzar(5, 25));
				if (h.getPuntosVida() <= 0) {
					h.setVivo(false);
					h.setPuntosVida(0);
				}
			}
			
			// Imprimo campo de batalla
			System.out.println(toString());
			System.out.println();
			
		} while(getPrimerHumanoVivo() != null &&
				getPrimerMalvadoVivo() != null);
		
		// Si llego hasta aquí, un bando no tiene soldados vivos
		if (getPrimerHumanoVivo() != null) {
			System.out.println("Han ganado los humanos");
		}
		else {
			System.out.println("Han ganado los malvados");
		}
		
	}
	
	public Humano getPrimerHumanoVivo() {
		for (int i = 0; i < humanos.length; i++) {
			if (humanos[i].isVivo()) {
				return humanos[i];
			}
		}
		return null;
	}
	
	public Malvado getPrimerMalvadoVivo() {
		for (int i = 0; i < malvados.length; i++) {
			if (malvados[i].isVivo()) {
				return malvados[i];
			}
		}
		return null;
	}
	
	
	
	
	
	
	
	public String getNombre() {
		return nombre;
	}

	public void setNombre(String nombre) {
		this.nombre = nombre;
	}

	public Humano[] getHumanos() {
		return humanos;
	}

	public void setHumanos(Humano[] humanos) {
		this.humanos = humanos;
	}

	public Malvado[] getMalvados() {
		return malvados;
	}

	public void setMalvados(Malvado[] malvados) {
		this.malvados = malvados;
	}

	public String toString() {
		StringBuffer sb = new StringBuffer("Campo: " + this.nombre);
		sb.append("\nHumanos: ");
		for (int i = 0; i < humanos.length; i++) {
			if (humanos[i].isVivo()) {
				sb.append(humanos[i].getNombre() + ":" +
						humanos[i].getPuntosVida() + ":" + 
						humanos[i].isVivo() + " ");
			}
		}

		sb.append("\nMalvados: ");
		for (int i = 0; i < malvados.length; i++) {
			if (malvados[i].isVivo()) {
				sb.append(malvados[i].getNombre() + ":" +
						malvados[i].getPuntosVida() + ":" + 
						malvados[i].isVivo() + " ");
			}
		}

		return sb.toString();
	}
	
	
}





