module main

import os
import flag
import compiler
import strings

const (
	tool_version = '0.0.1'
	tool_description = '  Extracts the function names declared in a v file.'
)

fn f_to_string(fmod string, f compiler.Fn) ?string {
	svisibility := if f.is_public {
		'public'
	}else{
		'private'
	}
	if fmod != f.v_fn_module() { return none }
	if fmod == 'builtin' {
		return '$svisibility\t' + f.v_fn_name()
	}
	return '$svisibility\t' + f.v_fn_module() + '.' + f.v_fn_name()
}

fn analyze_v_file(file string) {
	println('')
	hash := strings.repeat(`#`, (76 - file.len) / 2)
	println('$hash  $file  $hash')

	// main work:
	mut v := compiler.new_v_compiler_with_args([file])
	v.add_v_files_to_compile()
	for f in v.files { v.parse(f, .decl) }
	fi := v.get_file_parser_index( file ) or { panic(err) }
	fmod :=  v.parsers[fi].mod
	
	// output:
	mut fns :=[]string
	for _, f in v.table.fns {
		fname := f_to_string(fmod, f) or { continue }
		fns << fname
	}
	fns.sort()
	for f in fns { println(f) }
	
}

fn main(){
	toolexe := os.executable()
	compiler.set_vroot_folder( os.dir(os.dir(toolexe)) )
	
	mut fp := flag.new_flag_parser(os.args)
	fp.application(os.filename(toolexe))
	fp.version( tool_version )
	fp.description( tool_description )
	fp.arguments_description('FILE.v/FOLDER [FILE.v/FOLDER]...')
	fp.limit_free_args_to_at_least(1)
	fp.skip_executable()
	show_help:=fp.bool_('help', `h`, false, 'Show this help screen\n')	
	if( show_help ){
		println( fp.usage() )
		exit(0)
	}
	
	mut files := []string
	locations := fp.finalize() or { eprintln('Error: ' + err) exit(1) }
	for xloc in locations {
		loc := os.realpath(xloc)
		xfiles := if os.is_dir(loc){ os.walk_ext(loc,'.v') } else { [loc] }
		filtered_files := xfiles.filter(!it.ends_with('_js.v'))
		files << filtered_files
	}

	for file in files {
		analyze_v_file(file)
	}
}
