"=============================================================================
" FILE: github.vim
" AUTHOR:  Shougo Matsushita <Shougo.Matsu@gmail.com>
" License: MIT license  {{{
"     Permission is hereby granted, free of charge, to any person obtaining
"     a copy of this software and associated documentation files (the
"     "Software"), to deal in the Software without restriction, including
"     without limitation the rights to use, copy, modify, merge, publish,
"     distribute, sublicense, and/or sell copies of the Software, and to
"     permit persons to whom the Software is furnished to do so, subject to
"     the following conditions:
"
"     The above copyright notice and this permission notice shall be included
"     in all copies or substantial portions of the Software.
"
"     THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
"     OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
"     MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
"     IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
"     CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
"     TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
"     SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
" }}}
"=============================================================================

let s:save_cpo = &cpo
set cpo&vim

function! neobundle#sources#github#define() abort "{{{
  return s:source
endfunction"}}}

let s:source = {
      \ 'name' : 'github',
      \ 'short_name' : 'github',
      \ }

" sorter
let s:filter = {
\   "name" : "sorter_stars",
\}

function! s:filter.filter(candidates, context) abort
    return unite#util#sort_by(a:candidates, 'v:val.source__stars')
endfunction

call unite#define_filter(s:filter)
unlet s:filter

function! s:source.gather_candidates(args, context) abort "{{{
  let plugins = s:get_github_searches(a:context.source__input)


  return map(copy(plugins), "{
        \ 'word' : v:val.full_name. ' ' . v:val.description,
        \ 'source__name' : (v:val.fork ? '| ' : '') .
        \          v:val.full_name,
        \ 'source__path' : v:val.full_name,
        \ 'source__description' : v:val.description,
        \ 'source__stars' : v:val.stargazers_count,
        \ 'source__options' : [],
        \ 'action__uri' : v:val.html_url,
        \ }")
endfunction"}}}

" Misc.
" @vimlint(EVL102, 1, l:true)
" @vimlint(EVL102, 1, l:false)
" @vimlint(EVL102, 1, l:null)
function! s:get_github_searches(string) abort "{{{
  let uri = 'https://api.github.com/search/repositories?q='
        \ . a:string . '+language:VimL'.'\&sort=stars'.'\&order=desc'
  let temp = neobundle#util#substitute_path_separator(tempname())

  let cmd = neobundle#util#wget(uri, temp)

  call unite#print_message(
        \ '[neobundle/search:github] Searching plugins from github...')
  redraw

  let result = unite#util#system(cmd)

  if cmd =~# '^E:'
    call unite#print_error(
          \ '[neobundle/search:github] '.
          \ 'wget or curl command is not available!')
    return []
  elseif unite#util#get_last_status()
    call unite#print_message('[neobundle/search:github] ' . cmd)
    call unite#print_error('[neobundle/search:github] Error occurred!')
    call unite#print_error(result)
    return []
  elseif !filereadable(temp)
    call unite#print_error('[neobundle/search:github] '.
          \ 'Temporary file was not created!')
    return []
  else
    call unite#print_message('[neobundle/search:github] Done!')
  endif

  let [true, false, null] = [1,0,"''"]
  sandbox let data = eval(join(readfile(temp)))
  call filter(data.items,
        \ "stridx(v:val.full_name, a:string) >= 0")

  call delete(temp)

  return data.items
endfunction"}}}
" @vimlint(EVL102, 0, l:true)
" @vimlint(EVL102, 0, l:false)
" @vimlint(EVL102, 0, l:null)

call unite#custom_source('neobundle/search', 'sorters', 'sorters_stars')

let &cpo = s:save_cpo
unlet s:save_cpo

" vim: foldmethod=marker