*! Part of package matrixtools v. 0.31
*! Support: Niels Henrik Bruun, niels.henrik.bruun@gmail.com
*TODO lookfor option: If the argument isn't a varlist then the varlist generated from using -lookfor- on the argument should be the argument
*TODO Long and short versions = with and without opening the datasets
/*
2020-05-24 >	nhb_msa_variable_description() has been modified
2019-06-11 >	Caption/Title added
2017-08-31 >	When the dataset changed it is saved
2017-07-21 >	Bug in metadata regarding value labels fixed
*/
* TODO: To have a short version with opening the datasets based on -describe using-
* TODO: Filters such as max filesize
* TODO: Undgå at ikke gemte tilføjelser slettes med metadata
program define metadata
	version 12.1
	syntax [anything(name=vlst)] [using/], /*
			*/[ /*
			*/SAvein(string) /*
			*/Keep /*
			*/noLog /*
			*/SEarchsubdirs /*
			*/noQuietly /*
			*/Style(string) /*
			*/TItle(string) /*
			*/CAPtion(string) /*
			*/TOp(string) /*
			*/Undertop(string) /*
			*/Bottom(string) /*
			*/]

	local QUIETLY "quietly"
	if "`quietly'" != "" local QUIETLY ""
	if "`vlst'" == "" local vlst *
	if "`title'" != "" local caption `"`title'"'

	`QUIETLY' {
		display "NoQuietly turned on"
		if "`keep'" == "" {
			if `c(changed)' {
				tempfile tmpdata
				save `tmpdata', replace
				local current_file = `"`tmpdata'"'
			}
			else local current_file = subinstr("$S_FN", "\", "/", .)
		}
		if `"`using'"' != "" {
			mata: __vd = metadata(`"`using'"', `"`vlst'"', `=`"`searchsubdirs'"' != ""')
			mata: __justify = ("-", "-", "", "-", "", "-", "-", "-", "-", "")
		}
		else {
			local current_file = subinstr("$S_FN", "\", "/", .)
			unab __vlst : `vlst'
			mata: __vd = nhb_msa_variable_description(`"`__vlst'"')
			mata: __justify = ("-", "", "-", "-", "-", "-", "")
		}
		clear
		mata: nhb_sae_addvars(strlower(__vd[1,.]), __vd[2..rows(__vd),.])
		compress
		destring, replace
		capture format %15.3f Filesize_kb
		label data "metadata search. See notes for command and pwd"
		notes: COMMAND: metadata `0'
		notes: PWD: `c(pwd)'
		if `"`savein'"' != "" quietly {
			local __replace 0
			if regexm(`"`savein'"', "^(.+) *, *replace *") {
				local __replace = 1
				local savein = regexs(1)
			}
			if regexm(`"`savein'"', ".*\.(dta|smcl|csv|htm|html|tex|latex|md) *$") local style = regexs(1)
			else {
				mata: _error("Suffix must be one of: dta, smcl, csv, htm, html, latex, tex or md")
			}
			if "`style'" == "dta" {
				if `__replace' capture rm `"`savein'"'
				save `"`savein'"', replace
			}
		}
		if `"`current_file'"' != "" & "`keep'" == "" use `"`current_file'"', clear
	}
	if "`log'" != "nolog" {
		if "`style'" != "dta" {
			mata: __vd = nhb_mt_mata_string_matrix_styled(__vd, `"`style'"', ///
							__justify, 1, ///
							`"`caption'"', `"`top'"', `"`undertop'"', ///
							`"`bottom'"', `"`savein'"', strtoreal(`"`__replace'"'))
		}
		else {
			mata: __vd = nhb_mt_mata_string_matrix_styled(__vd, "", ///
							__justify, 1, ///
							`"`caption'"', `"`top'"', `"`undertop'"', ///
							`"`bottom'"', "", 0)
		}
	}
end

mata:
	function metadata(	string scalar dirfilefilter,
						string scalar varfilter,
						real scalar search_subdirs
						)
	{
		real scalar r, R, rc
		string scalar dn, fn, fs
		string matrix dsets, vd, vd_tmp

		if ( direxists(dirfilefilter) ) {
			if ( search_subdirs ) {
				dsets = nhb_msa_oswalk(dirfilefilter, "", "*.dta")
			} else {
				dsets = dir(dirfilefilter, "files", "*.dta")
				dsets = J(rows(dsets), 1, dirfilefilter), dsets
			}
		} else {
			pathsplit(dirfilefilter, dn, fn)
			if (dn == "" ) dn = "."
			if ( !regexm(fn, ".dta$") ) fn = sprintf("%s.dta", fn)
			dsets = dn, fn
		}
		if ( rows(dsets) ) {
			dsets[.,1] = subinstr(dsets[.,1], "\", "/")
			dsets[.,1] = subinstr(dsets[.,1], "//", "/")
			vd = J(0, 12, "")
			for(r=1;r<=rows(dsets);r++) {
				fn = sprintf(`"%s/%s"', dsets[r,1], dsets[r,2])
				rc = _stata(sprintf(`"use "%s", clear"', fn))
				if ( !rc ) {
					st_local("__vlst", "")
					rc = _stata(sprintf(`"capture unab __vlst : %s"', varfilter))
					if ( st_local("__vlst") != "" ) {
						vd_tmp = nhb_msa_variable_description(st_local("__vlst"))
						rc = _stata("macro drop __vlst")
						R = rows(vd_tmp)
						fs = nhb_msa_file_size_kb(fn)
						vd = vd \ (J(R-1, 1, (dsets[r,.], fs)), vd_tmp[2..R, .])
					}
				}
			}
			vd = ("Dataset_path", "Dataset", "Filesize kb", vd_tmp[1,.]) \ vd
		} else {
			vd = ("Dataset_path", "Dataset", "Filesize kb", "Name", "Index", "Label", "Value Label Name", "Format", "Value Label Values", "n", "unique", "missing")
			vd = vd \ J(1, cols(vd), "Nothing found")
		}
		return(vd)
	}
end