local M = {}

M.group2dict = function (name)
    local id = vim.fn.hlID(name)
    if id == 0 then
        return {
            name = '',
            ctermbg = '',
            ctermfg = '',
            bold = '',
            italic = '',
            reverse = '',
            underline = '',
            guibg = '',
            guifg = '',
        }
    end
    local rst = {
        name = vim.fn.synIDattr(id, 'name'),
        ctermbg = vim.fn.synIDattr(id, 'bg', 'cterm'),
        ctermfg = vim.fn.synIDattr(id, 'fg', 'cterm'),
        bold = vim.fn.synIDattr(id, 'bold'),
        italic = vim.fn.synIDattr(id, 'italic'),
        reverse = vim.fn.synIDattr(id, 'reverse'),
        underline = vim.fn.synIDattr(id, 'underline'),
        guibg = vim.fn.tolower(vim.fn.synIDattr(id, 'bg#', 'gui')),
        guifg = vim.fn.tolower(vim.fn.synIDattr(id, 'fg#', 'gui')),
    }
    return rst
end

M.hide_in_normal = function (name)
  local group = M.group2dict(name)
  if vim.fn.empty(group) == 1 then
    return
  end
  local normal = M.group2dict('Normal')
  local guibg = normal.guibg or ''
  local ctermbg = normal.ctermbg or ''
  group.guifg = guibg
  group.guibg = guibg
  group.ctermfg = ctermbg
  group.ctermbg = ctermbg
  M.hi(group)
end



M.hi = function (info)
    if vim.fn.empty(info) == 1 or vim.fn.get(info, 'name', '') == '' then
        return
    end
    vim.cmd('hi clear ' .. info.name)
    local cmd = 'hi! ' .. info.name
    if vim.fn.empty(info.ctermbg) == 0 then
        cmd = cmd .. ' ctermbg=' .. info.ctermbg
    end
    if vim.fn.empty(info.ctermfg) == 0 then
        cmd = cmd .. ' ctermfg=' .. info.ctermfg
    end
    if vim.fn.empty(info.guibg) == 0 then
        cmd = cmd .. ' guibg=' .. info.guibg
    end
    if vim.fn.empty(info.guifg) == 0 then
        cmd = cmd .. ' guifg=' .. info.guifg
    end
    local style = {}

    for _, sty in ipairs({'bold', 'italic', 'underline', 'reverse'}) do
        if info[sty] == 1 then
            table.insert(style, sty)
        end
    end

    if vim.fn.empty(style) == 0 then
        cmd = cmd .. ' gui=' .. vim.fn.join(style, ',') .. ' cterm=' .. vim.fn.join(style, ',')
    end
    pcall(vim.cmd, cmd)
end


return M