" hook_add {{{
let g:launcher_config.ddu = #{
      \ char: 'd',
      \ run: { -> ddu#start(#{ sources: [#{ name: 'source' }] }) },
      \ }
nnoremap <Leader>d <Cmd>Ddu -resume<CR>
inoremap <C-x><C-e> <Cmd>call ddu#start(#{
      \ sources: [
      \   #{ name: 'emoji', options: #{ defaultAction: 'feedkeys' } },
      \ ],
      \ uiParams: #{
      \   ff: #{ replaceCol: col('.') },
      \ },
      \ })<CR>

function! s:open_current_line_hunk() abort
  if !empty(&buftype)
    return
  endif
  autocmd vimrc User Ddu:uiDone ++once
        \ call ddu#ui#async_action('itemAction', #{ name: 'currentLine' })
  call ddu#start(#{
        \ name: 'git_diff_current',
        \ sourceOptions: #{ _: #{ path: expand('%:p') } },
        \ })
endfunction
nnoremap <Leader>gd <Cmd>call <SID>open_current_line_hunk()<CR>

call timer_start(10, { -> ddu#load('ui', ['ff']) })
" }}}

" hook_source {{{
autocmd vimrc User Ddu:ui:ff:openFilterWindow call s:on_ddu_ff_filter()
autocmd vimrc User Ddu:ui:ff:closeFilterWindow call ddu#ui#ff#restore_cmaps()
function! s:on_ddu_ff_filter() abort
  " NOTE: lexima defines mappings on CmdlineEnter only once, so if we start Ddu from keymap, we need to define <CR> manually
  if empty(maparg('<CR>', 'c'))
    cnoremap <expr> <CR> lexima#expand('<lt>CR>', ':')
  endif
  call ddu#ui#ff#save_cmaps(['<Esc>', '<CR>', '<C-n>', '<C-p>'])
  cnoremap <buffer> <Esc> <CR>
  cnoremap <buffer> <CR>  <CR><Cmd>call ddu#ui#do_action('itemAction')<CR>
  cnoremap <buffer> <C-n> <Cmd>call ddu#ui#multi_actions([
        \ ['cursorNext', #{ loop: v:true }],
        \ ['updateLightline'],
        \ ])<CR>
  cnoremap <buffer> <C-p> <Cmd>call ddu#ui#multi_actions([
        \ ['cursorPrevious', #{ loop: v:true }],
        \ ['updateLightline'],
        \ ])<CR>
  if has('nvim')
    call cmdline#enable()
  endif
endfunction

call ddu#custom#load_config(expand('$DEIN_DIR/settings/ddu.ts'))
" }}}

" hook_post_update {{{
call ddu#set_static_import_path()
echomsg '[ddu] ddu#set_static_import_path() called'
" }}}

" ddu-ff {{{
setlocal cursorline signcolumn=yes
autocmd vimrc-ddu ModeChanged <buffer>
      \ : if v:event.new_mode =~# '^[v\x16]'
      \ |   execute 'normal! V'
      \ | endif
nnoremap <buffer> <CR>
      \ <Cmd>call ddu#ui#do_action('itemAction')<CR>
nnoremap <buffer> <Space>
      \ <Cmd>call ddu#ui#do_action('toggleSelectItem')<CR>
xnoremap <buffer><silent> <Space>
      \ :call ddu#ui#do_action('toggleSelectItem')<CR>
nnoremap <buffer> a
      \ <Cmd>call ddu#ui#do_action('toggleAllItems')<CR>
nnoremap <buffer> c
      \ <Cmd>call ddu#ui#do_action('clearSelectAllItems')<CR>
nnoremap <buffer> i
      \ <Cmd>call ddu#ui#do_action('openFilterWindow')<CR>
nnoremap <buffer> <Tab>
      \ <Cmd>call ddu#ui#do_action('chooseAction')<CR>
nnoremap <buffer> <C-l>
      \ <Cmd>call ddu#ui#do_action('redraw', #{ method: 'refreshItems' })<Bar>redraw<CR>
nnoremap <buffer> p
      \ <Cmd>call ddu#ui#do_action('togglePreview')<CR>
nnoremap <buffer> P
      \ <Cmd>call ddu#ui#do_action('toggleAutoAction')<CR>
nnoremap <buffer> q
      \ <Cmd>call ddu#ui#do_action('quit')<CR>
nnoremap <buffer> E
      \ <Cmd>call ddu#ui#do_action('itemAction',
      \ #{ params: eval(input('params: ', "#{}\<lt>Left>")) })<CR>
nnoremap <buffer> d
      \ <Cmd>call ddu#ui#do_action('itemAction', #{ name: 'delete' })<CR>
nnoremap <buffer> W
      \ <Cmd>call ddu#ui#do_action('itemAction', #{ params:
      \ #{ command: 'call snipewin#select()<Bar>edit' } })<CR>
nnoremap <buffer> <
      \ <Cmd>call ddu#ui#do_action('collapseItem')<CR>
nnoremap <buffer> >
      \ <Cmd>call ddu#ui#do_action('expandItem', #{ mode: 'toggle' })<CR>
if b:ddu_ui_name ==# 'file_tree'
  nnoremap <buffer><expr> <CR>
        \ ddu#ui#get_item().isTree
        \   ? "<Cmd>call ddu#ui#do_action('expandItem', #{ mode: 'toggle' })<CR>"
        \   : "<Cmd>call ddu#ui#do_action('itemAction', #{ name: 'open' })<CR>"
elseif b:ddu_ui_name ==# 'git_diff_current'
  nnoremap <buffer> <C-@>
        \ <Cmd>call ddu#ui#do_action('itemAction', #{ name: 'currentHunk' })<CR>
endif
" }}}