---@module "config.rootiest"
--- This module contains the configuration options and functions
--- for the rootiest distro.
--          ╭─────────────────────────────────────────────────────────╮
--          │                     Rootiest Module                     │
--          ╰─────────────────────────────────────────────────────────╯
local M = {}

--- Function to trigger an error message
---@param message string The error message to trigger
---@return boolean condition true if the error message was triggered, false otherwise
local function trigger_error(message)
  return require('data').func.notify(message, 'ERROR')
end

local function setup_os_vars()
  --  Check if we are on windows
  vim.g.is_windows = vim.fn.has('win32') == 1 or vim.fn.has('win64') == 1
end

--- Yank line without leading/trailing whitespace
---@return nil
function M.yank_line()
  vim.api.nvim_feedkeys('_v$hy$', 'n', true)
end

-- Variable to track if the precognition plugin has been called once
local precog_first_time = true

--- Toggle the precognition plugin
---@return nil
function M.toggle_precognition()
  if pcall(require, 'precognition') then
    -- Initialize precognition plugin
    local precognition = require('precognition')
    -- Toggle the plugin
    if precog_first_time then
      precognition.toggle()
      precognition.toggle() -- Call toggle twice
      precog_first_time = false
    else
      precognition.toggle() -- Call toggle once
    end
  else
    trigger_error('precognition plugin is not installed')
  end
end

--- Toggle Hardtime and Precognition together
---@return nil
function M.toggle_hardmode()
  if pcall(require, 'hardtime') then
    local hardtime = require('hardtime')
    hardtime.toggle()
    M.toggle_precognition()
  else
    trigger_error('hardtime plugin is not installed')
  end
end

--- Load remote-nvim plugin
---@return boolean condition true if the plugin was loaded, false otherwise
function M.load_remote()
  if pcall(require, 'remote-nvim') then
    ---@diagnostic disable-next-line: missing-parameter
    require('remote-nvim').setup()
    vim.cmd('RemoteStart')
    return true
  else
    trigger_error('remote-nvim plugin is not installed')
    return false
  end
end

--- Yank text inside quotes on the current line and paste it into text inside quotes at various marks.
--- @return boolean true if any text was pasted successfully, false otherwise
function M.YankAndPasteInQuotes()
  -- Yank text inside quotes on the current line
  vim.cmd('normal! yiq')

  -- Get the yanked text from the "0 register (the unnamed register)
  local yanked_text = vim.fn.getreg('"')

  -- List of marks to check ('a' to 'z')
  local marks = 'abcdefghijklmnopqrstuvwxyz'

  -- Flag to track if any pasting was successful
  local was_pasted = false

  -- Loop through each mark
  for mark in marks:gmatch('.') do
    -- Check if the mark exists (returns the line number or nil)
    local position = vim.fn.getpos("'" .. mark)

    if position[1] ~= 0 then
      -- Go to the mark
      vim.cmd("normal! '" .. mark)

      -- Select text inside quotes and paste the yanked text
      vim.cmd('normal! viq')
      vim.cmd('normal! "' .. yanked_text .. 'P')

      -- Set the flag to true since pasting was successful
      was_pasted = true
    end
  end

  -- Return whether any pasting was successful
  return was_pasted
end

--- Evaluate Neovide state and activate settings if necessary
---@return boolean condition true if Neovide is active, false otherwise
function M.eval_neovide()
  if vim.g.neovide then
    require('config.neovide')
    return true
  else
    return false
  end
end

--- Define user commands
---@return nil
function M.define_commands()
  -- Define Q as a usercmd
  vim.api.nvim_create_user_command('Q', 'qall', { desc = 'Quit all buffers' })

  -- Define yank line command
  vim.api.nvim_create_user_command('YankLine', function()
    M.yank_line()
  end, { force = true, desc = 'Yank line without leading whitespace' })
  vim.api.nvim_create_user_command(
    'YankAndPasteQuotes',
    M.YankAndPasteInQuotes,
    {}
  )
end

--- Set up rootiest module
function M.setup()
  -- Setup OS variables
  setup_os_vars()
  -- Setup neovide
  M.eval_neovide()
  -- Define user commands
  M.define_commands()
  -- Setup vimscripts
  require('data.vim').setup()
  -- Setup types data
  require('data.types').setup()
  -- Setup indentor
  require('utils.indentor')
end

return M
