local hs = {}

local cnpgStatus = {
    ["Cluster in healthy state"] = "Healthy",
    ["Setting up primary"] = "Progressing",
    ["Creating a new replica"] = "Progressing",
    ["Upgrading cluster"] = "Progressing",
    ["Waiting for the instances to become active"] = "Progressing",
    ["Promoting to primary cluster"] = "Progressing",
    ["Switchover in progress"] = "Degraded",
    ["Failing over"] = "Degraded",
    ["Upgrading Postgres major version"] = "Degraded",
    ["Cluster upgrade delayed"] = "Degraded",
    ["Waiting for user action"] = "Degraded",
    ["Primary instance is being restarted in-place"] = "Degraded",
    ["Primary instance is being restarted without a switchover"] = "Degraded",
    ["Cluster cannot execute instance online upgrade due to missing architecture binary"] = "Degraded",
    ["Online upgrade in progress"] = "Degraded",
    ["Applying configuration"] = "Degraded",
    ["Unable to create required cluster objects"] = "Suspended",
    ["Cluster cannot proceed to reconciliation due to an unknown plugin being required"] = "Suspended",
    ["Cluster has incomplete or invalid image catalog"] = "Suspended",
    ["Cluster is unrecoverable and needs manual intervention"] = "Suspended",
}

function hibernating(obj)
    for i, condition in pairs(obj.status.conditions) do
        if condition.type == "cnpg.io/hibernation" then
            return condition
        end
    end
    return nil
end

-- Check if reconciliation is suspended, since this is an explicit user action we return the "suspended" status immediately
if obj.metadata and obj.metadata.annotations and obj.metadata.annotations["cnpg.io/reconciliationLoop"] == "disabled" then
    hs.status = "Suspended"
    hs.message = "Cluster reconciliation is suspended"
    return hs
end

if obj.status ~= nil and obj.status.conditions ~= nil then
    local hibernation = hibernating(obj)
    if hibernation ~= nil then
        if hibernation.status == "True" then
            hs.status = "Suspended"
            hs.message = hibernation.message
            return hs
        else
            hs.status = "Degraded"
            hs.message = hibernation.message
            return hs
        end
    end
    statusState = cnpgStatus[obj.status.phase]
    if statusState ~= nil then
        hs.status = statusState
        hs.message = obj.status.phaseReason
        return hs
    else
        hs.status = "Unknown"
        hs.message = obj.status.phaseReason
        return hs
    end
end

hs.status = "Progressing"
hs.message = obj.status.phaseReason
return hs
