local generic_colors = {
	header         = "#999999",
	selected       = "#72FF63",
	important      = "#FFD700",
	additional     = "#CCCCDD",
	highlighted    = "#608631",
	new            = "#00F529",
	warning        = "#FF8800",
	disabled       = "#332222",
	muted          = "#CCCCCC",
}

local function get_base_color(c)
    return generic_colors[c] or ""
end

local function hex2rgb(hex)
    hex = hex:gsub("#","")
    return {
        r = tonumber("0x" .. hex:sub(1,2)),
        g = tonumber("0x" .. hex:sub(3,4)),
        b = tonumber("0x" .. hex:sub(5,6))
    }
end

local function rgb2hex(rgb)
    return "#" .. string.format("%x", rgb.r) .. string.format("%x", rgb.g) .. string.format("%x", rgb.b)
end

local function rgb_colors_mix(colors)
    local R = 0
    local G = 0
    local B = 0
    for _, c in ipairs(colors) do
        R = R + c.r
        G = G + c.g
        B = B + c.b
    end
    R = math.floor(R / #colors + 0.5)
    G = math.floor(G / #colors + 0.5)
    B = math.floor(B / #colors + 0.5)
    return {r=R,g=G,b=B}
end

function mail.get_color(mix)
    if type(mix) == "string" then
        return get_base_color(mix)
    elseif #mix == 1 then
        return get_base_color(mix[1])
    else
        local colors2mix = {}
        for _, c in ipairs(mix) do
            colors2mix[#colors2mix+1] = hex2rgb(get_base_color(c))
        end
        local mixed_color = rgb_colors_mix(colors2mix)
        return rgb2hex(mixed_color)
    end
end