package edu.whs.spin2018.baoapp.model.spiel.spieler;

import android.util.Log;

import edu.whs.spin2018.baoapp.model.spiel.Position;
import edu.whs.spin2018.baoapp.model.spiel.BaoSpiel;

public class ComputerSpielerMittel extends ComputerSpieler {


    private BaoSpiel baoSpielKopie;

    public ComputerSpielerMittel(String name) {
        super(name);
    }

    @Override
    public Position generiereStartmulde() {
        Position ausgewaehlterZug = null;
        int gegnerZeile = 2;
        int aktuellGeklauteSteine = 0;
        int maxZuegeImVorraus;
        int geklauteSteine;
        int steineInHand;;
        boolean spielGewonnen = false;
        boolean spielVerloren;
        int zeile;
        int spalte;

        for (int i = 0; i < 2 && !spielGewonnen; i++) {
            for (int j = 0; j < 8 && !spielGewonnen; j++) {
                zeile = i;
                spalte = j;
                maxZuegeImVorraus = 1;
                geklauteSteine = 0;
                /*
                Eine Kopie des BaoSpiels wird erstellt um den Zug zu simulieren und das originale
                Brett nicht zu verändern.
                 */
                baoSpielKopie = new BaoSpiel(gibBaoSpiel().gibSpielbrett());

                //Ist in der aktuellen Mulde mehr als ein Stein, führe den Spielzug aus.
                if (baoSpielKopie.gibSpielbrett()[zeile][spalte].gibAnzahlSteine() > 1) {
                    steineInHand = baoSpielKopie.gibSpielbrett()[zeile][spalte].gibAnzahlSteine();
                    baoSpielKopie.gibSpielbrett()[zeile][spalte].entferneSteine();
                    while (steineInHand > 0 && maxZuegeImVorraus > 0) {
                        if (zeile % 2 == 0) {
                            if (spalte < 7) {
                                spalte++;
                            } else {
                                zeile++;
                            }
                        } else {
                            if (spalte > 0) {
                                spalte--;
                            } else {
                                zeile--;
                            }
                        }
                        baoSpielKopie.gibSpielbrett()[zeile][spalte].fuegeSteinHinzu();
                        steineInHand--;

                        //Prüft ob das Spiel mit dem Spielzug gewonnen wird.
                        spielGewonnen = pruefeObSpielGewonnen();

                        /*Ist kein Stein mehr in der Hand und mehr als ein Stein in der aktuellen Mulde, setze den Spielzug mit
                        diesen fort.*/
                        if (steineInHand == 0 && baoSpielKopie.gibSpielbrett()[zeile][spalte].gibAnzahlSteine() > 1 && !spielGewonnen) {
                            steineInHand = baoSpielKopie.gibSpielbrett()[zeile][spalte].gibAnzahlSteine();
                            baoSpielKopie.gibSpielbrett()[zeile][spalte].entferneSteine();

                            /* Ist es zusätzlich möglich Steine zu klauen, lege diese ebenfalls in deine Hand
                             */
                            if (zeile == 1) {
                                if (baoSpielKopie.gibSpielbrett()[gegnerZeile][spalte].gibAnzahlSteine() > 0)
                                    steineInHand = steineInHand + baoSpielKopie.gibSpielbrett()[gegnerZeile][spalte].gibAnzahlSteine();
                                geklauteSteine = geklauteSteine + baoSpielKopie.gibSpielbrett()[gegnerZeile][spalte].gibAnzahlSteine();
                                baoSpielKopie.gibSpielbrett()[gegnerZeile][spalte].entferneSteine();
                            }
                            maxZuegeImVorraus--;
                        }
                    }

                }
                /**
                 * Prüfe ob der ComputerGegner mit dem aktuellen Zug verliert. Ist dies nicht der
                 * Fall und die Anzahl der geklauten Steine größer als die aktuellen geklauten
                 * Steine, so speichere die Position der momentanen Position.
                 */
                spielVerloren = pruefeObSpielVerloren();
                if ((!spielVerloren && (geklauteSteine > aktuellGeklauteSteine)) || spielGewonnen) {
                    aktuellGeklauteSteine = geklauteSteine;
                    ausgewaehlterZug = new Position(i, j);
                }
            }
        }

        //Falls nichts vom Gegner geklaut werden kann, nehme die Mulde mit den meisten Steinen
        int groeßteMulde = 0;
        for (int i = 0; ((i < 2) && (aktuellGeklauteSteine <= 1)); i++) {
            for (int j = 0; j < 8; j++) {
                if (baoSpielKopie.gibSpielbrett()[i][j].gibAnzahlSteine() > groeßteMulde) {
                    groeßteMulde = gibBaoSpiel().gibSpielbrett()[i][j].gibAnzahlSteine();
                    ausgewaehlterZug = new Position(i, j);
                }
            }
        }
        return ausgewaehlterZug;
    }

    /**
     * Prüft ob der ComputerSpieler das Spiel unter aktuellen Bedingungen gewonnen hat.
     *
     * @return ob das Spiel gewonnen wurde.
     */
    private boolean pruefeObSpielGewonnen() {
        boolean gewonnen = true;
        for (int i = 0; i < 8; i++) {
            if (baoSpielKopie.gibSpielbrett()[2][i].gibAnzahlSteine() > 1) {
                gewonnen = false;
            }
        }
        return gewonnen;
    }

    /**
     * Prüft ob der ComputerSpieler das Spiel unter aktuellen Bedingungen verloren hat.
     *
     * @return ob das Spiel verloren wurde.
     */
    private boolean pruefeObSpielVerloren() {
        boolean verloren = true;
        for (int i = 0; i < 8; i++) {
            if (baoSpielKopie.gibSpielbrett()[1][i].gibAnzahlSteine() > 1) {
                verloren = false;
            }
        }
        return verloren;
    }

}
