package com.mercury.platform.ui.misc.note;

import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.json.simple.JSONArray;
import org.json.simple.JSONObject;
import org.json.simple.parser.JSONParser;
import org.json.simple.parser.ParseException;

import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.List;


public class NotesLoader {
    private final Logger logger = LogManager.getLogger(NotesLoader.class.getSimpleName());

    public NotesLoader() {
    }

    public List<Note> getNotesOnFirstStart() {
        return getNotes("notes/first/first-start.json");
    }

    public List<Note> getPatchNotesFromString(String source) {
        return getNotesFromString(source);
    }

    public List<Note> getPatchNotes() {
        return getNotes("notes/patch/patch-notes.json");
    }

    public String getVersionFrom(String source) {
        String version = "";
        JSONParser parser = new JSONParser();
        try {
            JSONObject root = (JSONObject) parser.parse(source);
            version = (String) root.get("version");
        } catch (ParseException e) {
            e.printStackTrace();
        }
        return version;
    }

    private List<Note> getNotes(String filePath) {
        List<Note> notes = new ArrayList<>();
        JSONParser parser = new JSONParser();
        try {
            JSONObject root = (JSONObject) parser.parse(new InputStreamReader(getClass().getClassLoader().getResourceAsStream(filePath)));
            JSONArray notesArray = (JSONArray) root.get("notes");
            notes = getNotesList(notesArray);
        } catch (Exception e) {
            logger.error(e);
        }
        return notes;
    }

    private List<Note> getNotesFromString(String source) {
        List<Note> notes = new ArrayList<>();
        JSONParser parser = new JSONParser();
        try {
            JSONObject root = (JSONObject) parser.parse(source);
            JSONArray notesArray = (JSONArray) root.get("notes");
            notes = getNotesList(notesArray);
        } catch (Exception e) {
            logger.error(e);
        }
        return notes;
    }

    private List<Note> getNotesList(JSONArray notesArray) {
        List<Note> notes = new ArrayList<>();
        for (JSONObject next : (Iterable<JSONObject>) notesArray) {
            Note note = new Note();
            note.setTitle((String) next.get("title"));
            note.setText((String) next.get("text"));
            note.setImagePath((String) next.get("image"));
            note.setLayout(NoteLayout.valueOf((String) next.get("layout")));
            notes.add(note);
        }
        return notes;
    }
}