package edu.whs.spin2018.baoapp.model.remote.spieleinstellungen;

import org.json.JSONException;
import org.json.JSONObject;

import edu.whs.spin2018.baoapp.model.Nachricht;
import edu.whs.spin2018.baoapp.service.BaoService;
import edu.whs.spin2018.baoapp.model.remote.ServiceInteractor;
import edu.whs.spin2018.baoapp.service.SocketEvents;
import io.socket.emitter.Emitter;

public class SpieleinstellungenServiceInteractor extends ServiceInteractor implements SpieleinstellungenRemoteDataSource {

    private SpieleinstellungenEventListener listener;

    private final Emitter.Listener OnBenutzerVerlaesstRaumListener =
            args -> onGegnerVerlaesstRaum();

    public SpieleinstellungenServiceInteractor(BaoService serviceInterface) {
        super(serviceInterface);
        registriereBenoetigteListener();
    }

    @Override
    public void setzeListener(SpieleinstellungenEventListener listener) {
        this.listener = listener;
    }

    @Override
    public void registriereBenoetigteListener() {
        registriereBenutzerVerlaesstRaumListener(OnBenutzerVerlaesstRaumListener);
    }

    @Override
    public void entferneRegistrierteListener() {
        entferneListener(SocketEvents.BENUTZER_VERLAESST_RAUM, OnBenutzerVerlaesstRaumListener);
    }

    @Override
    public void onNeueNachricht(Object... args) {

        JSONObject data = (JSONObject) args[0];
        String inhalt = null;
        String typ = null;
        try {
            inhalt = data.getString(Nachricht.INHALT);
            typ = data.getString(Nachricht.TYP);
        } catch (JSONException e) {
            e.printStackTrace();
        }

        switch (typ) {
            case Nachricht.TYP_BEREIT:
                boolean istBereit;
                istBereit = Boolean.valueOf(inhalt);
                onGegnerIstBereit(istBereit);
                break;

            case Nachricht.TYP_MINUTEN_GEANDERT:
                int minutenIndex;
                minutenIndex = Integer.valueOf(inhalt);
                onGegnerAendertMinuten(minutenIndex);
                break;

            case Nachricht.TYP_SEKUNDEN_GEANDERT:
                int sekundenIndex;
                sekundenIndex = Integer.valueOf(inhalt);
                onGegnerAendertSekunden(sekundenIndex);
                break;

            case Nachricht.TYP_ZEITTYP_GEANDERT:
                onGegnerAendertZeitTyp(inhalt);
                break;
        }
    }

    @Override
    public void sendeZeitTyp(String buttonAuswahl, String raum) {
        sendeBroadcast(buttonAuswahl, Nachricht.TYP_ZEITTYP_GEANDERT, raum);
    }

    @Override
    public void sendeSpielerIstBereit(boolean istBereit, String raum) {
        sendeBroadcast(Boolean.toString(istBereit), Nachricht.TYP_BEREIT, raum);
    }

    @Override
    public void sendeSekunden(int sekunden, String aktuellerRaum) {
        sendeBroadcast(String.valueOf(sekunden), Nachricht.TYP_SEKUNDEN_GEANDERT, aktuellerRaum);
    }

    @Override
    public void sendeMinuten(int minuten, String aktuellerRaum) {
        sendeBroadcast(String.valueOf(minuten), Nachricht.TYP_MINUTEN_GEANDERT, aktuellerRaum);
    }

    @Override
    public void onGegnerVerlaesstRaum() {
        listener.onGegnerVerlaesstRaum();
    }

    @Override
    public void onGegnerAendertZeitTyp(String zeittyp) {
        listener.onGegnerAendertZeitTyp(zeittyp);
    }

    @Override
    public void onGegnerAendertMinuten(int minutenIndex) {
        listener.onGegnerAendertMinuten(minutenIndex);
    }

    @Override
    public void onGegnerAendertSekunden(int sekundenIndex) {
        listener.onGegnerAendertSekunden(sekundenIndex);
    }

    @Override
    public void onGegnerIstBereit(boolean istBereit) {
        listener.onGegnerIstBereit(istBereit);
    }
}
