require("mini.align").setup()
require("mini.move").setup()
require("mini.starter").setup()

require("mini.statusline").setup({
  content = {
    active = function()
      local mode, mode_hl = MiniStatusline.section_mode({ trunc_width = 120 })
      local git = MiniStatusline.section_git({ trunc_width = 75 })
      local diagnostics = MiniStatusline.section_diagnostics({ trunc_width = 75 })
      local filename = MiniStatusline.section_filename({ trunc_width = 140 })
      local fileinfo = MiniStatusline.section_fileinfo({ trunc_width = 120 })
      local location = MiniStatusline.section_location({ trunc_width = 75 })
      local mode_hl_inverse = mode_hl .. "Inverse"
      -- Usage of `MiniStatusline.combine_groups()` ensures highlighting and
      -- correct padding with spaces between groups (accounts for 'missing'
      -- sections, etc.)
      return MiniStatusline.combine_groups({
        { hl = mode_hl_inverse, strings = {} },
        "",
        { hl = mode_hl, strings = { mode } },
        { hl = "MiniStatuslineDevinfo", strings = { git, diagnostics } },
        "%<", -- Mark general truncate point
        { hl = "MiniStatuslineFilename", strings = { filename } },
        "%=", -- End left alignment
        { hl = "MiniStatuslineFileinfo", strings = { fileinfo } },
        { hl = mode_hl, strings = { location } },
        { hl = mode_hl_inverse, strings = {} },
        "",
      })
    end,
  },
})
local MiniStatuslineModes = {
  "MiniStatuslineModeInsert",
  "MiniStatuslineModeNormal",
  "MiniStatuslineModeReplace",
  "MiniStatuslineModeVisual",
  "MiniStatuslineModeCommand",
  "MiniStatuslineModeOther",
}
for _, mode_hl in ipairs(MiniStatuslineModes) do
  local hl_table = vim.api.nvim_get_hl(0, { name = mode_hl })
  local fg = hl_table.fg
  hl_table.fg = hl_table.bg
  hl_table.bg = fg
  vim.api.nvim_set_hl(0, mode_hl .. "Inverse", hl_table)
end

local animate = require("mini.animate")
local animation = {
  timing = animate.gen_timing.quadratic({ duration = 100, unit = "total" }),
}
animate.setup({
  cursor = animation,
  scroll = { enable = false },
  resize = animation,
  open = animation,
  close = animation,
})