*! part of -mpitb- the MPI toolbox

cap program drop _mpitb_set		
program define _mpitb_set , rclass
	syntax , [Name(string) d1(string) DEscription(string) d2(string) d3(string) /// 
				d4(string) d5(string) d6(string) d7(string) d8(string) d9(string) ///
				d10(string) CLEAR REPLACE] 

	* syntax checks and parsing
	if ("`clear'" == "" & "`name'" == "") | ("`clear'" != "" & "`name'" != "") {
		di as err "Please choose {bf:clear} or {bf:name()} option!"
		exit 198
	}
	if "`name'" != "" & "`d1'" == "" {
		di as err "Option {bf:d1()} required with option {bf:name().}"
		exit 198
	}

	if "`clear'" != "" & "`replace'" != "" {
		di as err "Please choose {bf:clear} or {bf:replace}."
		exit 198
	}
	if length("`name'") > 10 {
		di as err "`name' too long."
		exit 198
	}

	if "`replace'" == "" & "`clear'" == "" {
		loc MPInames `_dta[MPITB_names]'
		if `: list name in MPInames' == 1 {
			di as err "MPI specification {bf:`name'} already exists! Change name or set option {bf:replace}."
			exit 198
		}
	}

	* parsing dimensions 
	forval i = 1/10 {
		// di "d`i': `d`i''"						// for debug
		if ("`d`i''" != "") {
			parse_d `d`i'' // did(`i')					// parse both content and id of dimension
			
			loc d`i'_vars `s(d_vars)'				// dimension-specific locals
			loc d`i'_name `s(d_name)'
			if ("`d`i'_name'" == "") loc d`i'_name d`i'
		
			loc vars `vars' `d`i'_vars' 				// MPI-specific locals 	(indicators variables)
			loc d_names `d_names' `d`i'_name'			// 			(names of dimensions)
		}
	}
	* plausibility check: unique indicator
	loc dupvars : list dups vars
	if "`dupvars'" != "" {
		di as err "Found repeated deprivation indicators: {bf:`dupvars'}."
		exit 198
	} 
	* check binary nature of indicators
	foreach v of varlist `vars' {
		cap: assert inlist(`v',0,1) if !mi(`v')
		if _rc == 9 {
			di as err "Deprivation indicator ({bf:`v'}) with values out of range. "
			exit 198 
		}
	}
	
	* delete all MPI-chars
	loc clist : char _dta[]
	foreach c of local clist {
		if "`clear'" != "" {
			if (strmatch("`c'","MPI*")) char _dta[`c'] ""			
		}
		if "`replace'" != "" {
			if (strmatch("`c'","MPI_`name'*")) char _dta[`c'] ""			
		}
	}

	if "`clear'" == "" {
		* update name list
		loc names `_dta[MPITB_names]' `name'
		loc names : list uniq names
		loc names : list sort names

		* return
		ret loc cmd "mpi_set"
		ret loc name "`name'"
		ret loc dep_vars "`vars'"
		ret loc dim_names "`d_names'"
		forval i = 1/10 {
			ret loc dim_`d`i'_name'_vars `d`i'_vars'
		}
		* store as chars
		char _dta[MPITB_names] "`names'"
		char _dta[MPITB_`name'_dep_vars] "`vars'"
		char _dta[MPITB_`name'_dim_names] "`d_names'"
		char _dta[MPITB_`name'_desc] `description'
		forval i = 1/10 {
			char _dta[MPITB_`name'_dim_`d`i'_name'_vars] "`d`i'_vars'"
		}
	}
end

*******************************************
*** program to parse syntax for mpi_set ***
*******************************************
capture program drop parse_d
program define parse_d , sclass
syntax varlist , [Name(name) did(numlist max=1 integer) dimw(numlist max=1)]
	if length("`name'") > 6 {
		di as err "dimension name {bf:`name'} too long."
		exit 198
	}
	foreach v of varlist `varlist' {
		if length("`v'") > 10 {
			di as err "variable name {bf:`v'} too long."
		exit 198
		}
	}
	
	sret clear
	sret loc d_name "`name'"
	sret loc d_vars "`varlist'"
	sret loc d_wgt "`dimw'"
end