" -----------------------------------------------------------------------------
"     - Statusline setup -
" -----------------------------------------------------------------------------

function s:UpdateColors()
    let ctermbg = synIDattr(synIDtrans(hlID('StatusLine')), 'fg', 'cterm')
    let guibg = synIDattr(synIDtrans(hlID('StatusLine')), 'fg', 'gui')
    let idguifg1 = synIDattr(synIDtrans(hlID('Function')), 'fg', 'gui')
    let idctermfg1 = synIDattr(synIDtrans(hlID('Function')), 'fg', 'cterm')
    " Green in gruvbox
    exec 'hi User1 guifg=' . l:idguifg1 .
                \' ctermfg=' . l:idctermfg1 .
                \' guibg=' . l:guibg .
                \' ctermbg=' . l:ctermbg .
                \' cterm=bold gui=bold'
    let idguifg2 = synIDattr(synIDtrans(hlID('WarningMsg')), 'fg', 'gui')
    let idctermfg2 = synIDattr(synIDtrans(hlID('WarningMsg')), 'fg', 'cterm')
    " Red in gruvbox
    exec 'hi User2 guifg=' . l:idguifg2 .
                \' ctermfg=' . l:idctermfg2 .
                \' guibg=' . l:guibg .
                \' ctermbg=' . l:ctermbg .
                \' cterm=bold gui=bold'
    let idguifg3 = synIDattr(synIDtrans(hlID('MoreMsg')), 'fg', 'gui')
    let idctermfg3 = synIDattr(synIDtrans(hlID('MoreMsg')), 'fg', 'cterm')
    " Yellow in gruvbox
    exec 'hi User3 guifg=' . l:idguifg3 .
                \' ctermfg=' . l:idctermfg3 .
                \' guibg=' . l:guibg .
                \' ctermbg=' . l:ctermbg .
                \' cterm=bold gui=bold'
    let idguifg4 = synIDattr(synIDtrans(hlID('Identifier')), 'fg', 'gui')
    let idctermfg4 = synIDattr(synIDtrans(hlID('Identifier')), 'fg', 'cterm')
    " Blue in gruvbox
    exec 'hi User4 guifg=' . l:idguifg4 .
                \' ctermfg=' . l:idctermfg4 .
                \' guibg=' . l:guibg .
                \' ctermbg=' . l:ctermbg .
                \' cterm=bold gui=bold'
    let idguifg5 = synIDattr(synIDtrans(hlID('Number')), 'fg', 'gui')
    let idctermfg5 = synIDattr(synIDtrans(hlID('Number')), 'fg', 'cterm')
    " Blue in gruvbox
    exec 'hi User5 guifg=' . l:idguifg5 .
                \' ctermfg=' . l:idctermfg5 .
                \' guibg=' . l:guibg .
                \' ctermbg=' . l:ctermbg .
                \' cterm=bold gui=bold'
endfunction

augroup statuslineconf
    autocmd!
    autocmd ColorScheme * call s:UpdateColors()
augroup END

call s:UpdateColors()


" Checks file type to add a pretty glyph if available
function s:GetFileType()
    if &filetype ==# "rust"
        return "%2*%*"
    elseif &filetype ==# "c"
        return "%4*%*"
    elseif &filetype ==# "cs"
        return "%4*%*"
    elseif &filetype ==# "python"
        return "%3*%*"
    elseif &filetype ==# "javascript"
        return ""
    elseif &filetype ==# "typescript"
        return "%4*%*"
    elseif &filetype ==# "vim"
        return "%1*%*"
    elseif &filetype ==# "clojure"
        return ""
    elseif &filetype ==# "html"
        return ""
    elseif &filetype ==# "haskell"
        return ""
    elseif &filetype ==# "markdown"
        return ""
    elseif &filetype ==# "org"
        return ""
    elseif &filetype ==# "scss"
        return ""
    elseif &filetype ==# "scala"
        return ""
    elseif &filetype ==# "elixir"
        return "%5*%*"
    elseif &filetype ==# "kotlin"
        return "%2*洞%*"
    elseif &filetype ==# "yml"
        return ""
    elseif &filetype ==# "toml"
        return ""
    elseif &filetype ==# "json"
        return ""
    else
        return "%y"
endfunction

" Check current mode to add colorized mode
function s:GetMode()
    if mode() == "n"
        return "N"
    elseif mode() == "i"
        return "%3*I%*"
    elseif mode() == "v"
        return "%1*V%*"
    elseif mode() == "V"
        return "%1*V.%*"
    elseif mode() == "\<C-V>"
        return "%1*VB%*"
    elseif mode() == "c"
        return "%4*C%*"
    else
        return "[mode: " . mode() . "]"
endfunction

" Add basic [paste] if paste mode is enabled
function! s:PasteForStatusline()
    let paste_status = &paste
    if paste_status == 1
        return " [paste] "
    else
        return ""
    endif
endfunction

function! s:LinterStatus() abort
    let l:counts = ale#statusline#Count(bufnr(''))

    let l:all_errors = l:counts.error + l:counts.style_error
    let l:all_non_errors = l:counts.total - l:all_errors

    return l:counts.total == 0 ? '%1* OK %*' : printf(
    \   '%%3*%dW%%* %%2*%dE%%*',
    \   all_non_errors,
    \   all_errors
    \)
endfunction

function GetStatusLine()
    let l:status_line_left = " " . s:GetMode() . " "
    if exists('g:loaded_fugitive')
        let l:fugitive_head = FugitiveHead()
        if strlen(l:fugitive_head)
            let l:status_line_left .= "%4* " . l:fugitive_head . "%*"
        endif
    endif
    let l:status_line_left .= " %f" " Filename
    let l:status_line_left .= " %1*%M%*" " Modified
    let l:status_line_left .= " %2*%r%*" " Read only
    let l:status_line_left .= s:PasteForStatusline()
    if exists('g:did_coc_loaded')
        let l:coc_status = coc#status()
        if strlen(l:coc_status)
            let l:status_line_left .= "%2*" . l:coc_status . "%*"
        endif
    endif
    let l:status_line_right = "%=   " " Align right statusline
    if exists('g:loaded_ale')
        let l:status_line_right .= s:LinterStatus() " ALE status
    endif
    let l:status_line_right .= " %2c:%3l/%3L (%3p%%) " " col, line, tot. lines
    let l:status_line_right .= s:GetFileType() . " " " File type
    return l:status_line_left . l:status_line_right
endfunction
set statusline=%!GetStatusLine()
