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

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

import edu.whs.spin2018.baoapp.model.Nachricht;
import edu.whs.spin2018.baoapp.model.spiel.Position;
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 SpielbrettServiceInteractor extends ServiceInteractor implements SpielbrettRemoteDataSource {

    public static final String TAG = "SpielbrettServiceInt";
    private SpielbrettEventListener listener;

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


    public SpielbrettServiceInteractor(BaoService service) {
        super(service);
        registriereBenoetigteListener();
    }

    public void setzeListener(SpielbrettEventListener listener) {
        this.listener = listener;
    }

    @Override
    public void sendeSpielzug(Position muldenPosition, String raum) {
        JSONObject muldenObjekt = new JSONObject();
        try {
            muldenObjekt.put("zeile", muldenPosition.gibZeile());
            muldenObjekt.put("spalte", muldenPosition.gibSpalte());
            sendeBroadcast(muldenObjekt.toString(), Nachricht.TYP_SPIELZUG, raum);

        } catch (JSONException e) {
            e.printStackTrace();
        }

    }

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

    @Override
    public void onSpielzugErhalten(Position position) {
        listener.onSpielzugErhalten(position);
    }

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

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

    @Override
    public void onNeueNachricht(Object... args) {
        String inhalt = "";
        String typ = "";
        try {
            JSONObject nachrichtenObjekt = (JSONObject) args[0];
            inhalt = nachrichtenObjekt.getString(Nachricht.INHALT);
            typ = nachrichtenObjekt.getString(Nachricht.TYP);
        } catch (JSONException ignored) {}

        switch (typ) {
            case Nachricht.TYP_SPIELZUG:
                try {
                    JSONObject muldenObjekt = new JSONObject(inhalt);
                    Position muldenPosition = new Position(
                            Integer.parseInt(muldenObjekt.getString("zeile")),
                            Integer.parseInt(muldenObjekt.getString("spalte")));
                    onSpielzugErhalten(muldenPosition);

                } catch (JSONException e) {
                    e.printStackTrace();
                }
        }
    }
}
