#!/usr/bin/env bash

DEST=${1:-/etc/skel}
LAZY_DEST=${DEST}/.config/nvim/lua/plugins
LAZY_UTILS_DEST=${DEST}/.config/nvim/lua/utils
LAZY_SYNTAX=${DEST}/.config/nvim/after/queries

mkdir -p "$LAZY_DEST" "$LAZY_UTILS_DEST"

# Yazi tui filemanager
# For extra configuration options see:
# https://github.com/mikavilpas/yazi.nvim
# https://github.com/mikavilpas/yazi.nvim#%EF%B8%8F%EF%B8%8F-advanced-configuration
conf_print_yazi() {
  cat <<EOF
return {
  ---@type LazySpec
  {
    "mikavilpas/yazi.nvim",
    version = "*", -- use the latest stable version
    event = "VeryLazy",
    dependencies = {
      { "nvim-lua/plenary.nvim", lazy = true },
    },
    keys = {
      -- 👇 in this section, choose your own keymappings!
      {
        "<leader>-",
        mode = { "n", "v" },
        "<cmd>Yazi<cr>",
        desc = "Open yazi at the current file",
      },
      {
        -- Open in the current working directory
        "<leader>cw",
        "<cmd>Yazi cwd<cr>",
        desc = "Open the file manager in nvim's working directory",
      },
      {
        "<c-up>",
        "<cmd>Yazi toggle<cr>",
        desc = "Resume the last yazi session",
      },
    },
    ---@type YaziConfig | {}
    opts = {
      -- if you want to open yazi instead of netrw, see below for more info
      open_for_directories = false,
      keymaps = {
        show_help = "<f1>",
      },
    },
    -- 👇 if you use \$(open_for_directories=true), this is recommended
    init = function()
      -- mark netrw as loaded so it's not loaded at all.
      --
      -- More details: https://github.com/mikavilpas/yazi.nvim/issues/802
      vim.g.loaded_netrwPlugin = 1
    end,
  }
}
EOF
}
conf_print_yazi | tee "${LAZY_DEST}/yazi.lua"

conf_print_time-machine() {
  cat <<EOF
return {
 "y3owk1n/time-machine.nvim",
 cmd = {
  "TimeMachineToggle",
  "TimeMachinePurgeBuffer",
  "TimeMachinePurgeAll",
  "TimeMachineLogShow",
  "TimeMachineLogClear",
 },
 ---@type TimeMachine.Config
 opts = {},
 keys = {
  {
   "<leader>t",
   "",
   desc = "Time Machine",
  },
  {
   "<leader>tt",
   "<cmd>TimeMachineToggle<cr>",
   desc = "[Time Machine] Toggle Tree",
  },
  {
   "<leader>tx",
   "<cmd>TimeMachinePurgeCurrent<cr>",
   desc = "[Time Machine] Purge current",
  },
  {
   "<leader>tX",
   "<cmd>TimeMachinePurgeAll<cr>",
   desc = "[Time Machine] Purge all",
  },
  {
   "<leader>tl",
   "<cmd>TimeMachineLogShow<cr>",
   desc = "[Time Machine] Show log",
  },
 },
}
EOF
}
conf_print_time-machine | tee "${LAZY_DEST}/time-machine.lua"

# Use triple backtick for code blocks rather than tab
# set code-block-style: or MD046: om ~/.markdownlint-cli2.yaml
conf_print_markdownlint_yaml() {
  cat <<EOF
config:
  code-block-style:
    style: "fenced"   
EOF
}
conf_print_markdownlint_yaml | tee "${DEST}/.markdownlint-cli2.yaml"

conf_print_markdownlint() {
  cat <<EOF
return {
  {
    "mfussenegger/nvim-lint",
    opts = {
      linters = {
        ["markdownlint-cli2"] = {
          args = { "--config", vim.env.HOME .. "/.markdownlint-cli2.yaml", "--" },
        },
      },
    },
  },
}
EOF
}
conf_print_markdownlint | tee "${LAZY_DEST}/lint.lua"

# mise-en-plave
# https://mise.jdx.dev/mise-cookbook/neovim.html
#
config_print_mise_syntax() {
  cat <<EOF
return {
  "nvim-treesitter/nvim-treesitter",
  init = function()
    require("vim.treesitter.query").add_predicate("is-mise?", function(_, _, bufnr, _)
      local filepath = vim.api.nvim_buf_get_name(tonumber(bufnr) or 0)
      local filename = vim.fn.fnamemodify(filepath, ":t")
      return string.match(filename, ".*mise.*%.toml$") ~= nil
    end, { force = true, all = false })
  end,
}
EOF

}
config_print_mise_syntax | tee "${LAZY_DEST}/mise-syntax.lua"

# define Tree-sitter query files that extend or customize syntax highlighting and
# code injection for TOML files
mkdir -p "${LAZY_SYNTAX}/toml"

# languages using # comments
mkdir -p "${LAZY_SYNTAX}/bash"
mkdir -p "${LAZY_SYNTAX}/python"

# languages using // comments
mkdir -p "${LAZY_SYNTAX}/go"
mkdir -p "${LAZY_SYNTAX}/rust"

# Other
mkdir -p "${LAZY_SYNTAX}/markdown"
mkdir -p "${LAZY_SYNTAX}/html"
mkdir -p "${LAZY_SYNTAX}/yaml"

conf_print_toml_injections() {
  cat <<'EOF'
; extends

; 1. Multiline shebang /usr/bin/env [ALL TOML]
(pair
  (bare_key) @key (#eq? @key "run")
  (string) @injection.content @injection.language
  (#match? @injection.language "^'''\\n*#!(/\\w+)+/env\\s+\\w+")
  (#gsub! @injection.language "^.*#!/.*/env\\s+([^\\s]+).*" "%1")
  (#offset! @injection.content 0 3 0 -3)
)

; 2. Multiline shebang direct path
(pair
  (bare_key) @key (#eq? @key "run")
  (string) @injection.content @injection.language
  (#match? @injection.language "^'''\\n*#!(/\\w+)+\\s*\\n")
  (#gsub! @injection.language "^.*#!/.*/([^/\\s]+).*" "%1")
  (#offset! @injection.content 0 3 0 -3)
)

; 3. Multiline no shebang → bash
(pair
  (bare_key) @key (#eq? @key "run")
  (string) @injection.content
  (#match? @injection.content "^'''\\n")
  (#not-match? @injection.content "^'''\\n*#!")
  (#offset! @injection.content 0 3 0 -3)
  (#set! injection.language "bash")
)

; 4. Single line → bash
(pair
  (bare_key) @key (#eq? @key "run")
  (string) @injection.content
  (#not-match? @injection.content "^'''")
  (#offset! @injection.content 0 1 0 -1)
  (#set! injection.language "bash")
)

; --- Mise-specific ONLY ---
(#is-mise?)

; depends_on task references
(pair
  (bare_key) @key (#eq? @key "depends_on")
  (array (string) @reference.task))

; [tasks] table identification
(table
  (bare_key) @key (#eq? @key "tasks"))

; Task definitions under tasks tables
(pair (bare_key) @task.definition)
EOF
}

conf_print_toml_injections | tee "${LAZY_SYNTAX}/toml/injections.scm"

conf_print_bash_injections() {
  cat <<EOF
; extends

; ============================================================================
; #MISE comments - TOML injection
; ============================================================================
; This injection captures comment lines starting with "#MISE " or "#[MISE]" or
; "# [MISE]" and treats them as TOML code blocks for syntax highlighting.
;
; #MISE format
; The (#offset!) directive skips the "#MISE " prefix (6 characters) from the source
((comment) @injection.content
  (#lua-match? @injection.content "^#MISE ")
  (#offset! @injection.content 0 6 0 1)
  (#set! injection.language "toml"))

; #[MISE] format
((comment) @injection.content
  (#lua-match? @injection.content "^#%[MISE%] ")
  (#offset! @injection.content 0 8 0 1)
  (#set! injection.language "toml"))

; # [MISE] format
((comment) @injection.content
  (#lua-match? @injection.content "^# %[MISE%] ")
  (#offset! @injection.content 0 9 0 1)
  (#set! injection.language "toml"))

; ============================================================================
; #USAGE comments - KDL injection
; ============================================================================
; This injection captures consecutive comment lines starting with "#USAGE " or
; "#[USAGE]" or "# [USAGE]" and treats them as a single KDL code block for
; syntax highlighting.
;
; #USAGE format
((comment) @injection.content
  (#lua-match? @injection.content "^#USAGE ")
  ; Extend the range one byte to the right, to include the trailing newline.
  ; see https://github.com/neovim/neovim/discussions/36669#discussioncomment-15054154
  (#offset! @injection.content 0 7 0 1)
  (#set! injection.combined)
  (#set! injection.language "kdl"))

; #[USAGE] format
((comment) @injection.content
  (#lua-match? @injection.content "^#%[USAGE%] ")
  (#offset! @injection.content 0 9 0 1)
  (#set! injection.combined)
  (#set! injection.language "kdl"))

; # [USAGE] format
((comment) @injection.content
  (#lua-match? @injection.content "^# %[USAGE%] ")
  (#offset! @injection.content 0 10 0 1)
  (#set! injection.combined)
  (#set! injection.language "kdl"))

; NOTE: on neovim >= 0.12, you can use the multi node pattern instead of
; combining injections:
;
; ((comment)+ @injection.content
;   (#lua-match? @injection.content "^#USAGE ")
;   (#offset! @injection.content 0 7 0 1)
;   (#set! injection.language "kdl"))
;
; this is the preferred way as combined injections have multiple
; limitations:
; https://github.com/neovim/neovim/issues/32635
EOF
}
conf_print_bash_injections | tee "${LAZY_SYNTAX}/bash/injections.scm"
conf_print_bash_injections | tee "${LAZY_SYNTAX}/python/injections.scm"

conf_print_go_injections() {
  cat <<EOF
((comment) @injection.content
  (#lua-match? @injection.content "^//MISE ")
  (#offset! @injection.content 0 7 0 1)
  (#set! injection.language "toml"))
((comment) @injection.content
  (#lua-match? @injection.content "^//%[MISE%] ")
  (#offset! @injection.content 0 9 0 1)
  (#set! injection.language "toml"))
((comment) @injection.content
  (#lua-match? @injection.content "^// %[MISE%] ")
  (#offset! @injection.content 0 10 0 1)
  (#set! injection.language "toml"))
((comment) @injection.content
  (#lua-match? @injection.content "^//USAGE ")
  (#offset! @injection.content 0 8 0 1)
  (#set! injection.combined)
  (#set! injection.language "kdl"))
((comment) @injection.content
  (#lua-match? @injection.content "^//%[USAGE%] ")
  (#offset! @injection.content 0 10 0 1)
  (#set! injection.combined)
  (#set! injection.language "kdl"))
((comment) @injection.content
  (#lua-match? @injection.content "^// %[USAGE%] ")
  (#offset! @injection.content 0 11 0 1)
  (#set! injection.combined)
  (#set! injection.language "kdl"))
EOF
}
conf_print_go_injections | tee "${LAZY_SYNTAX}/go/injections.scm"
conf_print_go_injections | tee "${LAZY_SYNTAX}/rust/injections.scm"

# To only apply the highlighting on mise files instead of all toml files, the
# is-mise? predicate is used. THe following will consider any toml file
# containing mise in its name as a mise file.
# .mise.toml
# mise.toml
# ~/.config/mise/config.toml
# ~/.config/mise/conf.d/*.toml
# ./mise/config.toml
# ./.mise/config.toml
# ./mise/something.toml
conf_print_predicates() {
  cat <<'EOF'
return {
  "nvim-treesitter/nvim-treesitter",
  init = function()
    require("vim.treesitter.query").add_predicate("is-mise?", function(match, _, bufnr, _)
      local filepath = vim.api.nvim_buf_get_name(bufnr)

      -- 1. Must be a .toml file (case-insensitive on Windows is automatic via Neovim)
      if not filepath:match("%.toml$") then
        return false
      end

      local filename = vim.fn.fnamemodify(filepath, ":t")

      -- 2. Filename contains "mise" (covers .mise.toml, mise.toml, mise.local.toml, mise.dev.toml, etc.)
      if filename:find("mise") then
        return true
      end

      -- 3. Path contains "/mise/" or "\mise\" as a directory component
      --    Catches ~/.config/mise/config.toml, .mise/config.toml, mise/conf.d/*.toml, etc.
      --    The [\/\\] pattern handles both Unix and Windows separators
      if filepath:find("[/\\]mise[/\\]") then
        return true
      end

      return false
    end, { force = true })
  end,
}
EOF
}
conf_print_predicates | tee "${LAZY_DEST}/mise-treesitter.lua"

# otter https://github.com/jmbuhr/otter.nvim
# https://github.com/jmbuhr/LazyVim/blob/main/lua/lazyvim/plugins/extras/lsp/otter.lua
# provides lsp features, including code completion, for code embedded in other documents
conf_print_mise_otter_lsp() {
  cat <<'EOF'
return {
  "jmbuhr/otter.nvim",
  dependencies = { "nvim-treesitter/nvim-treesitter" },
  config = function()
    vim.api.nvim_create_autocmd("FileType", {
      pattern = "toml",
      callback = function()
        local full_path = vim.fn.expand("%:p") 
        -- Matches 'mise' anywhere in the path to activate Otter
        if string.match(full_path, "mise") then
          require("otter").activate({"bash", "sh", "python", "lua"})
        end
      end,
    })
  end,
}
EOF
}
conf_print_mise_otter_lsp | tee "${LAZY_DEST}/mise-otter.lua"

# define Tree-sitter query files that extend or customize syntax highlighting and
# code injection for TOML files
mkdir -p "${LAZY_SYNTAX}/toml"

# languages using # comments
mkdir -p "${LAZY_SYNTAX}/bash"
mkdir -p "${LAZY_SYNTAX}/python"

# languages using // comments
mkdir -p "${LAZY_SYNTAX}/go"
mkdir -p "${LAZY_SYNTAX}/rust"

# Other
mkdir -p "${LAZY_SYNTAX}/markdown"
mkdir -p "${LAZY_SYNTAX}/html"
mkdir -p "${LAZY_SYNTAX}/yaml"

# Mise only injections captured above in the the mixed toml_injections()
# conf_print_toml_injections() {
#   cat <<EOF
# ; extends
#
# (pair
#   (bare_key) @key (#eq? @key "run")
#   (string) @injection.content @injection.language
#
#   (#is-mise?)
#   (#match? @injection.language "^['\"]{3}\n*#!(/\\w+)+/env\\s+\\w+") ; multiline shebang using env
#   (#gsub! @injection.language "^.*#!/.*/env%s+([^%s]+).*" "%1") ; extract lang
#   (#offset! @injection.content 0 3 0 -3) ; rm quotes
# )
#
# (pair
#   (bare_key) @key (#eq? @key "run")
#   (string) @injection.content @injection.language
#
#   (#is-mise?)
#   (#match? @injection.language "^['\"]{3}\n*#!(/\\w+)+\s*\n") ; multiline shebang
#   (#gsub! @injection.language "^.*#!/.*/([^/%s]+).*" "%1") ; extract lang
#   (#offset! @injection.content 0 3 0 -3) ; rm quotes
# )
#
# (pair
#   (bare_key) @key (#eq? @key "run")
#   (string) @injection.content
#
#   (#is-mise?)
#   (#match? @injection.content "^['\"]{3}\n*.*") ; multiline
#   (#not-match? @injection.content "^['\"]{3}\n*#!") ; no shebang
#   (#offset! @injection.content 0 3 0 -3) ; rm quotes
#   (#set! injection.language "bash") ; default to bash
# )
#
# (pair
#   (bare_key) @key (#eq? @key "run")
#   (string) @injection.content
#
#   (#is-mise?)
#   (#not-match? @injection.content "^['\"]{3}") ; not multiline
#   (#offset! @injection.content 0 1 0 -1) ; rm quotes
#   (#set! injection.language "bash") ; default to bash
# )
# EOF
# }
# conf_print_toml_injections | tee "${LAZY_SYNTAX}/toml/injections.scm"

conf_print_kitty_scrollback() {
  cat <<'EOF'
return {
  'mikesmithgh/kitty-scrollback.nvim',
  enabled = true,
  lazy = true,
  cmd = {
    'KittyScrollbackGenerateKittens',
    'KittyScrollbackCheckHealth',
    'KittyScrollbackGenerateCommandLineEditing',
  },
  event = { 'User KittyScrollbackLaunch' },
  config = function()
    require('kitty-scrollback').setup({

      -- ────────────────────────────────────────────────
      -- Global defaults applied to all configurations
      -- ────────────────────────────────────────────────
      status_window = {
        enabled = true,
        style_simple = false,          -- use nice Nerd Font icons
        autoclose = true,              -- auto close after loaded
        show_timer = true,             -- shows loading time (great for debugging slow startups)
        icons = {
          kitty  = '󰄛',               -- or  /  etc.
          heart  = '󰣐',
          nvim   = '',
        },
      },

      paste_window = {
        filetype = nil,                -- auto-detect shell (bash/zsh/fish)
        hide_footer = false,
        yank_register = '',            -- default register
        yank_register_enabled = true,
        winblend = 0,                  -- no transparency (clean look)
      },

      -- Useful callbacks & extras
      callbacks = {
        after_ready = nil,             -- can be overridden per config
      },

      -- ────────────────────────────────────────────────
      -- Named configurations you can call with --config <name>
      -- ────────────────────────────────────────────────

      -- Default (what you get with just kitty_scrollback_nvim)
      default = {},

      -- Opens scrollback and immediately starts backward search (?)
      search = {
        callbacks = {
          after_ready = function()
            vim.api.nvim_feedkeys('?', 'n', false)
          end,
        },
      },

      -- Only shows the last command output (very clean for quick checks)
      last_cmd = {
        kitty_get_text = {
          extent = 'last_non_empty_output',   -- or 'output' / 'screen'
        },
        status_window = {
          enabled = false,   -- cleaner without status if only last cmd
        },
      },

    })
  end,
}
EOF
}
conf_print_kitty_scrollback | tee "${LAZY_DEST}/kitty-scrollback.lua"

conf_print_diagram() {
  cat <<'EOF'
return {
  "3rd/diagram.nvim",
  dependencies = {
    { "3rd/image.nvim", opts = {} }, -- you'd probably want to configure image.nvim manually instead of doing this
  },
  opts = { -- you can just pass {}, defaults below
    events = {
      render_buffer = { "InsertLeave", "BufWinEnter", "TextChanged" },
      clear_buffer = {"BufLeave"},
    },
    renderer_options = {
      mermaid = {
        background = nil, -- nil | "transparent" | "white" | "#hex"
        theme = nil, -- nil | "default" | "dark" | "forest" | "neutral"
        scale = 1, -- nil | 1 (default) | 2  | 3 | ...
        width = nil, -- nil | 800 | 400 | ...
        height = nil, -- nil | 600 | 300 | ...
        cli_args = nil, -- nil | { "--no-sandbox" } | { "-p", "/path/to/puppeteer" } | ...
      },
      plantuml = {
        charset = nil,
        cli_args = nil, -- nil | { "-Djava.awt.headless=true" } | ...
      },
      d2 = {
        theme_id = nil,
        dark_theme_id = nil,
        scale = nil,
        layout = nil,
        sketch = nil,
        cli_args = nil, -- nil | { "--pad", "0" } | ...
      },
      gnuplot = {
        size = nil, -- nil | "800,600" | ...
        font = nil, -- nil | "Arial,12" | ...
        theme = nil, -- nil | "light" | "dark" | custom theme string
        cli_args = nil, -- nil | { "-p" } | { "-c", "config.plt" } | ...
      },
    },
  }
}
EOF
}
conf_print_diagram | tee "${LAZY_DEST}/diagram.lua"

# frizbee fuzzy finder replaces telescope (native lua) with rust library
# relying on SIMD which older hardware doesn't have, very clever if you do.
conf_print_fzf_lua_no_frizbee() {
  cat <<'EOF'
return {
  {
    "ibhagwan/fzf-lua",
    opts = function(_, opts)
      -- Force the standard fzf algorithm (much lighter on CPU)
      opts.fzf_opts = opts.fzf_opts or {}
      opts.fzf_opts["--algo"] = "v1" -- 'v1' is the original, fast algorithm

      -- Optional: Disable the scrollbar if you're on a very old fzf version
      -- as it has been known to cause crashes on older binaries.
      -- opts.fzf_opts["--no-scrollbar"] = true
    end,
  },
}
EOF
}
conf_print_fzf_lua_no_frizbee | tee "${LAZY_DEST}/fzf_lua_no_frizbee.lua"

conf_print_blink_no_frizbee() {
  cat <<'EOF'
return {
  {
    "saghen/blink.cmp",
    opts = {
      fuzzy = {
        -- 'frizbee' is the new default; 'fuzzy' is the old reliable
        implementation = "lua",
      },
    },
  },
}
EOF
}
conf_print_blink_no_frizbee | tee "${LAZY_DEST}/blink_no_frizbee.lua"
#
conf_print_local_parser_path() {
  cat <<EOF
return {
  {
    dir = "/home/default/.local/share/nvim/site", -- Points to the local path
    lazy = false,
    priority = 1000, -- Load this early
    config = function()
      vim.opt.runtimepath:append("/home/default/.local/share/nvim/site")
    end,
  }
}
EOF
}
conf_print_local_parser_path | tee "${LAZY_DEST}/local_parser_path.lua"

############################
# Hacking Below this Point #
############################
#
# Conform.nvim formatters, append new formatters here.
# Use the official bash formatter on sh files using conform.nvim
# Understands heredocs <<-EOF tab indent/removal
# gofumpt strict formatter for go
#
# conf_print_conform_formatters() {
#   cat << 'EOF'
# return {
# "stevearc/conform.nvim",
# opts = {
# formatters_by_ft = {
# sh = { "shfmt" }, bash = { "shfmt" }, zsh = { "shfmt" },
# go = { "goimports", "gofumpt" },
# },
# formatters = {
# shfmt = {
# prepend_args = { "-ln", "bash", "-i", "0", "-ci", "-sr", "-bn", "-kp" },
# },
# },
# -- these are top-level opts
# format = {
# async = false,  -- synchronous for visual selection
# timeout_ms = 500,
# lsp_format = "fallback",
# },
# log_level = vim.log.levels.debug,
# format_on_save = function(bufnr)
# if vim.g.disable_autoformat or vim.b[bufnr].disable_autoformat then return end
# return { timeout_ms = 500, lsp_format = "fallback" }
# end,
# },
# }
# EOF
# }
# conf_print_conform_formatters | tee "${LAZY_DEST}/conform-formatters.lua"
#
# conf_print_conform_conform() {
#   cat <<- 'EOF'
# vim.keymap.set("n", "<leader>uf", function()
# 	  local is_disabled = vim.g.disable_autoformat or vim.b.disable_autoformat
# 	  if is_disabled then
# 	    -- Re-enable logic (global + buffer)
# 	    vim.b.disable_autoformat = false
# 	    vim.g.disable_autoformat = false
# 	    vim.notify("Autoformat enabled", vim.log.levels.INFO)
# 	  else
# 	    vim.b.disable_autoformat = true
# 	    vim.notify("Autoformat disabled for buffer", vim.log.levels.WARN)
# 	  end
# 	end, { desc = "Toggle autoformat" })
#
# 	return {
# 	  "stevearc/conform.nvim",
# 	  opts = function(_, opts)
# 	    -- Merge formatters (preserves LazyVim defaults)
# 	    opts.formatters_by_ft = vim.tbl_extend("force", opts.formatters_by_ft or {}, {
# 	      sh = { "shfmt" },
# 	      go = { "goimports", "gofumpt" },
# 	    })
#
# 	    -- shfmt with your exact flags (heredoc-friendly)
# 	    opts.formatters = vim.tbl_extend("force", opts.formatters or {}, {
# 	      shfmt = {
# 	        prepend_args = { "-ln", "bash", "-i", "0", "-ci", "-sr", "-bn", "-kp" },
# 	      },
# 	    })
#
# 	    -- Format-on-save with guard clause (global/buffer priority)
# 	    opts.format_on_save = function(bufnr)
# 	      if vim.g.disable_autoformat or vim.b[bufnr].disable_autoformat then
# 	        return
# 	      end
# 	      return {
# 	        timeout_ms = 500,
# 	        lsp_format = "fallback",
# 	      }
# 	    end
# 	  end,
# 	}
# EOF
# }
# conf_print_conform_conform | tee "${PLUGINS_HOME}/conform.lua"

# conf_print_conform_keymaps() {
#   cat << 'EOF'
# conf_print_conform_keymaps() {
#   cat << 'EOF'
# return {
#   "stevearc/conform.nvim",
#   keys = {
#     {
#       "<leader>fs",
#       function()
#         require("conform").format({ async = false, lsp_fallback = true, timeout_ms = 500 })
#       end,
#       mode = { "n", "v" },
#       desc = "Format selection or buffer",
#     },
#     {
#       "<leader>tf",
#       function()
#         if vim.g.disable_autoformat or vim.b.disable_autoformat then
#           vim.b.disable_autoformat = false
#           vim.g.disable_autoformat = false
#           print("Autoformat enabled")
#         else
#           vim.g.disable_autoformat = true
#           print("Autoformat disabled")
#         end
#       end,
#       mode = "n",
#       desc = "Toggle Autoformat on Save",
#     },
#   },
# }
# EOF
# }
# conf_print_conform_keymaps | tee "${LAZY_DEST}/conform-keymaps.lua"

conf_print_conform_lualine() {
  cat <<-'EOF'
	return {
	  "nvim-lualine/lualine.nvim",
	  opts = function(_, opts)
	    table.insert(opts.sections.lualine_x, {
	      function()
	        if vim.g.disable_autoformat or vim.b.disable_autoformat then
	          return "󰉐 OFF"
	        end
	        return nil
	      end,
	      color = { fg = "#ff9e64", gui = "bold" },
	    })
	  end,
	}
EOF
}

conf_print_conform_lualine | tee "${LAZY_DEST}/lualine.lua"

# # A quick audit of the key systems tied to your formatting workflow and status UI.
# # Call with:
# # :lua require("utils.checklist").run()
#
# conf_print_conform_checklist() {
#   cat << EOF
# -- ~/.config/nvim/lua/utils/checklist.lua
# -- Neovim Configuration Health Check (Formatting & UI Systems)
#
# local M = {}
#
# local status = {
# 	header = "🧭 Neovim Config Checklist",
# 	items = {},
# }
#
# -- Utility function
# local function add_result(name, ok, detail)
# 	table.insert(status.items, {
# 		name = name,
# 		ok = ok,
# 		detail = detail or "",
# 	})
# end
#
# local function check_plugin(name)
# 	local ok, plugin = pcall(require, name)
# 	add_result(name, ok, ok and "Loaded ✅" or "Missing ❌")
# 	return ok, plugin
# end
#
# function M.run()
# 	status.items = {}
#
# 	-- Basic checks
# 	add_result("Neovim version", vim.fn.has("nvim-0.9") == 1, vim.version().string)
#
# 	-- Plugin checks
# 	local c_ok = check_plugin("conform")
# 	local l_ok = check_plugin("lualine")
# 	local w_ok = check_plugin("which-key")
#
# 	-- Conform.nvim sanity
# 	if c_ok then
# 		local conform = require("conform")
# 		add_result(
# 			"Conform config",
# 			type(conform.formatters_by_ft) == "table",
# 			"Formatter map loaded: " .. tostring(conform.formatters_by_ft and "yes" or "no")
# 		)
# 	end
#
# 	-- Autoformat toggles
# 	local global_toggle = vim.g.disable_autoformat
# 	local buf_toggle = vim.b.disable_autoformat
# 	add_result("Global autoformat state", global_toggle ~= true, tostring(global_toggle or false))
# 	add_result("Buffer autoformat state", buf_toggle ~= true, tostring(buf_toggle or false))
#
# 	-- Keymap validation
# 	local keymaps = vim.api.nvim_get_keymap("n")
# 	local uf_found = false
# 	for _, km in ipairs(keymaps) do
# 		if km.lhs == "<leader>uf" then
# 			uf_found = true
# 			add_result("<leader>uf Keymap", true, km.rhs)
# 			break
# 		end
# 	end
# 	if not uf_found then
# 		add_result("<leader>uf Keymap", false, "Not found ❌")
# 	end
#
# 	-- Lualine check
# 	if l_ok then
# 		local lualine_ok = pcall(require("lualine").setup)
# 		add_result("Lualine setup callable", lualine_ok, lualine_ok and "OK" or "Fail to load")
# 	end
#
# 	-- Which-key registry
# 	if w_ok then
# 		local wk = require("which-key")
# 		local has_wk = wk.register ~= nil
#
# 	-- Print results
# 	vim.notify(status.header, vim.log.levels.INFO, { title = "Checklist" })
# 	for _, item in ipairs(status.items) do
# 		local level = item.ok and vim.log.levels.INFO or vim.log.levels.WARN
# 		local icon = item.ok and "✅" or "❌"
# 		vim.notify(string.format("%s %s — %s", icon, item.name, item.detail), level, { title = "Checklist" })
# 	end
# end
#
# return M
# EOF
# }
# conf_print_conform_checklist | tee "${LAZY_UTILS_DEST}/checklist.lua"
