let s:config_json =<< trim JSON
{
  "sources": ["around", "skkeleton"],
  "keywordPattern": "[ァ-ヮア-ンー]+",
  "sourceOptions": {
    "skkeleton": {
      "matchers": ["skkeleton"],
      "sorters": [],
      "isVolatile": true
    }
  },
  "autoCompleteEvents": [],
  "ui": "pum"
}
JSON

let s:config = json_decode(join(s:config_json, ''))
function! s:ddc_init() abort
  call ddc#custom#patch_global('ui', 'pum')
  call ddc#custom#patch_global(s:config)
  call ddc#enable()
endfunction

if !exists('g:skk_ddc_alternative')
  echoerr 'g:skk_ddc_alternative is required'
endif

function! s:skkeleton_enable() abort
  call ddc#custom#patch_buffer({
        \   'autoCompleteEvents': ['InsertEnter', 'TextChangedI', 'TextChangedP'],
        \ })

  inoremap <buffer> <Tab> <Cmd>call pum#map#insert_relative(+1)<CR>
  inoremap <buffer> <S-Tab> <Cmd>call pum#map#insert_relative(-1)<CR>
  inoremap <buffer> <C-n> <Cmd>call pum#map#insert_relative(+1)<CR>
  inoremap <buffer> <C-p> <Cmd>call pum#map#insert_relative(-1)<CR>
  inoremap <buffer> <C-y> <Cmd>call pum#map#confirm()<CR>
  inoremap <buffer> <C-e> <Cmd>call pum#map#cancel()<CR>
  inoremap <buffer> <CR> <Cmd>call pum#map#confirm()<CR>

  if g:skk_ddc_alternative == 'cmp'
    lua require('cmp').setup.buffer({ enabled = false })
  elseif g:skk_ddc_alternative == 'mini'
    let g:minicompletion_disable = v:true
  endif
endfunction

function! s:skkeleton_disable() abort
  call ddc#custom#patch_buffer({'autoCompleteEvents': []})

  iunmap <buffer> <Tab>
  iunmap <buffer> <S-Tab>
  iunmap <buffer> <C-n>
  iunmap <buffer> <C-p>
  iunmap <buffer> <C-y>
  iunmap <buffer> <C-e>
  iunmap <buffer> <CR>

  if g:skk_ddc_alternative == 'cmp'
    lua require('cmp').setup.buffer({ enabled = true })
  elseif g:skk_ddc_alternative == 'mini'
    let g:minicompletion_disable = v:false
  endif
endfunction

augroup skk_ddc_alt
  autocmd!
  autocmd User skkeleton-enable-pre call <SID>skkeleton_enable()
  autocmd User skkeleton-disable-pre call <SID>skkeleton_disable()
  autocmd User skkeleton-initialize-pre ++once call <SID>ddc_init()
augroup END