#include <dfhack/Core.h>
#include <dfhack/Console.h>
#include <dfhack/Export.h>
#include <dfhack/PluginManager.h>
#include <vector>
#include <string>
#include <dfhack/modules/Notes.h>

using std::vector;
using std::string;
using namespace DFHack;

DFhackCExport command_result df_notes (Core * c, vector <string> & parameters);

DFhackCExport const char * plugin_name ( void )
{
    return "notes";
}

DFhackCExport command_result plugin_init ( Core * c, std::vector <PluginCommand> &commands)
{
    commands.clear();
    commands.push_back(PluginCommand("dumpnotes",
               "Dumps in-game notes",
               df_notes));
    return CR_OK;
}

DFhackCExport command_result plugin_shutdown ( Core * c )
{
    return CR_OK;
}

DFhackCExport command_result df_notes (Core * c, vector <string> & parameters)
{
    Console & con = c->con;
    c->Suspend();

    DFHack::Notes * note_mod = c->getNotes();
    std::vector<t_note*>* note_list = note_mod->notes;

    if (note_list == NULL)
    {
        con.printerr("Notes are not supported under this version of DF.\n");
        c->Resume();
        return CR_OK;
    }

    if (note_list->empty())
    {
        con << "There are no notes." << std::endl;
        c->Resume();
        return CR_OK;
    }


    for (size_t i = 0; i < note_list->size(); i++)
    {
        t_note* note = (*note_list)[i];

        con.print("Note %x at: %d/%d/%d\n",note, note->x, note->y, note->z);
        con.print("Note id: %d\n", note->id);
        con.print("Note symbol: '%c'\n", note->symbol);

        if (note->name.length() > 0)
            con << "Note name: " << (note->name) << std::endl;
        if (note->text.length() > 0)
            con << "Note text: " << (note->text) << std::endl;

        if (note->unk1 != 0)
            con.print("unk1: %x\n", note->unk1);
        if (note->unk2 != 0)
            con.print("unk2: %x\n", note->unk2);

        con << std::endl;
    }

    c->Resume();
    return CR_OK;
}