--
-- (C) 2019-24 - ntop.org
--

local redis_api = {}

-- ##############################################

local function is_rrd_enabled()
    local driver = ntop.getPref("ntopng.prefs.timeseries_driver")
    local is_rrd_enabled = false

    if isEmptyString(driver) or driver == "rrd" then
        is_rrd_enabled = true
    end

    return is_rrd_enabled
end

-- ##############################################

local function getRedisStatus()
    local redis = ntop.getCacheStatus()
    local redis_info = redis["info"]
    local res = {}
 
    for _, k in pairs(redis_info:split("\r\n")) do
       local k = k:split(":")
 
       if k then
      local v_k = k[1]
      local v = tonumber(k[2]) or k[2]
 
      res[v_k] = v
       end
    end
 
 
    if redis["dbsize"] then
       res["dbsize"] = redis["dbsize"]
    end
 
    return res
end
 
 -- ##############################################
 
local function getHealth(redis_status)
    local health = "green"
 
    if ntop.isWindows() then
        -- See Windows note in script.getStats()
        return health
    end
 
    if redis_status["aof_enabled"] and redis_status["aof_enabled"] ~= 0 then
        -- If here the use of Redis Append Only File (AOF) is enabled
        -- so we should check for its errors
        if redis_status["aof_last_bgrewrite_status"] ~= "ok" or redis_status["aof_last_write_status"] ~= "ok" then
            health = "red"
        end
    end
 
    if redis_status["rdb_last_bgsave_status"] ~= "ok" then
        health = "red"
    end
 
    return health
end
 
-- ##############################################

-- NOTE: on Windows, some stats are missing from script.getRedisStatus():
--    - aof_last_bgrewrite_status
--    - aof_last_write_status
--    - rdb_last_bgsave_status
--    - dbsize
function redis_api.getStats()
    local redis_status = getRedisStatus()

    local res = {
        -- used_memory_rss: Number of bytes that Redis allocated
        -- as seen by the operating system (a.k.a resident set size).
        -- This is the number reported by tools such as top(1) and ps(1)
        memory = redis_status["used_memory_rss"],
        -- The number of keys in the database
        dbsize = redis_status["dbsize"],
        -- Health
        health = getHealth(redis_status)
    }

    return res
end

-- ###############################################

function redis_api.redisTimeseriesEnabled()
    return(ntop.getPref("ntopng.prefs.system_probes_timeseries") ~= "0" and is_rrd_enabled())
end

-- ###############################################

return redis_api
