package edu.whs.spin2018.baoapp.views.spiel;

import edu.whs.spin2018.baoapp.model.spiel.Position;
import edu.whs.spin2018.baoapp.model.remote.spielbrett.SpielbrettEventListener;
import edu.whs.spin2018.baoapp.model.remote.spielbrett.SpielbrettRemoteDataSource;
import edu.whs.spin2018.baoapp.model.spiel.Spielzug;
import edu.whs.spin2018.baoapp.model.spiel.spieler.SpielerIndex;
import edu.whs.spin2018.baoapp.presenter.BasePresenter;
import edu.whs.spin2018.baoapp.views.BaseView;

public interface BaoSpielContract {

    interface View extends BaseView<Presenter> {
        /**
         * Wird aufgerufen falls in der View ein Spielerwechsel angezeigt werden soll.
         *
         * @param spielerIndex der Name des Spielers der jetzt am Zug ist.
         */
        void zeigeAktuellenSpieler(SpielerIndex spielerIndex);

        /**
         * Wird aufgerufen, wenn in der View ein Gewinnerdialog aufgerufen werden soll.
         *
         * @param gewinnername der Name des Gewinners
         */
        void zeigeGewinnerDialog(String gewinnername);

        /**
         * Aktualisiert die Darstellungen der Mulden nachdem der Spielzug berechnet wurde.
         *
         * @param spielzug der komplett ausgeführte Spielzug
         */
        void aktualisiereMuldenAnzeige(Spielzug spielzug);

        /**
         * Wird bei jedem Tick des Timers aufgerufen, um die aktuelle Zeit anzuzeigen.
         *
         * @param uebrigeZeit
         */
        void zeigeUebrigeZeit(long uebrigeZeit);

        /**
         * Setzt die Anzeige, die zum aktuellen Timer gehört.
         *
         * @param spielerIndex
         */
        void setzeAktuelleTimerAnzeige(SpielerIndex spielerIndex);

        /**
         * Initialisiert beide Timeranzegen von Beginn an mit der Startzeit.
         *
         * @param millisekunden
         */
        void initialisiereTimerAnzeigen(long millisekunden);

        /**
         * Warnt den Spieler, dass er beim vorzeitigen Verlassen des Spieles, das Spiel verliert.
         */
        void zeigeSpielVerlassenDialog();
    }

    interface Presenter extends BasePresenter<SpielbrettRemoteDataSource>, SpielbrettEventListener {
        /**
         * Wird aufgerufen um den berechneten Spielzug zu verarbeiten.
         *
         * @param spielzug
         */
        void verarbeiteSpielzug(Spielzug spielzug);

        /**
         * Wird aufgerufen wenn ein Spielerwechsel erfolgt ist.
         *
         * @param spielerIndex der Spieler, der nach dem Wechsel am Zug ist
         */
        void verarbeiteSpielerwechsel(SpielerIndex spielerIndex);

        /**
         * Wird zu Beginn aufgerufen, um die richtige Timeranzeige auszuwählen.
         *
         * @param spielerIndex - Spieler fuer den der Timer angezeigt werden soll
         */
        void initialisiereAktuelleTimeranzeige(SpielerIndex spielerIndex);

        /**
         * Wird aufgerufen, wenn eine Mulde auf dem Spielbrett angeklickt wurde.
         *
         * @param pos - Position der angeklickten Mulde auf dem Spielfeld
         */
        void onMuldenKlick(Position pos);

        /**
         * Teilt dem Presenter mit, dass die Anzeige der Animationen auf der View angeschlossen sind
         * und somit der naechste Spieler am Zug ist.
         */
        void onSpielzugAnzeigeAbgeschlossen();
    }
}
