-- module for integration with third-party applications
local logger = require("logger")

local roles = {
    "dict",
    "translator",
}

local M = {}

function M:new(o)
    -- platform specific function to check availability of apps at runtime.
    if not o.check or type(o.check) ~= "function" then
        o.check = function(app) return false end
    end
    setmetatable(o, self)
    self.__index = self

    -- one-time availability check
    for _, role in pairs(roles) do
        -- user override, if available
        local user_file = role == "dict" and "dictionaries.lua" or role .. "s.lua"
        local user = require("datastorage"):getDataDir() .. "/" .. user_file
        local ok, user_dicts = pcall(dofile, user)
        if ok then
            o[role.."s"] = user_dicts
            o.is_user_list = true
        end
        for i, value in ipairs(o[role.."s"] or {}) do
            local app = value[4]
            if app and o:check(app) then
                value[3] = true
            end
        end
    end
    if o.is_user_list then
        logger.info(o:dump())
    end
    return o
end

function M:checkMethod(role, method)
    local tool, action = nil
    for i, v in ipairs(self[role.."s"] or {}) do
        if v[1] == method then
            tool = v[4]
            action = v[5]
            break
        end
    end
    if not tool and not action then
        return false
    else
        return true, tool, action
    end
end

function M:dump()
    local str = "user defined third-party apps\n"
    for i, role in ipairs(roles) do
        local apps = self[role.."s"]
        for index, _ in ipairs(apps or {}) do
            str = str .. string.format("-> %s (%s), role: %s, available: %s\n",
                apps[index][1], apps[index][4], role, tostring(apps[index][3]))
        end
    end
    return str
end

return M
