*! part of -mpitb- the MPI toolbox

cap program drop _mpitb_ctyselect
program define _mpitb_ctyselect , rclass
	syntax varname [if] , [Select(namelist min=1) Rexp(string) /// 
		WRegion(namelist)] // Wregion(numlist min=1 integer)]
	* di "_mpitb_ctyselect was run!"
	* todo allow if for: wregion based on label values

	* tests
	conf v `varlist'

	if ("`select'" != "" & ("`rexp'" != "" | "`wregion'" != "")) | ("`rexp'" != "" & "`wregion'" != "") {
		di as err "Please choose only one of {bf:select()}, {bf:rexp()}, or {bf:wregion()}!"
		exit 197
	}

	* check: duplicates in select?
	loc dupsel : list dups select 
	if "`dupsel'" != "" {
		di as txt "Note: Countries specified repeatedly (`dupsel'). Ignoring..."
		loc select : list uniq select		// make list of unique elements
	}
	
	* check: do all ctys exist?
	if "`select'" != "" {
		qui levelsof `varlist' , c l(ctyall)		
		loc ctyok : list select in ctyall
		if `ctyok' == 1 {
			loc ctylist `select'
		}
		else {
			loc ctynok : list select - ctyall
			di as err "Country `ctynok' not found!"
			exit  198
		}
	}
	else if "`rexp'" != "" {
		qui levelsof `varlist' if regexm(`varlist',"`rexp'") , c l(ctylist) 
	}
	else if "`wregion'" != "" {
		* string version values 
		
		foreach w of loc wregion {
			loc vwregions `_dta[GMPI_worldreg_lab]'
			loc wnum : list posof `"`w'"' in vwregions 
			if `wnum' == 0 {
				di as err "Invalid world regions (`w')!"
				exit 198
			}
			qui levelsof `varlist' if `_dta[GMPI_worldreg]' == `wnum' , l(ctyl_`wnum') c
			loc ctylist "`ctylist' `ctyl_`wnum''"
		}
		qui levelsof `varlist' if mi(`_dta[GMPI_worldreg]') & !mi(`varlist') , c
		if r(levels) != "" {
			di as err "Warning: some countries seem to lack world region (`r(levels)')"
			
		}
		
		
		/* numeric version
		loc validwreg 1 2 3 4 5 6
		loc wregok : list wregion in validwreg
		if `wregok' == 1 {				// are all numbers valid regions?
			loc ctylist ""
			foreach r of numlist `wregion' {
				levelsof `varlist' if `_dta[GMPI_worldreg]' == `r' , l(ctyl_`r') c
				loc ctylist "`ctylist' `ctyl_`r''"
			}
		}

		else {
			loc wregnok : list wregion - validwreg
			di as err "Invalid regions of the world: `wregnok'"
			exit 198
		}
		*/
	}
	else if "`select'" == "" & "`rexp'" == "" & "`wregion'" == "" {			// all available countries
		qui levelsof `varlist' `if' , l(ctylist) c
	}

	loc Nctylist : word count `ctylist'
	di as txt "Note: `Nctylist' countries selected: `ctylist'."

	ret loc ctylist `ctylist'
	ret loc Nctylist `Nctylist'
end