function! vaxe#flow#Targets(...)
    return s:flow_targets
endfunction

function! vaxe#flow#ProjectFlow(...)
    if exists('g:vaxe_flow')
        unlet g:vaxe_flow
    endif
    let g:vaxe_working_directory = getcwd()

    if a:0 > 0 && a:1 != ''
        let g:vaxe_flow = expand(a:1,':p')
    else
        let flows = split(glob("**/*.flow"),'\n')

        if len(flows) == 0
            echoerr "No flow/openfl project files found in current working directory"
            return
        endif

        let base_flow = vaxe#util#InputList("Select flow", flows)

        if base_flow !~ "^\([a-zA-Z]:\)\=[/\\]"
            let base_flow = getcwd() . '/' . base_flow
        endif

        echomsg 'Project flow selected: ' . base_flow

        let g:vaxe_flow = base_flow
    endif
    if !filereadable(g:vaxe_flow)
        echoerr "Project flow file not valid, please create one."
        return
    endif
    call vaxe#flow#BuildFlowHxml(g:vaxe_flow)
    call vaxe#SetCompiler()
    return g:vaxe_flow
endfunction

function! vaxe#flow#Clean(...)
    if (a:0 && a:1 != '')
        let target = split(a:1)[0]
    else
        let target = g:vaxe_flow_target
    endif
    let command = "flow clean ".target
    call vaxe#Log(command)
    call s:Sys(command)
endfunction

function! vaxe#flow#RebuildHxml()
   if exists("b:vaxe_flow")
      call vaxe#flow#BuildFlowHxml(b:vaxe_flow)
   endif
endfunction

"A simple system function that first changes directory to the current vaxe
"working directory
function! s:Sys(cmd)
    call system("cd ".g:vaxe_working_directory." && ".a:cmd)
endfunction

function! vaxe#flow#BuildFlowHxml(flow)
    let base_hxml = a:flow.".hxml"

    if !strlen(g:vaxe_flow_target)
        call vaxe#flow#Target(a:flow)
    endif

    let g:vaxe_working_directory = fnamemodify(a:flow, ":p:h")
    let cdcmd = 'cd "'.fnameescape(g:vaxe_working_directory).'" && '

    "create the flow.hxml if not present
    if !filereadable(base_hxml)
        " pipe flow display to an hxml for completions
        let escape_base = fnameescape(base_hxml)
        call s:Sys(" echo '# THIS FILE IS AUTOGENERATED BY VAXE, ANY EDITS ARE DISCARDED' " . " > " . escape_base)
        call s:Sys(" haxelib run flow info " . g:vaxe_flow_target . " --hxml "
                    \. " >> " . escape_base )
    endif

    let b:vaxe_hxml = base_hxml
    " let g:vaxe_hxml = b:vaxe_hxml " don't set a global projet var by default
endfunction

"Sets the target.  If target is missing it asks the user. Also updates the
"makeprg compiler command
function! vaxe#flow#Target(flow, ...)
    let g:vaxe_flow_target = ''
    if a:0 > 1 && a:2 != ''
        let g:vaxe_flow_target = a:2
    else
        let g:vaxe_flow_target = vaxe#util#InputList("Select flow Target", s:flow_targets)
        let g:vaxe_flow_target = split(g:vaxe_flow_target, ":")[0]
    endif
    call vaxe#flow#BuildFlowHxml(a:flow)
    call vaxe#SetCompiler()
endfunction

" A list of all the flow targets
let s:flow_targets = [ "android : Create Google Android applications"
            \, "web : Create HTML5 webgl applications"
            \, "ios : Create Apple iOS applications"
            \, "linux --arch 32 : Create Linux 32-bit applications"
            \, "linux --arch 64 : Create Linux 64-bit applications"
            \, "mac --arch 32 : Create Apple Mac OS X 32-bit applications"
            \, "mac --arch 64 : Create Apple Mac OS X 64-bit applications"
            \, "windows --arch 32 : Create Microsoft Windows 32-bit applications"
            \, "windows --arch 64 : Create Microsoft Windows 64-bit applications"]