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

import edu.whs.spin2018.baoapp.model.Benutzer;
import edu.whs.spin2018.baoapp.presenter.BasePresenter;
import edu.whs.spin2018.baoapp.model.remote.lobby.LobbyEventListener;
import edu.whs.spin2018.baoapp.model.remote.lobby.LobbyRemoteDataSource;
import edu.whs.spin2018.baoapp.views.BaseView;

public interface LobbyContract {

    interface View extends BaseView<Presenter> {
        /**
         * Zeigt die Progessbar und das Textfeld, welches anzeigt, dass die Benutzer geladen werden
         */
        void zeigeBenutzerWerdenGeladen();

        /**
         * Versteckt die Progressbar und das Textfeld, welches anzeigt, dass die Benutzer geladen
         * werden.
         */
        void versteckeLadeAnzeige();

        /**
         * Zeigt einen Dialog an, in dem eine eintreffende Herausforderung angenommen oder abgelehnt
         * werden kann.
         *
         * @param absender - Daten des Absenders der Herausforderung
         */
        void zeigeEingehendeHerausforderung(Benutzer absender);

        /**
         * Zeigt dem Benutzer beim Herausfordern eines anderen Spielers einen Dialog an, in dem er
         * die Herausforderung abbrechen kann.
         *
         * @param empfaenger Benutzer, der herausgefordert wird.
         */
        void zeigeAusgehendeHerausforderung(Benutzer empfaenger);

        /**
         * Zeigt an, dass sich kein Benutzer in der Lobby befindet.
         */
        void zeigeLobbyIstLeer();

        /**
         * Benachrichtig die RecyclerView, dass ein neuer Benutzer der Liste hinzugefuegt wurde.
         *
         * @param pos - Stelle, an der der Benutzer hinzugefuegt wurde. Typischerweise am Ende der
         *            Liste
         */
        void zeigeNeuenBenutzerInListe(int pos);

        /**
         * Teilt der View mit, dass ein Benutzer die Lobby verlassen hat und aus der Anzeige
         * entfernt werden soll
         *
         * @param pos    - Position den Benutzers, der die Lobby verlassen hat, in der Liste
         * @param anzahl -  Anzahl der Items, die sich geändert haben.
         */
        void entferneBenutzerAusAnzeigeliste(int pos, int anzahl);

        /**
         * Beendet den aktuell angezeigten Herausforderungsdialog.
         */
        void zeigeHerausforderungBeendet();

        /**
         * Zeigt in dem aktuellen Herausforderungsdialog an, dass die Herausforderung vom Gegner
         * angenommen wurde.
         */
        void zeigeHerausforderungAngenommen();

        /**
         * Teil der View mit, dass die Benutzer in der Liste entfernt werden sollen.
         *
         * @param anzahl - Anzahl der entfernten Benutzer
         */
        void leereListe(int anzahl);

        /**
         * Teilt der View mit, dass Benutzer geladen wurden.
         */
        void zeigeErhaltendeBenutzer();
    }

    interface Presenter extends BasePresenter<LobbyRemoteDataSource>, LobbyEventListener {

        /**
         * Sendet ein Herausforderungsevent an einen Benutzer.
         *
         * @param pos - Position des Benutzers, der herausgefordert werden soll, in der Lobbyliste
         */
        void sendeHerausforderung(int pos);

        /**
         * Sendet an den Herausforderer, dass die Herausforderung abgelehnt wurde.
         *
         * @param absenderUUID - UUID des Herausforderers um das Event an die richtige Person zu
         *                     schicken
         */
        void lehneHerausforderungAb(String absenderUUID);

        /**
         * Sendet an den Herausforderer, dass die Herausforderung angenommen wurde.
         *
         * @param absenderUUID - UUID des Herausforderers
         */
        void nimmHerausforderungAn(String absenderUUID);

        /**
         * Fordert eine Liste mit den aktuellen Benutzern in der Lobby an.
         */
        void ladeBenutzerInLobby();

        void beendeDialog();

        //Methoden fuer den BenutzerAdapter

        void onBindBenutzerItemView(int pos, BenutzerAdapter.BenutzerViewHolder holder);

        /**
         * Liefert die Anzahl an Benutzern in der Lobby.
         *
         * @return Anzahl der Benutzer in der Lobby
         */
        int gibLobbyBenutzerItemAnzahl();
    }
}
