local rapidjson = require("rapidjson")
local md5 = require("ffi/MD5")
local _ = require("gettext")

-- json exporter
local JsonExporter = require("base"):new {
    name = "json",
    -- the proper mimetype is "application/json" as stated in
    -- https://www.iana.org/assignments/media-types/application/json
    -- but we follow google recommendations because we just share on android.
    -- https://developer.android.com/training/sharing/send#using-the-right-mimetype
    mimetype = "text/json",
}

function JsonExporter:getMenuTable()
    return {
        text = _("Json"),
        checked_func = function() return self:isEnabled() end,
        sub_item_table = {
            {
                text = _("Export to Json"),
                checked_func = function() return self:isEnabled() end,
                callback = function() self:toggleEnabled() end,
            },
            {
                text = _("Include book checksum in export"),
                checked_func = function() return self.settings.bookChecksum end,
                callback = function()
                    self.settings.bookChecksum = not self.settings.bookChecksum
                    self:saveSettings()
                end,
            }
        }
    }
end

local function format(booknotes, settings)
    local t = {
        title = booknotes.title,
        author = booknotes.author,
        entries = {},
        exported = booknotes.exported,
        file = booknotes.file,
        md5sum = settings.bookChecksum and booknotes.file and md5.sumFile(booknotes.file) or nil,
        number_of_pages = booknotes.number_of_pages
    }
    for _, entry in ipairs(booknotes) do
        table.insert(t.entries, entry[1])
    end
    return t
end

function JsonExporter:export(t)
    local exportable
    local timestamp = self.timestamp or os.time()
    local path = self:getFilePath(t)
    if #t == 1 then
        exportable = format(t[1], self.settings)
        exportable.created_on = timestamp
        exportable.version = self:getVersion()
    else
        local documents = {}
        for _, booknotes in ipairs(t) do
            table.insert(documents, format(booknotes, self.settings))
        end
        exportable = {
            created_on = timestamp,
            version = self:getVersion(),
            documents = documents
        }
    end
    local file = io.open(path, "w")
    if not file then return false end
    file:write(rapidjson.encode(exportable, {pretty = true}))
    file:write("\n")
    file:close()
    return true
end

function JsonExporter:share(t)
    local content = format(t)
    content.created_on = self.timestamp or os.time()
    content.version = self:getVersion()
    self:shareText(rapidjson.encode(content, {pretty = true}))
end

return JsonExporter
