package edu.whs.spin2018.baoapp.service;

import io.socket.emitter.Emitter;

/**
 * Definiert die Methoden mit dem Websocket interagiert.
 */
public interface BaoServiceInterface {

    /**
     * Baut die Verbindung zum Server auf
     */
    void verbinden(String benutzername, String uuid);

    /**
     * Trennt die Verbindung zum Server.
     */
    void trennen();

    /**
     * Betritt einen Raum auf dem Server.
     * Broadcasts in diesem Raum koennen danach empfangen werden.
     * Andere Raeume werden nicht automatisch verlassen.
     *
     * @param raum Raum, der betreten wird
     */
    void raumBetreten(String raum);

    /**
     * Verlaesst einen Raum.
     * Broadcasts in diesem Raum werden danach nicht mehr empfangen.
     *
     * @param raum - Raum der verlassen werden soll
     */
    void raumVerlassen(String raum);

    /**
     * Fordert eine Liste mit allen Clients aus einem Raum auf dem Server an.
     * <p>
     * Wenn der Server diese Anfrage beantwortet, wird an alle, die Broadcasts
     * vom BaoService erhalten, ein Broadcast gesendet.
     * In dem Intent, den man erhaelt ist unter "inhalt" ein JSONObject (data).
     * In data ist unter dem Extra "inhalt" ein JSONArray (benutzerArray).
     * In jedem Feld von benutzerArray ist ein JSONObject (jsonUser).
     * Jeder jsonUser hat die Felder "benutzername" und "UUID".
     *
     * @param raum Der Raum, dessen Clients gesendet werden sollen.
     */
    void zeigeBenutzerImRaum(String raum);

    /**
     * Sendet eine Nachricht an genau einen Empfaenger, der auch mit dem Server
     * verbunden ist.
     *
     * @param inhalt         Inhalt der Nachricht
     * @param typ            Eine Beschreibung der Nachricht (z.B. "Spielzug")
     * @param empfaengerUUID UUID, ueber die der Empfaenger identifiziert werden kann.
     */
    void sendeNachricht(String inhalt, String typ, String empfaengerUUID);

    /**
     * Sendet wie sendeNachricht eine Nachricht an den Server, aber
     * nicht nur an einen Benutzer als Empfaenger, sondern an alle Benutzer, die
     * sich in einem angegebenen Raum befinden.
     *
     * @param inhalt Inhalt der Nachricht
     * @param typ    Beschreibung der Nachricht
     * @param raum   Alle Benutzer dieses Raumes erhalten die Nachricht.
     */
    void sendeBroadcast(String inhalt, String typ, String raum);

    /**
     * Registriert einen neuen Listener fuer das "nachricht" Event am Websocket.
     *
     * @param listener - zu registrierender Listener
     */
    void registriereNachrichtenListener(Emitter.Listener listener);

    /**
     * Registriert einen neuen Listener fuer das "userVerlaesstRaum" Event am Websocket.
     *
     * @param listener - zu registrierender Listener
     */
    void registriereBenutzerVerlaesstRaumListener(Emitter.Listener listener);

    /**
     * Registriert einen neuen Listener fuer das "userTrittRaumBei" Event am Websocket.
     *
     * @param listener - zu registrierender Listener
     */
    void registriereBenutzerTrittRaumBeiListener(Emitter.Listener listener);

    /**
     * Registriert einen neuen Listener fuer das "verbunden" Event am Websocket.
     *
     * @param listener - zu registrierender Listener
     */
    void registriereVerbundenListener(Emitter.Listener listener);

    /**
     * Registriert einen neuen Listener fuer das "zeigeUserImRaum" Event am Websocket.
     *
     * @param listener - zu registrierender Listener
     */
    void registriereBenutzerListeErhaltenListener(Emitter.Listener listener);

    /**
     * Entfernt einen zuvor registrierten Listener
     *
     * @param event    - Event, auf das der Listener registriert wurde
     * @param listener - Listener, der entfernt werden soll
     */
    void entferneListener(String event, Emitter.Listener listener);
}
