let s:Git = vital#gina#import('Git')
let s:Store = vital#gina#import('System.Store')


function! gina#complete#stash#any(arglead, cmdline, cursorpos) abort
  let git = gina#core#get_or_fail()
  let slug = eval(s:Store.get_slug_expr())
  let store = s:Store.of([
        \ s:Git.resolve(git, 'HEAD'),
        \ s:Git.resolve(git, 'index'),
        \])
  let candidates = store.get(slug, [])
  if empty(candidates)
    let candidates = s:get_available_stashes(git, [])
    call store.set(slug, candidates)
  endif
  return s:filter(a:arglead, candidates)
endfunction

" Public ---------------------------------------------------------------------
function! s:filter(arglead, candidates) abort
  return gina#util#filter(a:arglead, a:candidates)
endfunction

function! s:get_available_stashes(git, args) abort
  let args = ['stash', 'list', '--format=%gd'] + a:args
  let result = gina#process#call(a:git, args)
  if result.status
    return []
  endif
  let candidates = copy(result.stdout)
  return filter(candidates, '!empty(v:val)')
endfunction