*******************************************************************************
*! v 16.5  	19Apr2026               by Joao Pedro Azevedo
*		fix: correct "Lable" -> "Label" typo in generated section headers
*		fix: new sthlp files now saved to same directory as wbopendata.ado
*! v 16.3  	8Jul2020               by Joao Pedro Azevedo
* 	change to HTTPS
*******************************************************************************

program define __wbod_update_countrymetadata , rclass

	version 9.0

	******************************************************

	syntax ,					///
			[ 					///
				NAME(string) 	///
				SAVE			///
				REPLACE			///
				NOCTRYREFRESH	///
				CTRYLIST		///
		  ]



	preserve

	tempfile tmpcountrylist

	tempname out

	local date: disp %td date("`c(current_date)'", "DMY")

	* Find the directory where wbopendata.ado is installed (for saving new files)
	cap: findfile wbopendata.ado
	if _rc == 0 {
		local wbopendata_dir = reverse(substr(reverse("`r(fn)'"), 15, .))
	}
	else {
		local wbopendata_dir ""
	}

quietly {

	************************************************************************
		/*

		__wbod_api_read , query("http://api.worldbank.org/v2/countries/") ///
			nopreserve ///
			single ///
			parameter(page pages total)

		local maxp =  r(total1)

		di "`maxp'"

		*/

		noi di in smcl in g ""
		noi di in smcl in g "{bf: Downloading country metadata...}"

		local maxp =  500

		************************************************************************

		file open `out' using `tmpcountrylist' , text write replace

		file write `out' " countrycode#countrycode_iso2#countryname#region#region_iso2#regionname#adminregion#adminregion_iso2#adminregionname#incomelevel#incomelevel_iso2#incomelevelname#lendingtype#lendingtype_iso2#lendingtypename#capital#longitude#latitude " _n


		__wbod_api_read , query("https://api.worldbank.org/v2/countries/") ///
			nopreserve ///
			single ///
			per_page(`maxp') ///
			parameter(page pages total)

		local ctrymeta = r(total1)

		local pages = r(pages1)

		local maxk = `maxp'-1

		forvalues p = 1(1)`pages' {

			__wbod_api_read , query("https://api.worldbank.org/v2/countries/") ///
				per_page(`maxp') ///
				page(`p') list ///
				nopreserve ///
				parameter( country?id iso2Code name region?id adminregion?id incomeLevel?id lendingType?id iso2code capitalCity latitude longitude )

				noi di in smcl in g "{bf: Downloading country metadata... COMPLETED!}"
				noi di in smcl in g ""
				noi di in smcl in g "{bf: Processing country metadata...}"


			forvalues pp = 0(1)`maxk' {

				qui foreach jj in 2 3 4 5 6 7 8 9 10 11 {


					local kk = `jj'+(11*`pp')

					local `jj' `kk'

				}

				local ctrycode 			= r(country_id`2')
				local ctrycode_iso2 	= r(iso2Code`3')
				local ctryname 			= r(name`4')
				local region 			= r(region_id`5')
				local regname 			= r(iso2code`5')
				local adminregion 		= r(adminregion_id`6')
				local adminregion_iso 	= r(iso2code`6')
				local incomelevel 		= r(incomeLevel_id`7')
				local incomelevel_iso 	= r(iso2code`7')
				local lendingtype 		= r(lendingType_id`8')
				local lendingtype_iso 	= r(iso2code`8')
				local capital 			= r(capitalCity`9')
				local longitude 		= r(longitude`10')
				local latitude 			= r(latitude`11')


				foreach var in	 ctrycode 	 ctrycode_iso2 	 ctryname 	 region  regname	 adminregion 	 adminregion_iso 	 incomelevel 	 incomelevel_iso 	 lendingtype 	 lendingtype_iso 	 capital  {

					local `var' = trim("``var''")
					local `var' = subinstr("``var''","&amp;","and",.)
					local `var' = subinstr("``var''","< wb:lendingType","",.)
					local `var' = subinstr("``var''","< wb:adminregion","",.)
					local `var' = subinstr("``var''",".","",.)

				}

				local region_iso2        	= word("`regname'",1)
				local adminregion_iso2		= word("`adminregion_iso'", 1)
				local incomelevel_iso2		= word("`incomelevel_iso'",1)
				local lendingtype_iso2 		= word("`lendingtype_iso'",1)

				if length("`region_iso2'")==2 {
					local regionname 			= subinstr("`regname'","`region_iso2'","",.)
				}
				if length("`adminregion_iso2'")==2 {
					local adminname				= subinstr("`adminregion_iso'","`adminregion_iso2'","",.)
				}
				if length("`incomelevel_iso2'")==2 {
					local incomelevelname		= subinstr("`incomelevel_iso'","`incomelevel_iso2'","",.)
				}
				if length("`lendingtype_iso2'")==2 {
					local lendingname			= subinstr("`lendingtype_iso'","`lendingtype_iso2'","",.)
				}


				if ("`regname'" != "NA Aggregates") {
					file write `out' " `ctrycode'#`ctrycode_iso2'#`ctryname'#`region'#`region_iso2'#`regionname'#`adminregion'#`adminregion_iso2'#`adminname'#`incomelevel'#`incomelevel_iso2'# `incomelevelname'#`lendingtype'#`lendingtype_iso2'#`lendingname'#`capital' 	# `longitude' 	# `latitude' 	" _n
				}
				if ("`regname'" == "NA Aggregates") {
					file write `out' " `ctrycode'#`ctrycode_iso2'#`ctryname'#`region'#`region_iso2'#`regionname'#`adminregion'#`adminregion_iso2'#`adminname'#`incomelevel'#`incomelevel_iso2'# `incomelevelname'#`lendingtype'#`lendingtype_iso2'#`lendingname'# 			#  				#  				" _n
				}

				local ctrycode 			""
				local ctrycode_iso2 	""
				local ctryname 			""
				local region 			""
				local regname 			""
				local adminregion 		""
				local adminregion_iso 	""
				local incomelevel 		""
				local incomelevel_iso 	""
				local lendingtype 		""
				local lendingtype_iso 	""
				local capital 			""
				local longitude 		""
				local latitude 			""
				local regionname 		""
				local adminname			""
				local incomelevelname	""
				local lendingname		""
				local region_iso2        	""
				local adminregion_iso2		""
				local incomelevel_iso2		""
				local lendingtype_iso2 		""

			}

		}

		tempfile tmpCTRYtmp_dta

		*******************************************************************************
		* create countrymetadata ado files
		*******************************************************************************

		insheet using `tmpcountrylist' , delimiter("#") names clear

		bysort countrycode : gen dups = _n
		keep if dups == 1
		drop dups
		drop if countrycode == ""

		save `tmpCTRYtmp_dta'

		replace adminregionname = regionname + " (excluding high income)" if adminregionname != "" & incomelevel != "HIC"

		compress

		sort countrycode

		if ("`save'" != "") {

			if ("`name'" == "") {
				local name "countrylist"
			}

			save `name'.dta, `replace'
			noi di in y "`name'.dta saved `replace'"
			noi di ""
		}

		if ("`noctryrefresh'" == "") {

			foreach varname of varlist countrycode_iso2 - latitude {
				rename `varname' values_`varname'
			}

			reshape long values_ , i(countrycode) j(variable) string

			drop if values_ == ""

			sort variable countrycode

			gen seq = _n

			local datef = c(current_date)
			local time = c(current_time)


		**********************************************************************

			local list1 " countrycode_iso2 countryname region region_iso2 regionname "
			local list2 " adminregion adminregion_iso2 adminregionname incomelevel incomelevel_iso2 incomelevelname "
			local list3 " lendingtype lendingtype_iso2 lendingtypename capital longitude latitude "


		******************************  Header for ******************************

		forvalues l = 1(1)3 {

				local variable wbod_tmpfile`l'

				tempfile tmp`variable'
				tempname out_`variable'
				file open `out_`variable'' using `tmp`variable'' , text write replace

				di "`variable'"

				file write `out_`variable'' `"*! _`variable' <`datef' : `time'>			by João Pedro Azevedo"' 	_n
				file write `out_`variable'' `"*			auto generated and updated using __wbod_update_countrymetadata.ado "' _n
				file write `out_`variable''  "	" _n

				file write `out_`variable''  " program define _`variable' " _n
				file write `out_`variable''  "	" _n
				file write `out_`variable''  "	   syntax , match(varname) [ `list`l'' ] " _n
				file write `out_`variable''  "	" _n

		******************************

				foreach varname2 in `list`l'' {

					if (strmatch("latitude longitude","*`varname2'*") == 0)  {


						file write `out_`variable''  " ******************  Values: `varname2' ****************** " _n
						file write `out_`variable''  "	" _n
						file write `out_`variable''  `" qui if ("\``varname2''" == "`varname2'") {	"' _n
						file write `out_`variable''  "	" _n
						file write `out_`variable''  `"		cap: gen `varname2' = ""  "' _n

						sum seq if variable == "`varname2'"
						local min = r(min)
						local max = r(max)

						forvalues ctry = `min'(1)`max'  {

							local value = values_  			in `ctry'
							local ctrycode = countrycode 	in `ctry'

							file write `out_`variable''  `"		cap: replace `varname2' = "`value'"	if \`match' == "`ctrycode'"  "' _n

						}

					}

					if (strmatch("latitude longitude","*`varname2'*") == 1)   {


						file write `out_`variable''  " ******************  Values: `varname2' ****************** " _n
						file write `out_`variable''  "	" _n
						file write `out_`variable''  `" qui if ("\``varname2''" == "`varname2'") {	"' _n
						file write `out_`variable''  "	" _n
						file write `out_`variable''  `"		cap: gen  double `varname2' = .  "' _n

						sum seq if variable == "`varname2'"
						local min = r(min)
						local max = r(max)

						forvalues ctry = `min'(1)`max'  {

							local value = values_  			in `ctry'
							local ctrycode = countrycode 	in `ctry'

							file write `out_`variable''  `"		cap: replace `varname2' = real("`value'")	if \`match' == "`ctrycode'"  "' _n

						}

					}

					file write `out_`variable''  "	" _n
					file write `out_`variable''  "******************  Label: `varname2' ******************" _n
					file write `out_`variable''  "	" _n

					******************************************************
					if ("`varname2'" == "countryname") {
						file write `out_`variable''  `"	    lab var countryname			"Country Name" "' _n
					}
					if ("`varname2'" == "countrycode_iso2") {
						file write `out_`variable''  `"	    lab var countrycode_iso2    "Country Code (ISO 2 digits)" "' _n
					}
					if ("`varname2'" == "region") {
						file write `out_`variable''  `"	    lab var region  			"Region Code" "' _n
					}
					if ("`varname2'" == "region_iso2") {
						file write `out_`variable''  `"	    lab var region_iso2			"Region Code (ISO 2 digits)" "' _n
					}
					if ("`varname2'" == "regionname") {
						file write `out_`variable''  `"	    lab var regionname      	"Region Name" "' _n
					}
					if ("`varname2'" == "adminregion") {
						file write `out_`variable''  `"	    lab var adminregion  		"Administrative Region Code" "' _n
					}
					if ("`varname2'" == "adminregion_iso2") {
						file write `out_`variable''  `"	    lab var adminregion_iso2	"Administrative Region Code (ISO 2 digits)" "' _n
					}
					if ("`varname2'" == "adminregionname") {
						file write `out_`variable''  `"	    lab var adminregionname	    "Administrative Region Name" "' _n
					}
					if ("`varname2'" == "incomelevel") {
						file write `out_`variable''  `"	    lab var incomelevel  		"Income Level Code" "' _n
					}
					if ("`varname2'" == "incomelevel_iso2") {
						file write `out_`variable''  `"	    lab var incomelevel_iso2	"Income Level Code (ISO 2 digits)" "' _n
					}
					if ("`varname2'" == "incomelevelname") {
						file write `out_`variable''  `"	    lab var incomelevelname    	"Income Level Name" "' _n
					}
					if ("`varname2'" == "lendingtype") {
						file write `out_`variable''  `"	    lab var lendingtype  		"Lending Type Code" "' _n
					}
					if ("`varname2'" == "lendingtype_iso2") {
						file write `out_`variable''  `"	    lab var lendingtype_iso2	"Lending Type Code (ISO 2 digits)" "' _n
					}
					if ("`varname2'" == "lendingtypename") {
						file write `out_`variable''  `"	    lab var lendingtypename    	"Lending Type Name" "' _n
					}
					if ("`varname2'" == "capital") {
						file write `out_`variable''  `"	    lab var capital		  		"Capital Name" "' _n
					}
					if ("`varname2'" == "latitude") {
						file write `out_`variable''  `"	    lab var latitude			"Capital Latitude" "' _n
					}
					if ("`varname2'" == "longitude") {
						file write `out_`variable''  `"	    lab var longitude	      	"Capital Longitude" "' _n
					}

					******************************************************

					file write `out_`variable''  " }	" _n
					file write `out_`variable''  "	" _n
					file write `out_`variable''  " ****************************************************** " _n
					file write `out_`variable''  "	" _n

			}




			******************************************************

			file write `out_`variable''  " end " _n

			file close `out_`variable''

			******************************************************

			cap: findfile _`variable'.ado, `path'
			if _rc == 0 {
				copy  `tmp`variable''  "`r(fn)'" , replace
			}
			else {
				copy `tmp`variable'' "_`variable'.ado"
			}

		}

	}

		noi di in smcl in g "{bf: Processing country metadata... COMPLETED!}"
		noi di in smcl in g ""
		tempfile tmp

		save `tmp'

		******************************************************************************
		* udpate country txt files
		*******************************************************************************



		if ("`ctrylist'" == "ctrylist") {

			noi di in smcl in g "{bf: Processing country list...}"

			local country country.txt

			tempfile  tmpCTRYtmp

			use `tmpCTRYtmp_dta'

			bysort countrycode : gen dups = _n
			keep if dups == 1
			drop dups
			drop if countrycode == ""

			sort countrycode
			gen export = countrycode + " - " + countryname
			keep export
			sort export
			outsheet using `tmpCTRYtmp', replace noquote nolabel nonames

			cap: findfile `country' , `path'

			if _rc == 0 {
				copy `tmpCTRYtmp'  "`r(fn)'" , replace
			}
			else {
				copy `tmpCTRYtmp' "`indicator'"
			}

			noi di in smcl in g "{bf: Processing country list... COMPLETED!}"
			noi di in smcl in g ""

		}


		*******************************************************************************
		* create country sthlp files
		*******************************************************************************

		noi di in smcl in g "{bf: Processing country documentation...}"
		noi di in smcl in g ""

		use `tmp', clear

		foreach variable in region adminregion incomelevel lendingtype {

			tempfile help`variable'

			tempname hlp`variable' dups`variable' seq2`variable' seq3`variable'

			use `tmp', clear

			__wbod_countrymetadata, match(countrycode) countryname full

			keep if `variable' != ""

			sort `variable' countryname

			bysort `variable' countryname : gen `dups`variable'' = _n

			keep if `dups`variable'' == 1

			sort `dups`variable'' `variable' countryname

			bysort `dups`variable'' `variable' countryname : gen `seq2`variable'' = _n

			keep if  `seq2`variable'' == 1

			sort `variable' `countryname'

			gen `seq3`variable'' = _n

			local title : variable label `variable'

			local title = subinstr("`title'","Code","",.)

			**************** header ********************

			file open `hlp`variable''		using 	`help`variable'' , write text replace


			file write `hlp`variable'' "{smcl}" 					_n
			file write `hlp`variable'' "" 							_n
			file write `hlp`variable'' "{marker indicators}{...}" 	_n
			file write `hlp`variable'' "{p 20 20 2}(Go up to {it:{help wbopendata##sections:Sections Menu}}){p_end}" 	_n
			file write `hlp`variable'' "{title:`title' (as of `date')}" 		_n
			file write `hlp`variable'' "" 							_n

			********************************************
			levelsof `variable'

			foreach topic in `r(levels)' {

				sum `seq3`variable'' if `variable' == "`topic'"
				local min = r(min)
				local max = r(max)

				local topicode1	= `variable'		in `min'
				local topicode2	= `variable'name	in `min'

				file write `hlp`variable'' "{marker `topicode1'}" 	_n
				file write `hlp`variable'' "{p 20 20 2}(Go up to {it:{help wbopendata##`variable':`title'}}){p_end}" 	_n
				file write `hlp`variable'' "{synoptset 33 tabbed}{...}" 	_n
				file write `hlp`variable'' "{synopthdr:`topicode2' (`topicode1')}" _n
				file write `hlp`variable'' "{synoptline}" 				_n

				forvalues line = `min'(1)`max'  {

					local ctryname 	= countryname  		in `line'
					local ctrycode 	= countrycode 		in `line'

					file write `hlp`variable''  `"{synopt:{opt `ctrycode'}}  `ctryname' {p_end}"' _n

				}

				file write `hlp`variable''  `""' _n

			}


			file close `hlp`variable''


			cap: findfile wbopendata_`variable'.sthlp , `path'
			if _rc == 0 {
				copy `help`variable''  "`r(fn)'" , replace
			}
			else {
				copy `help`variable'' "`wbopendata_dir'wbopendata_`variable'.sthlp"
			}

			noi di in g in smcl "	See {bf:{help wbopendata##`variable':`title'}}"


		}

		*******************************************************************************

		noi di in smcl in g "{bf: Processing country documentation... COMPLETED!}"


	restore

	local ctrytime 			= c(current_time)
	local ctrydatef 		= c(current_date)
	local dt_ctryupdate 		"`ctrydatef' `ctrytime'"

	return local dt_ctryupdate    = "`dt_ctryupdate'"
	return local dt_ctrylastcheck = "`dt_ctryupdate'"
	return local ctrymeta = `ctrymeta'
}

end


*******************************************************************************
* v 16.0  	27Oct2019					by Joao Pedro Azevedo
* 	generate only three files
*	change dataflow
*******************************************************************************
* v 15.3  	28Sept2019					by Joao Pedro Azevedo
* 	add countrycode
*******************************************************************************
* v 15.2  	3Mar2019               by Joao Pedro Azevedo
* __wbod_update_countrymetadata
*******************************************************************************
* v 15.1  	3Mar2019               by Joao Pedro Azevedo
*	initial commit
*******************************************************************************