local M = {}
local utils = require("utils")

-- Only return interesting ffenc (not utf-8[unix])
function M.custom_ffenc()
    local enc = vim.bo.fenc
    local format = vim.bo.fileformat
    if enc ~= "utf-8" or format ~= "unix" then
        return enc .. "[" .. format .. "]"
    end

    return ""
end

function M.mixed_indent()
    local mixed = vim.fn.search([[\v^(\t+ | +\t)]], "nw")
    if mixed > 0 then
        return "i:" .. mixed
    end
    local space_indent = vim.fn.search([[\v^ +]], "nw")
    local tab_indent = vim.fn.search([[\v^\t+]], "nw")
    if tab_indent > 0 and space_indent > 0 then
        return "i:" .. require("math").max(tab_indent, space_indent)
    end

    return ""
end

function M.trailing_whitespace()
    local line = vim.fn.search([[\s\+$]], "nw")
    if line ~= 0 then
        return "tw:" .. line
    end

    return ""
end

-- Configure lualine witha  provided theme
function M.config_lualine(theme_name)
    -- Theme name transformations
    if theme_name == nil then
        theme_name = "auto"
    elseif theme_name:find("wombat") then
        theme_name = "wombat"
    elseif theme_name == "wombuddy" then
        theme_name = "wombat"
    end

    local gps = {}
    if utils.is_plugin_loaded("nvim-gps") then
        gps = require("nvim-gps")
        gps.setup({
            icons = {
                ["class-name"] = "(c) ",
                ["function-name"] = "(ƒ) ",
                ["method-name"] = "(m) ",
                ["container-name"] = "",
                ["tag-name"] = "(t) ",
            },
        })
    end

    local diagnostic_plugin = "nvim_diagnostic"
    if vim.fn.has("nvim-0.6.0") ~= 1 then
        diagnostic_plugin = "nvim_lsp"
    end

    require("lualine").setup({
        options = {
            theme = theme_name,
            icons_enabled = false,
            component_separators = { left = "|", right = "|" },
            section_separators = { left = "", right = "" },
        },
        sections = {
            lualine_a = {
                {
                    "mode",
                    fmt = function(str)
                        return str:sub(1, 1)
                    end,
                },
            },
            lualine_b = { "FugitiveHead", "diff" },
            lualine_c = { "filename", { gps.get_location, cond = gps.is_available } },
            lualine_x = { M.custom_ffenc, "filetype" },
            lualine_y = { "progress", "location" },
            lualine_z = {
                { "diagnostics", sources = { diagnostic_plugin } },
                { M.mixed_indent, color = { bg = "#de4f1f" } },
                { M.trailing_whitespace, color = { bg = "#de4f1f" } },
            },
        },
    })
end

return M