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

import edu.whs.spin2018.baoapp.presenter.BasePresenter;
import edu.whs.spin2018.baoapp.model.remote.spieleinstellungen.SpieleinstellungenEventListener;
import edu.whs.spin2018.baoapp.model.remote.spieleinstellungen.SpieleinstellungenRemoteDataSource;
import edu.whs.spin2018.baoapp.views.BaseView;

/**
 * Beinhaltet die Interfaces fuer die View und Presenter der Spieleinstellungen
 */
public interface SpieleinstellungenContract {

    interface View extends BaseView<Presenter> {

        /**
         * Zeigt den vom Gegner gewaehlten Zeittyp an.
         *
         * @param zeittyp - vom Gegner gewaehlter Zeittyp
         */
        void zeigeGegnerZeittyp(String zeittyp);

        /**
         * Zeigt den Bereitstatus des Spielers an.
         *
         * @param istBereit - true genau dann, wenn der Spieler bereit ist
         */
        void zeigeSpielerIstBereit(boolean istBereit);

        /**
         * Zeigt den Bereitstatus des Gegners an.
         *
         * @param istBereit - true genau dann, wenn der Spieler bereit ist
         */
        void zeigeGegnerIstBereit(boolean istBereit);

        /**
         * Zeigt die vom Gegner gewaehlten Minuten.
         *
         * @param minutenIndex - Index der vom Gegner gewaehlten Minuten im Spinner Array
         */
        void zeigeNeueGegnerMinuten(int minutenIndex);

        /**
         * Zeigt die vom Gegner gewaehlten Sekunden.
         *
         * @param sekundenIndex - Index der vom Gegner gewaehlten Minuten im Spinner Array
         */
        void zeigeNeueGegnerSekunden(int sekundenIndex);

        /**
         * Zeigt dem Spieler an, dass der Gegner die Spieleinstellungen verlassen hat
         */
        void zeigeGegnerHatEinstellungenVerlassen();

        /**
         * Zeigt den vom Spieler gewaehlten Zeittyp an.
         *
         * @param zeittyp - vom Spieler gewaehlter Zeittyp
         */
        void zeigeSpielerZeittyp(String zeittyp);

        /**
         * Zeigt bei gleichem Zeittyp (außer bei "OhneZeit") die Spinner zur Auswahl der Zeit an.
         *
         * @param zeittyp - Zeittyp, fuer den die Spinner angzeigt werden sollen.
         */
        void zeigeSpinner(String zeittyp);

        /**
         * Blendet die Spinner zur Auswahl der Zeit aus.
         */
        void versteckeSpinner();

        /**
         * Ermöglicht das Klicken auf den Bereit Button des Spielers.
         *
         * @param aktiv - true, genau dann wenn der Button des Spielers klickbar sein soll
         */
        void setzeBereitButtonsAktiv(boolean aktiv);

        /**
         * Startet das Spiel auf Basis der eingestellten Zeiten.
         *
         * @param zeittyp       - Zeittyp des Spiels
         * @param gegnername    - Name des Gegners
         * @param raum          - Raum, in dem die Nachrichten der Spieler ausgetauscht werden
         *                      sollen
         * @param minutenIndex  - Index der Minutenauswahl
         * @param sekundenIndex - Index der Sekundenauswahl
         */
        void starteSpiel(String zeittyp, String gegnername, String raum, int minutenIndex, int sekundenIndex);

    }

    interface Presenter extends BasePresenter<SpieleinstellungenRemoteDataSource>, SpieleinstellungenEventListener {

        /**
         * Sendet den vom Spieler ausgewaehlten Zeittyp an den Gegner.
         *
         * @param zeitTyp - ausgewaehlter Zeittyp
         */
        void sendeZeittyp(String zeitTyp);

        /**
         * Sendet den vom Spieler ausgewaehlten SekundenIndex an den Gegner.
         *
         * @param sekundenIndex - ausgewaehlter SekundenIndex
         */
        void sendeSekundenauswahl(int sekundenIndex);

        /**
         * Sendet den vom Spieler ausgewaehlten MinutenIndex an den Gegner.
         *
         * @param minutenIndex - ausgewaehler MinutenIndex
         */
        void sendeMinutenauswahl(int minutenIndex);

        /**
         * Sendet dem Gegner, ob der Spieler bereit ist oder nicht
         */
        void sendeIstBereit();

        /**
         * verlaesst die Spieleinstellungen. Sendet dem Gegner, dass der Raum verlassen wurde.
         */
        void verlasseSpieleinstellungen();
    }
}
