package de.jaujau.spiellogik;

import java.util.ArrayList;
import java.util.Random;

import de.jaujau.daten.Kartensatz;
import de.jaujau.daten.Spieler;
import de.jaujau.daten.Wert;



/**
 * Diese Klasse prüft die Spielaktionen und alterniert zwischen Spieler und Computer
 * @author Fabian Keller
 */
public class Spiel {

	private Spieler amZug;
	private boolean spielgestartet = false;
	private boolean aussetzen;
	private boolean zwei_ziehen;
	private int kartenZiehen;
	private Kartensatz kartensatz;
	private Wert gelegterWert;
	private Spielzug spielzug;
	
	
	boolean getAussetzen() {
		return aussetzen;
	}


	boolean getZwei_ziehen() {
		return zwei_ziehen;
	}

	
	Kartensatz getKartensatz() {
		return kartensatz;
	}


	/**
	 * alterniert zwischen Spieler und Computer und legt Beginner fest
	 */
	private void spiel() {
		if(!spielgestartet) { 
			Random zufallszahl = new Random();
			int zahl = zufallszahl.nextInt(1);
			if(zahl == 1) { //Starter durch zufall bestimmen
				amZug = Spieler.SPIELER;
			}
			else {
				amZug = Spieler.COMPUTER;
			}
			spielgestartet = true;
			for(int i = 0; i < 7; i++) { //Jeder bekommt 7 Karten
				kartensatz.ziehen(Spieler.COMPUTER);
				kartensatz.ziehen(Spieler.SPIELER);
			}
			int kartenindex = zufallszahl.nextInt(31);
			while(kartensatz.getHand(Spieler.COMPUTER).contains(kartenindex)||kartensatz.getHand(Spieler.SPIELER).contains(kartenindex)) {
				kartenindex = zufallszahl.nextInt(31);
			}
			kartensatz.ablegen(kartenindex); //nicht in der Hand befindliche Karte zum Start aufdecken
			return;
		}
		if(amZug == Spieler.SPIELER) {
			amZug = Spieler.COMPUTER;
		}
		else {
			amZug= Spieler.SPIELER;
		}
	}
	
	
	/**
	   * falls eine Karte gelegt werden kann wird diese gelegt 	
	   * @param       	kartenindex
	   */
	private void karteLegen(int kartenindex) { //WÜNSCHER?
		if(pruefeHand(amZug)) {
			if (spielzug.pruefeZug(kartenindex)) {
				kartensatz.ablegen(kartenindex);
				spiel();
				effekteSetzen(); //kartenindex übergeben und anhand dessen effekte setzen
			}//oder ziehen?
		}// else kein Zug möglich
		else {
			aussetzen = false;
		}
	}//wann wird aussetzen auf false gesetzt
	
	
	/**
	   * falls eine oder mehrere Karten gezogen werden können, wird dies ausgeführt
	   */
	private void karteZiehen(){
		if(pruefeHand(amZug)) {
			if(zwei_ziehen) {
				for(int i = 0; i < kartenZiehen; i++) {
					kartensatz.ziehen(amZug);
				}
				kartenZiehen = 0;
				zwei_ziehen = false;
				spiel();
			}
			else {
				kartensatz.ziehen(amZug);	
			}
		}
	}
	
	
	/**
	   * setzt Effekt-Variablen
	   */
	private void effekteSetzen() { //was passiert wenn 2 gezogen wurde und dann der nächste spieler diese Funktion ausführt.
		gelegterWert = kartensatz.getKarte(kartensatz.getletzteKarte()).getWERT();
		if(gelegterWert == Wert.ACHT) {
			aussetzen = true;
		}
		if(gelegterWert == Wert.SIEBEN) {
			zwei_ziehen = true;
			kartenZiehen += 2;
		}
	}
	
	
	/**
	   * prüft ob, wenn eine 8 gelegt wurde, eine 8 auf der Hand ist
	   * und der Zug somit möglich ist
	   * @return true falls ein Zug möglich ist
	   * @return false falls kein Zug möglich ist
	   */
	private boolean pruefeHand(Spieler amZug) {
		if(aussetzen) {
			ArrayList<Integer> handvonSpieler = kartensatz.getHand(amZug);
			for(int i = 0; i < handvonSpieler.size(); i++) {
				if(kartensatz.getKarte(handvonSpieler.get(i)).getWERT() == Wert.ACHT) {
					return true;
				}
			}
			return false;
		}
		return true;
	}
}
