local _color = {}

--- Try to guess if a color is dark or light.
--
-- @string color The color with hexadecimal HTML format `"#RRGGBB"`.
-- @treturn bool `true` if the color is dark, `false` if it is light.
function _color.is_dark(color)
  -- Try to determine if the color is dark or light
  local numeric_value = 0
  for s in color:gmatch("[a-fA-F0-9][a-fA-F0-9]") do
    numeric_value = numeric_value + tonumber("0x" .. s)
  end
  return (numeric_value < 383)
end

--- Lighten a color.
--
-- @string color The color to lighten with hexadecimal HTML format `"#RRGGBB"`.
-- @int[opt=26] amount How much light from 0 to 255. Default is around 10%.
-- @treturn string The lighter color
function _color.lighten(color, amount)
  amount = amount or 26
  local c = {
    r = tonumber("0x" .. color:sub(2, 3)),
    g = tonumber("0x" .. color:sub(4, 5)),
    b = tonumber("0x" .. color:sub(6, 7)),
  }

  c.r = c.r + amount
  c.r = c.r < 0 and 0 or c.r
  c.r = c.r > 255 and 255 or c.r
  c.g = c.g + amount
  c.g = c.g < 0 and 0 or c.g
  c.g = c.g > 255 and 255 or c.g
  c.b = c.b + amount
  c.b = c.b < 0 and 0 or c.b
  c.b = c.b > 255 and 255 or c.b

  return string.format("#%02x%02x%02x", c.r, c.g, c.b)
end

--- Darken a color.
--
-- @string color The color to darken with hexadecimal HTML format `"#RRGGBB"`.
-- @int[opt=26] amount How much dark from 0 to 255. Default is around 10%.
-- @treturn string The darker color
function _color.darken(color, amount)
  amount = amount or 26
  return _color.lighten(color, -amount)
end

return _color
