" TODO treat if local (see $HOME in all tests)
" TODO mutualise call CopyResources()
" TODO mutualise (to prettify output) mode(1) to check if in -Es or not
" TODO test tabnext in at least one travis job (without -Es)
" TODO (idea) fasten travis difefrent job with the same vimwiki git (-8s)

" Declare tipical Vim preambule
  " vint: -ProhibitSetNoCompatible
  set nocompatible
  filetype plugin indent on
  syntax enable

" Usefull var: for one day, making tests on local
  let $TPLUGIN = '/testplugin'
  let $THOME = $HOME

" Set chrooted virtual runtime path
  let rtp=$ROOT.'/rtp.vim'
  exe 'source '.rtp


" Load Vader
  let vader=$ROOT.'/vader'
  exe 'set runtimepath+='.vader


" Wikis configuration
  " Declare default syntax
  let vimwiki_default = {}
  let vimwiki_default.path = $HOME . '/testwiki'
  let vimwiki_default.path_html = $HOME . '/html/default'
  let vimwiki_default.syntax = 'default'
  let vimwiki_default.ext = '.wiki'
  let vimwiki_default.name = 'DefaultSyntax'
  let vimwiki_default.base_url = 'https://example.com/'

  " Declare markdown syntax - https://github.github.com/gfm/
  let vimwiki_markdown = {}
  let vimwiki_markdown.path = $HOME . '/testmarkdown'
  let vimwiki_markdown.path_html = $HOME . '/html/markdown'
  let vimwiki_markdown.syntax = 'markdown'
  let vimwiki_markdown.ext = '.md'
  let vimwiki_markdown.name = 'MarkdownSyntax'

  " Declare mediawiki syntax - https://www.mediawiki.org/wiki/Help:Formatting
  let vimwiki_mediawiki = {}
  let vimwiki_mediawiki.path = $HOME . '/testmediawiki'
  let vimwiki_mediawiki.path_html = $HOME . '/html/mediawiki'
  let vimwiki_mediawiki.syntax = 'media'
  let vimwiki_mediawiki.ext = '.mw'
  let vimwiki_mediawiki.name = 'MediaWikiSyntax'

  " Register the 3 wikis
  let g:vimwiki_list = [vimwiki_default, vimwiki_markdown, vimwiki_mediawiki]
  let g:vimwiki_list_vimrc = [vimwiki_default, vimwiki_markdown, vimwiki_mediawiki]


" Set basic settings
  " Avoid more prompt
  set nomore
  set backspace=indent,eol,start
  set wildmode=longest:full,full
  set wildmenu
  set wildignorecase
  set splitbelow
  set splitright
  set timeoutlen=600
  set ignorecase
  set smartcase
  set hidden
  set laststatus=2
  set hlsearch


" Map
  " Map ctrl-p/n for history completion instead of up/down arrows
  cnoremap <C-p> <Up>
  cnoremap <C-n> <Down>

  " Map jj to go back to command mode
  inoremap jj <esc>

  " Use <C-L> to clear the highlighting of :set hlsearch and also preserve the
  " default behavior of redrawing the screen
  if maparg('<C-L>', 'n') ==# ''
      nnoremap <silent> <C-L> :nohlsearch<C-R>=has('diff')?'<Bar>diffupdate':''<CR><CR><C-L>
  endif

" Define functions
  " Change the syntax using a temporary wiki
  function! SetSyntax(vw_syn)
    if a:vw_syn ==# 'default'
      let ext = 'wiki'
    elseif a:vw_syn ==# 'markdown'
      let ext = 'md'
    elseif a:vw_syn ==# 'media'
      let ext = 'mw'
    else
      Log 'ERROR: Invalid syntax "' . a:vw_syn . '" in SetSyntax()'
      Log 'NOTE: function only accepts "media" for setting mediawiki syntax'
      return
    endif
    let path = expand('%:p:h')
    let new_temp_wiki_settings = {'path': path,
          \ 'ext': ext,
          \ 'syntax': a:vw_syn,
          \ }

    " Remove any temporary wikis each time this function is called.
    " This is necessary to ensure syntax is properly set when running multiple tests
    " NOTE: this assumes there are 3 defined wikis in the vimrc. The last wiki
    " contains default settings for temporary wikis (so there are always
    " num wikis in vimrc + 1)
    let num_wikis = len(g:vimwiki_wikilocal_vars)
    while  num_wikis > 4
      call remove(g:vimwiki_wikilocal_vars, num_wikis - 1)
      let num_wikis = num_wikis - 1
    endwhile

    " Add the new wiki
    call vimwiki#vars#add_temporary_wiki(new_temp_wiki_settings)
    call vimwiki#vars#set_bufferlocal('wiki_nr', 3)

    " Verify syntax was set correctly
    Assert vimwiki#vars#get_wikilocal('syntax') ==# a:vw_syn, 
          \ 'ERROR: Vimwiki syntax not set correctly: '
          \ . 'Want: ' . a:vw_syn . ' '
          \ . 'Have: ' . vimwiki#vars#get_wikilocal('syntax') 
  endfunction

  function! UnloadVimwiki()
    " Clear mappings so plugin can be reloaded
    " this is needed if running manually multiple times
    nmapclear

    " UNlet what can be
    " -- Note: getcompletion not present on vim7.3
    for i in ['g:vimwiki_commentstring',
          \ 'b:did_ftplugin',
          \ 'g:loaded_vimwiki',
          \ 'g:vimwiki_global_vars',
          \ 'g:vimwiki_wikilocal_vars',
          \ 'g:vimwiki_syntaxlocal_vars',
          \ 'g:vimwiki_list',
          \ ]
      if exists(i)
        exe 'unlet ' . i
      endif
    endfor

    " Unlet ftplugin:
    " -- Vader often staty in same buffer: [Vader-workbench]
    if exists('b:did_ftplugin')
      unlet b:did_ftplugin
    endif
  endfunction

  " Source plugin
  function! LoadVimwiki()
    runtime! plugin/vimwiki.vim
  endfunction

  " Reload plugin to change settings
  function! ReloadVimwiki()
    call UnloadVimwiki()

    " Reset list
    let g:vimwiki_list = g:vimwiki_list_vimrc

    call LoadVimwiki()
  endfunction

  function! ReloadVars()
    " vars#init will not reload syntax varaible if not set
    unlet g:vimwiki_syntaxlocal_vars
    call vimwiki#vars#init()
  endfunction

  " Copy wiki test resources so that vimtest user can write them
  function! CopyResources()
    call system('cp -r /testplugin/test/resources/* $HOME/')
    " Make diary directory
    call system('mkdir $HOME/testwiki/diary')
    call system('mkdir $HOME/testmarkdown/diary')
  endfunction

  " Delete Hidden buffer, usefull to clean
  " Stole from: https://stackoverflow.com/a/8459043/2544873
  function! DeleteHiddenBuffers()
    let tpbl=[]
    call map(range(1, tabpagenr('$')), 'extend(tpbl, tabpagebuflist(v:val))')
    for buf in filter(range(1, bufnr('$')), 'bufexists(v:val) && index(tpbl, v:val)==-1')
      if bufname(buf) =~? 'Vader'
          continue
      endif
      silent execute 'bwipeout!' buf
    endfor
  endfunction

  " Write current file: helper to hide `set bt=`
  function! WriteMe()
    set buftype=
    write %
  endfunction

  " Delete a file <- path <string>
  function! DeleteFile(path)
    let path = expand(a:path)
    " Delete file
    try
      call delete(path)
    catch | endtry
    " Delete Buffer
    try
      execute 'bwipeout! ' . path
    catch | endtry
  endfunction

  " Print a command output to the buffer
  function! PrintCommand(cmd)
    redir => message
    silent execute a:cmd
    redir END
    if empty(message)
      Log 'no output'
    else
      silent put=message
    endif
  endfunction

  " Destroy a variable is exists (unlet)
  function! DestroyVar(var)
    if ! exists(a:var) | return | endif
    execute 'unlet ' . a:var
  endfunction

  " Assert current tab is desired tab
  function! AssertTab(nr)
    " Vader is creating 2 tabs
    AssertEqual a:nr + 2, tabpagenr()
  endfunction

  " Convert current buffer: wiki -> html
  " No side effect (if no bug)
  function! ConvertWiki2Html()
    " Save fbuffer number (to come back)
    let g:buf_vader = bufnr('%')

    " Cut wiki content
    let wiki_content = getline(1, '$')
    1,$delete

    " Paste to a named file
    " Edit a new file in wiki_root
    edit $HOME/testwiki/test_Convert2Html.wiki
    " Ensure it is void
    1,$delete
    " Write wiki content
    call setline(1, wiki_content)
    " Dump buffer to disk
    call WriteMe()

    " Convert
    """""""""
    Vimwiki2HTML

    " Cut output
    edit $HOME/html/default/test_Convert2Html.html
    let html_content = getline(1, '$')
    1,$delete

    " Paste output in [Vader] buffer
    execute 'buffer ' . g:buf_vader
    call setline(1, html_content)

    " Delete files
    call DeleteFile('$HOME/html/default/test_Convert2Html.html')
    call DeleteFile('$HOME/testwiki/test_Convert2Html.wiki')
  endfunction


  " Get normalized syntax group: usefull for boldItalic Vs italicBold
  " -- Here, Vader's SyntaxAt is not enough
  " From: https://stackoverflow.com/questions/9464844
  function! GetSyntaxGroup(line, col)
    let l:s = synID(a:line, a:col, 1)
    return synIDattr(synIDtrans(l:s), 'name')
  endfun

  " Run Assert only if vim version higth enough
  function! AssertIfVersion(version, one, two)
    if v:version < a:version | return | endif
    AssertEqual a:one, a:two
  endfunction

" vim: ft=vim:sw=2
