local status_ok, el = pcall(require, "el")
if not status_ok then
  return
end

local builtin = require "el.builtin"
local diagnostic = require "el.diagnostic"
local extensions = require "el.extensions"
local lsp_statusline = require "el.plugins.lsp_status"
local sections = require "el.sections"
local subscribe = require "el.subscribe"

local file_icon = subscribe.buf_autocmd("el_file_icon", "BufRead", function(_, buffer)
  return extensions.file_icon(_, buffer)
end)

local git_branch = subscribe.buf_autocmd("el_git_branch", "BufEnter", function(window, buffer)
  local branch = extensions.git_branch(window, buffer)
  if branch then
    return " " .. extensions.git_icon() .. " " .. branch
  end
end)

local git_changes = subscribe.buf_autocmd("el_git_changes", "BufWritePost", function(window, buffer)
  return extensions.git_changes(window, buffer)
end)

local show_current_func = function(window, buffer)
  if buffer.filetype == "lua" then
    return ""
  end

  return lsp_statusline.current_function(window, buffer)
end

local diagnostic_display = diagnostic.make_buffer()

el.setup {
  generator = function(window, buffer)
    local mode = extensions.gen_mode { format_string = " %s " }

    local items = {
      { mode },
      { git_branch },
      { sections.split },
      { file_icon },
      { " " },
      { sections.maximum_width(builtin.make_responsive_file(140, 90), 0.40) },
      { sections.collapse_builtin { { " " }, { builtin.modified_flag } } },
      { sections.split },
      { diagnostic_display },
      { show_current_func },
      { git_changes },
      { "[" },
      { builtin.line_with_width(3) },
      { ":" },
      { builtin.column_with_width(2) },
      { "]" },
      {
        sections.collapse_builtin {
          "[",
          builtin.help_list,
          builtin.readonly_list,
          "]",
        },
      },
      { builtin.filetype },
    }

    local add_item = function(result, item)
      table.insert(result, item)
    end

    local result = {}
    for _, item in ipairs(items) do
      add_item(result, item)
    end

    return result
  end,
}