local highlight = {}

highlight.keys = {
  'gui',
  'guifg',
  'guibg',
  'cterm',
  'ctermfg',
  'ctermbg',
}

highlight.inherit = function(name, source, override)
  local cmd = ('highlight! default %s'):format(name)
  for _, key in ipairs(highlight.keys) do
    if override[key] then
      cmd = cmd .. (' %s=%s'):format(key, override[key])
    else
      local v = highlight.get(source, key)
      v = v == '' and 'NONE' or v
      cmd = cmd .. (' %s=%s'):format(key, v)
    end
  end
  vim.cmd(cmd)
end

highlight.get = function(source, key)
  if key == 'gui' or key == 'cterm' then
    local ui = {}
    for _, k in ipairs({ 'bold', 'italic', 'reverse', 'inverse', 'standout', 'underline', 'undercurl', 'strikethrough' }) do
      if vim.fn.synIDattr(vim.fn.hlID(source), k, key) == 1 then
        table.insert(ui, k)
      end
    end
    return table.concat(ui, ',')
  elseif key == 'guifg' then
    return vim.fn.synIDattr(vim.fn.hlID(source), 'fg#', 'gui')
  elseif key == 'guibg' then
    return vim.fn.synIDattr(vim.fn.hlID(source), 'bg#', 'gui')
  elseif key == 'ctermfg' then
    return vim.fn.synIDattr(vim.fn.hlID(source), 'fg', 'term')
  elseif key == 'ctermbg' then
    return vim.fn.synIDattr(vim.fn.hlID(source), 'bg', 'term')
  end
end

return highlight
