package edu.whs.spin2018.baoapp.utilities;

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

import java.util.ArrayList;
import java.util.List;

import edu.whs.spin2018.baoapp.model.Benutzer;
import edu.whs.spin2018.baoapp.model.Nachricht;
import edu.whs.spin2018.baoapp.service.Konstanten;

/**
 * Hilfsklasse zum Parsen von JSONObjects
 */
public final class JSONUtils {

    private static final String BENUTZER = "benutzer";
    private static final String BENUTZERNAME = "benutzername";
    private static final String UUID = "UUID";

    private JSONUtils() {

    }

    /**
     * Liefert von einem JSONObject, dass einen Benutzer enthaelt, das entsprechende Benutzer
     * Objekt. Ein JSONObject, dass einen Benutzer enthaelt ist wie folgt aufgebaut:
     * <p>
     * benutzer: { benutzername: String uuid: String }, type: String }
     *
     * @param jsonObject - JSONObject aus dem der Benutzer
     * @return Benutzer aus dem JSONObjekt
     */
    public static Benutzer gibBenutzerVonJSONObjekt(JSONObject jsonObject) {
        Benutzer benutzer = null;

        try {
            JSONObject jsonBenutzer = jsonObject.getJSONObject(BENUTZER);
            benutzer = new Benutzer(jsonBenutzer.getString(BENUTZERNAME),
                    jsonBenutzer.getString(UUID));
        } catch (JSONException e) {
            e.printStackTrace();
        }

        return benutzer;
    }

    public static JSONObject gibBenutzerAlsJSONObject(String benutzername, String UUID) {
        JSONObject obj = new JSONObject();
        JSONObject benutzer = new JSONObject();
        try {
            benutzer.put(BENUTZERNAME, benutzername);
            benutzer.put(JSONUtils.UUID, UUID);
            obj.put(BENUTZER, benutzer);
        } catch (JSONException e) {
            e.printStackTrace();
        }

        return obj;
    }

    public static List<Benutzer> gibBenutzerlisteVonJSONObjekt(Object obj) {
        List<Benutzer> benutzerListe = new ArrayList<>();

        try {
            JSONArray jsonArray = ((JSONObject) obj).getJSONArray(Nachricht.INHALT);
            for (int i = 0; i < jsonArray.length(); i++) {
                JSONObject jsonBenutzer = (JSONObject) jsonArray.get(i);
                Benutzer benutzer = new Benutzer(jsonBenutzer
                        .getString(Konstanten.EXTRA_BENUTZERNAME),
                        jsonBenutzer.getString(Konstanten.EXTRA_UUID));
                benutzerListe.add(benutzer);
            }
        } catch (JSONException e) {
            e.printStackTrace();
        }
        return benutzerListe;
    }
}
