-- Bearded Arc highlight engine
-- Shared logic for dark and light variants

local M = {}

-- Helper function to set highlights
local function hi(group, opts)
  local cmd = "hi " .. group
  if opts.fg then cmd = cmd .. " guifg=" .. opts.fg end
  if opts.bg then cmd = cmd .. " guibg=" .. opts.bg end
  if opts.sp then cmd = cmd .. " guisp=" .. opts.sp end
  if opts.style then cmd = cmd .. " gui=" .. opts.style end
  vim.cmd(cmd)
end

function M.apply(base_30, base_16)
  -- === UI ELEMENTS ===

  hi("LineNr", { fg = base_30.grey })
  hi("CursorLineNr", { fg = base_30.white })
  hi("SignColumn", { fg = base_16.base03 })
  hi("FoldColumn", { fg = base_30.grey, bg = base_16.base00 })
  hi("Folded", { fg = base_30.light_grey, bg = base_16.base01 })

  hi("Normal", { fg = base_16.base05, bg = base_16.base00 })
  hi("NormalFloat", { bg = base_30.darker_black })
  hi("FloatBorder", { fg = base_30.blue })
  hi("FloatTitle", { fg = base_30.white, bg = base_30.grey })

  hi("Cursor", { fg = base_16.base00, bg = base_16.base05 })
  hi("CursorLine", { bg = base_30.black2 })
  hi("CursorColumn", { bg = base_16.base01 })
  hi("ColorColumn", { bg = base_16.base01 })

  hi("Visual", { bg = base_30.one_bg2 })
  hi("VisualNOS", { bg = base_30.one_bg2 })

  hi("Search", { fg = base_16.base00, bg = base_16.base0A })
  hi("IncSearch", { fg = base_16.base01, bg = base_16.base09 })
  hi("Substitute", { fg = base_16.base01, bg = base_16.base0A })

  hi("WinSeparator", { fg = base_30.line })
  hi("WinBar", { bg = base_30.statusline_bg })
  hi("WinBarNC", { bg = base_30.statusline_bg })

  hi("Pmenu", { bg = base_30.one_bg })
  hi("PmenuSbar", { bg = base_30.one_bg })
  hi("PmenuSel", { bg = base_30.pmenu_bg, fg = base_30.black })
  hi("PmenuThumb", { bg = base_30.grey })

  hi("StatusLine", { bg = base_30.statusline_bg })
  hi("StatusLineNC", { bg = base_30.statusline_bg })
  hi("TabLine", { fg = base_30.light_grey, bg = base_30.black2 })
  hi("TabLineSel", { fg = base_30.white, bg = base_30.black })
  hi("TabLineFill", { bg = base_30.black2 })

  hi("ErrorMsg", { fg = base_16.base08, bg = base_16.base00 })
  hi("WarningMsg", { fg = base_16.base0A })
  hi("MoreMsg", { fg = base_16.base0B })
  hi("ModeMsg", { fg = base_16.base0B })
  hi("Question", { fg = base_16.base0D })

  hi("MatchParen", { bg = base_30.grey, fg = base_30.white })
  hi("NonText", { fg = base_16.base03 })
  hi("SpecialKey", { fg = base_16.base03 })
  hi("Conceal", { fg = base_16.base0D, bg = base_16.base00 })
  hi("Directory", { fg = base_16.base0D })
  hi("Title", { fg = base_16.base0D })

  -- === SYNTAX HIGHLIGHTING ===

  hi("Comment", { fg = base_30.grey_fg, style = "italic" })

  hi("Constant", { fg = base_16.base09 })
  hi("String", { fg = base_16.base0B })
  hi("Character", { fg = base_16.base08 })
  hi("Number", { fg = base_16.base09 })
  hi("Boolean", { fg = base_16.base09 })
  hi("Float", { fg = base_16.base09 })

  hi("Identifier", { fg = base_16.base08 })
  hi("Function", { fg = base_16.base0D })

  hi("Statement", { fg = base_16.base0E })
  hi("Conditional", { fg = base_16.base0E })
  hi("Repeat", { fg = base_16.base0E })
  hi("Label", { fg = base_16.base0A })
  hi("Operator", { fg = base_16.base05 })
  hi("Keyword", { fg = base_16.base0E })
  hi("Exception", { fg = base_16.base08 })

  hi("PreProc", { fg = base_16.base0A })
  hi("Include", { fg = base_16.base0D })
  hi("Define", { fg = base_16.base0E })
  hi("Macro", { fg = base_16.base08 })
  hi("PreCondit", { fg = base_16.base0A })

  hi("Type", { fg = base_16.base0A })
  hi("StorageClass", { fg = base_16.base0A })
  hi("Structure", { fg = base_16.base0E })
  hi("Typedef", { fg = base_16.base0A })

  hi("Special", { fg = base_16.base0C })
  hi("SpecialChar", { fg = base_16.base0F })
  hi("Tag", { fg = base_16.base0A })
  hi("Delimiter", { fg = base_16.base0F })
  hi("SpecialComment", { fg = base_16.base0C })
  hi("Debug", { fg = base_16.base08 })

  hi("Error", { fg = base_16.base00, bg = base_16.base08 })
  hi("Todo", { fg = base_16.base0A, bg = base_16.base01 })

  hi("Underlined", { fg = base_16.base0B, style = "underline" })
  hi("Ignore", { fg = base_16.base0C })

  -- === DIFF ===

  hi("DiffAdd", { fg = base_16.base0B, bg = base_16.base00 })
  hi("DiffChange", { fg = base_16.base0E, bg = base_16.base00 })
  hi("DiffDelete", { fg = base_16.base08, bg = base_16.base00 })
  hi("DiffText", { fg = base_16.base0D, bg = base_16.base01 })

  hi("Added", { fg = base_30.green })
  hi("Changed", { fg = base_30.yellow })
  hi("Removed", { fg = base_30.red })

  -- === GIT SIGNS ===

  hi("GitSignsAdd", { fg = base_30.green })
  hi("GitSignsChange", { fg = base_30.yellow })
  hi("GitSignsDelete", { fg = base_30.red })

  -- === LSP DIAGNOSTICS ===

  hi("DiagnosticError", { fg = base_30.red })
  hi("DiagnosticWarn", { fg = base_30.yellow })
  hi("DiagnosticInfo", { fg = base_30.green })
  hi("DiagnosticHint", { fg = base_30.purple })

  hi("DiagnosticUnderlineError", { sp = base_30.red, style = "underline" })
  hi("DiagnosticUnderlineWarn", { sp = base_30.yellow, style = "underline" })
  hi("DiagnosticUnderlineInfo", { sp = base_30.green, style = "underline" })
  hi("DiagnosticUnderlineHint", { sp = base_30.purple, style = "underline" })

  hi("LspReferenceText", { bg = base_30.one_bg3 })
  hi("LspReferenceRead", { bg = base_30.one_bg3 })
  hi("LspReferenceWrite", { bg = base_30.one_bg3 })

  hi("LspInlayHint", { fg = base_30.light_grey, bg = base_30.black2 })
  hi("LspSignatureActiveParameter", { fg = base_30.black, bg = base_30.green })

  -- === TELESCOPE ===

  hi("TelescopeBorder", { fg = base_30.grey, bg = base_30.darker_black })
  hi("TelescopePromptBorder", { fg = base_30.grey, bg = base_30.darker_black })
  hi("TelescopePromptNormal", { fg = base_16.base05, bg = base_30.darker_black })
  hi("TelescopeResultsBorder", { fg = base_30.grey, bg = base_30.darker_black })
  hi("TelescopeResultsNormal", { bg = base_30.darker_black })
  hi("TelescopePreviewBorder", { fg = base_30.grey, bg = base_30.darker_black })
  hi("TelescopePreviewNormal", { bg = base_30.darker_black })
  hi("TelescopeSelection", { bg = base_30.one_bg2, fg = base_30.white })
  hi("TelescopeSelectionCaret", { fg = base_30.cyan, bg = base_30.one_bg2 })
  hi("TelescopeMatching", { fg = base_30.blue, style = "bold" })

  -- === TREESITTER ===

  hi("@variable", { fg = base_16.base05 })
  hi("@variable.builtin", { fg = base_16.base09 })
  hi("@variable.parameter", { fg = base_16.base08 })
  hi("@variable.member", { fg = base_16.base08 })

  hi("@constant", { fg = base_16.base08 })
  hi("@constant.builtin", { fg = base_16.base09 })
  hi("@constant.macro", { fg = base_16.base08 })

  hi("@string", { fg = base_16.base0B })
  hi("@string.regex", { fg = base_16.base0C })
  hi("@string.escape", { fg = base_16.base0C })
  hi("@character", { fg = base_16.base08 })
  hi("@number", { fg = base_16.base09 })
  hi("@boolean", { fg = base_16.base09 })
  hi("@float", { fg = base_16.base09 })

  hi("@function", { fg = base_16.base0D })
  hi("@function.builtin", { fg = base_16.base0D })
  hi("@function.macro", { fg = base_16.base08 })
  hi("@function.method", { fg = base_16.base0D })

  hi("@constructor", { fg = base_16.base0C })
  hi("@parameter", { fg = base_16.base08 })

  hi("@keyword", { fg = base_16.base0E })
  hi("@keyword.function", { fg = base_16.base0E })
  hi("@keyword.return", { fg = base_16.base0E })
  hi("@keyword.operator", { fg = base_16.base0E })

  hi("@conditional", { fg = base_16.base0E })
  hi("@repeat", { fg = base_16.base0E })
  hi("@label", { fg = base_16.base0A })
  hi("@operator", { fg = base_16.base05 })
  hi("@exception", { fg = base_16.base08 })

  hi("@type", { fg = base_16.base0A })
  hi("@type.builtin", { fg = base_16.base0A })
  hi("@type.qualifier", { fg = base_16.base0E })

  hi("@structure", { fg = base_16.base0E })
  hi("@include", { fg = base_16.base0D })

  hi("@property", { fg = base_16.base08 })
  hi("@field", { fg = base_16.base08 })

  hi("@punctuation.delimiter", { fg = base_16.base0F })
  hi("@punctuation.bracket", { fg = base_16.base05 })
  hi("@punctuation.special", { fg = base_16.base08 })

  hi("@comment", { fg = base_30.grey_fg, style = "italic" })
  hi("@comment.todo", { fg = base_30.grey, bg = base_30.white })
  hi("@comment.note", { fg = base_30.white, bg = base_30.blue })
  hi("@comment.warning", { fg = base_30.black, bg = base_30.yellow })
  hi("@comment.error", { fg = base_30.white, bg = base_30.red })

  hi("@tag", { fg = base_16.base08 })
  hi("@tag.attribute", { fg = base_16.base0A })
  hi("@tag.delimiter", { fg = base_16.base0F })

  hi("@markup.strong", { style = "bold" })
  hi("@markup.italic", { style = "italic" })
  hi("@markup.underline", { style = "underline" })
  hi("@markup.strike", { style = "strikethrough" })
  hi("@markup.heading", { fg = base_16.base0D, style = "bold" })
  hi("@markup.link", { fg = base_16.base08, style = "underline" })
  hi("@markup.link.url", { fg = base_16.base0B, style = "underline" })
  hi("@markup.list", { fg = base_16.base08 })

  -- === NVIM-TREE ===

  hi("NvimTreeNormal", { bg = base_30.darker_black })
  hi("NvimTreeNormalNC", { bg = base_30.darker_black })
  hi("NvimTreeRootFolder", { fg = base_30.red, style = "bold" })
  hi("NvimTreeGitDirty", { fg = base_30.yellow })
  hi("NvimTreeGitNew", { fg = base_30.green })
  hi("NvimTreeGitDeleted", { fg = base_30.red })
  hi("NvimTreeSpecialFile", { fg = base_30.yellow, style = "underline" })
  hi("NvimTreeIndentMarker", { fg = base_30.grey })
  hi("NvimTreeImageFile", { fg = base_30.dark_purple })
  hi("NvimTreeSymlink", { fg = base_30.cyan })
  hi("NvimTreeFolderName", { fg = base_30.blue })
  hi("NvimTreeFolderIcon", { fg = base_30.folder_bg })
  hi("NvimTreeOpenedFolderName", { fg = base_30.blue })

  -- === WHICH-KEY ===

  hi("WhichKey", { fg = base_30.blue })
  hi("WhichKeyGroup", { fg = base_30.green })
  hi("WhichKeyDesc", { fg = base_16.base05 })
  hi("WhichKeySeparator", { fg = base_30.grey })
  hi("WhichKeyFloat", { bg = base_30.darker_black })
  hi("WhichKeyBorder", { fg = base_30.blue, bg = base_30.darker_black })

  -- === HEALTH CHECK ===

  hi("healthSuccess", { fg = base_30.green, bg = base_30.black })
end

return M
