package de.jaujau.daten;

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

/**
 * Diese Klasse Verwaltet den Kartensatz
 * @author Sebastian Kacza
 */
public class Kartensatz {
	public Karte kartensatz[];
	int letztekarte;
	
	/**
	 * Konstruktor für den Kartensatz
	 * Erstellt einen Neuen Kartensatz mit 32 Karten in einem Array
	 * Die Karten haben dabei die Reihenfolge eines Standart Skat Blattes
	 */
	public Kartensatz() {
		letztekarte = 0;
		kartensatz = new Karte[32];
		
		//Standart Skat Kartensatz erstellen
		kartensatz[0] = new Karte(Farbe.KARO, Wert.SIEBEN);
		kartensatz[1] = new Karte(Farbe.KARO, Wert.ACHT);
		kartensatz[2] = new Karte(Farbe.KARO, Wert.NEUN);
		kartensatz[3] = new Karte(Farbe.KARO, Wert.ZEHN);
		kartensatz[4] = new Karte(Farbe.KARO, Wert.BUBE);
		kartensatz[5] = new Karte(Farbe.KARO, Wert.DAME);
		kartensatz[6] = new Karte(Farbe.KARO, Wert.KOENING);
		kartensatz[7] = new Karte(Farbe.KARO, Wert.ASS);
		
		kartensatz[8] = new Karte(Farbe.HERZ, Wert.SIEBEN);
		kartensatz[9] = new Karte(Farbe.HERZ, Wert.ACHT);
		kartensatz[10] = new Karte(Farbe.HERZ, Wert.NEUN);
		kartensatz[11] = new Karte(Farbe.HERZ, Wert.ZEHN);
		kartensatz[12] = new Karte(Farbe.HERZ, Wert.BUBE);
		kartensatz[13] = new Karte(Farbe.HERZ, Wert.DAME);
		kartensatz[14] = new Karte(Farbe.HERZ, Wert.KOENING);
		kartensatz[15] = new Karte(Farbe.HERZ, Wert.ASS);
		
		kartensatz[16] = new Karte(Farbe.PIK, Wert.SIEBEN);
		kartensatz[17] = new Karte(Farbe.PIK, Wert.ACHT);
		kartensatz[18] = new Karte(Farbe.PIK, Wert.NEUN);
		kartensatz[19] = new Karte(Farbe.PIK, Wert.ZEHN);
		kartensatz[20] = new Karte(Farbe.PIK, Wert.BUBE);
		kartensatz[21] = new Karte(Farbe.PIK, Wert.DAME);
		kartensatz[22] = new Karte(Farbe.PIK, Wert.KOENING);
		kartensatz[23] = new Karte(Farbe.PIK, Wert.ASS);
		
		kartensatz[24] = new Karte(Farbe.KREUZ, Wert.SIEBEN);
		kartensatz[25] = new Karte(Farbe.KREUZ, Wert.ACHT);
		kartensatz[26] = new Karte(Farbe.KREUZ, Wert.NEUN);
		kartensatz[27] = new Karte(Farbe.KREUZ, Wert.ZEHN);
		kartensatz[28] = new Karte(Farbe.KREUZ, Wert.BUBE);
		kartensatz[29] = new Karte(Farbe.KREUZ, Wert.DAME);
		kartensatz[30] = new Karte(Farbe.KREUZ, Wert.KOENING);
		kartensatz[31] = new Karte(Farbe.KREUZ, Wert.ASS);
		
	}
	

	/**
	 * Zieht eine Zufällige karte aus dem Ziehstapel für einen bestimmten Spieler und gibt den Karten dem Spieler auf die Hand
	 * Wenn keine Karten mehr auf dem Ziehstapel sind werden alle Karten vom Ablagestabel auf den Ziehstapel verschoben
	 * @param spieler Spieler der die Karte auf die Hand bekommen soll
	 */
	public boolean ziehen(Spieler spieler) {
		//System.out.println("Start Ziehen");
		//Ziehstapel Prüfen
		int ZiehstapelAnzahl = getZiehstapelAnzahl(); //ZiehstapelAnzahl könte durch direckten Medoden aufruf ersetzt werden????
		if(ZiehstapelAnzahl < 1) { //ZiehstapelAnzahl könte durch direckten Medoden aufruf ersetzt werden????
			//Alle Karten vom Ablagestapel ausßer letze auf den Ziehstapel verschieben
			for(int i = 0; i < 32; i++) {
				if((kartensatz[i].getAblageort() == Ablageort.ABLAGESTAPEL) && (i != letztekarte)) {
					kartensatz[i].setAblageort(Ablageort.ZIEHSTAPEL);
				}
			}
		}
		
		ZiehstapelAnzahl = getZiehstapelAnzahl(); //ZiehstapelAnzahl könte durch direckten Medoden aufruf ersetzt werden????
		//System.out.println("ZiehStapel Anzahl " + ZiehstapelAnzahl);
		if(ZiehstapelAnzahl > 0) {  //ZiehstapelAnzahl könte durch direckten Medoden aufruf ersetzt werden????
			//Ziekarte bestimmen und
			//Zienummer auswählen
			//System.out.println("Nummer wählen");
			Random random = new Random();
			int auswahl = random.nextInt(ZiehstapelAnzahl); //ZiehstapelAnzahl könte durch direckten Medoden aufruf ersetzt werden????
			//System.out.println("Karte Ziehen " + auswahl);
			
			//Wenn Karten auf dem Ziehspabel verfügbar sind
			int ZiehstapelIndex = 0;
			for(int i = 0; i < 32; i++) {
				//System.out.println("ZielStapelIndex " + ZiehstapelIndex);
				if(kartensatz[i].getAblageort() == Ablageort.ZIEHSTAPEL) {
					//System.out.println("Suche " + auswahl + " ZieIndex " + ZiehstapelIndex + " KartenIndex " + i);
					if(auswahl == ZiehstapelIndex) {
						//System.out.println("Ziehe Karte " + i + " " + kartensatz[i].toString());
						//Karte im Ziehstaple ist die die Ausgewählt wurde
						if(spieler == Spieler.SPIELER) {
							kartensatz[i].setAblageort(Ablageort.SPIELER);
						}
						if(spieler == Spieler.COMPUTER) {
							kartensatz[i].setAblageort(Ablageort.COMPUTER);
						}
						return true;
					}
					ZiehstapelIndex++;	
				}
				
			}
		}
		else {
			System.out.println("Keine Karten zum ziehen verfügbar!");
			return false;
		}
		return false;	
	}
	
	
	/**
	 * legt die Karte mit der KartenID x auf den Ablagestapel
	 * Speicher die KartenID der zuletzgelegt Karte in "letztekarte"
	 * @param kartenid ID der Karte die Abgeget werden Soll
	 */
	public void ablegen(int kartenID) {
		if((kartenID >= 0) && (kartenID < 32)){
			kartensatz[kartenID].setAblageort(Ablageort.ABLAGESTAPEL);
			letztekarte = kartenID;
		}			
	}
	
	
	/**
	 * gibt die ID der Kartezurück die als letztes auf dem Ablagestabel gelegt wurde
	 * @return ID der zuletzt gelegten Karte
	 */
	public int getletzteKarte() {
		return letztekarte;
	}
	

	/**
	 * Gibt die Karten Indexe einer Spieler Hand zuück
	 * Wenn keine Karten auf der Hand liegen wird eine Leere ArrayList zurückgegeben
	 * @param spieler Spieler
	 * @return ArrayList von Integer welche die KatrenIndexe enthält, 
	 */
	public ArrayList<Integer> getHand(Spieler spieler) {
		ArrayList<Integer> hand = new ArrayList<Integer>();
		for(int i = 0; i < 32; i++) {
			//Für Spieler
			if(spieler == Spieler.SPIELER) {
				if(kartensatz[i].getAblageort() == Ablageort.SPIELER) {
					hand.add(i);
				}
			}
			//Für Computer
			if(spieler == Spieler.COMPUTER) {
				if(kartensatz[i].getAblageort() == Ablageort.COMPUTER) {
					hand.add(i);
				}
			}
		}
		return hand;
	}
	
	
	/**
	 * Gibt eine Karte aus dem Kartensatz zurück
	 * @param kartenid ID Der Karte (0 - 31)
	 * @return Karte auf dem Kartensatz mit der ID x
	 */
	public Karte getKarte(int kartenID) {
		if((kartenID >= 0) && (kartenID < 32)){
			return kartensatz[kartenID];
		}
		else {
			return null;
		}
		
	}
	

	/**
	 * Legt die Farbe fest die als nächstes auf den Ablagestapel gelegt werden muss
	 * Dafür wird der "Wünscher" (Bube) der jeweiligen Farbe als letze Karte auf dem Ablegestabel eingetragen
	 * @param farbe Farbe die sich gewünscht wird
	 */
	public void SetWunschfarbe(Farbe farbe) {
		if(farbe == Farbe.KARO) {
			letztekarte = 4; //Karo Bube
		}
		else if (farbe == Farbe.HERZ) {
			letztekarte = 12; //Kerz Bube
		}
		else if (farbe == Farbe.PIK) {
			letztekarte = 20; //Pik Bube
		}
		else if (farbe == Farbe.KREUZ) {
			letztekarte = 28; //Kreuz Bube
		}
	}


	/**
	 * Dies Funktion Prüft ob sich auf dem Ziehstapel noch mindestes eine Karte Befindet
	 * Wird nur Klassenintern Verwendet
	 * @return true wenn keine Karten Vorhanden, false wenn kein Karte vorhanden
	 */
	private int getZiehstapelAnzahl() {
		int anzahl = 0;
		for(Karte karte: kartensatz) {
			if(karte.getAblageort() == Ablageort.ZIEHSTAPEL) {
				anzahl++;
			}
		}
		return anzahl;
	}


}
