*! version 1.0.0 ??????2015 MJC

// parsing utility 

/*
MJC ?????2015 version 1.0.0
*/

program define _stms_parsecmd, rclass
	syntax [varlist(default=empty numeric)] [if] [in], 							///
														TRANSVAR(varname)		///
														modelindex(string)		///
														model(string)			///	-Distribution family-	
														tousevar(string)		///
																				///
														[						///
															ANCillary(varlist)	///
															ANC2(varlist)		///
																				///
															NOISILY				///
																				///
															*					///	-stpm2 opts-
														]						///
																				///
														
	
	
	
	if "`transvar'"!="" {
		qui gen byte `tousevar' = (`transvar'==`modelindex')
	}
	else {
		mark `tousevar' `if' `in'
	}
	qui replace `tousevar' = 0  if _st==0 | `tousevar'==.
	
	qui count if `tousevar'==1
	if `r(N)'==0 {
		di as error "No obs for transvar == `modelindex'"
		exit 198
	}
	
	//=====================================================================================================================================================//
	// ml eqns
	
	local l = length("`model'")
	if substr("exponential",1,max(1,`l'))=="`model'" {
		local model ereg
		local mleqn (ln_lambda`modelindex': `varlist')	
	}
	else if substr("weibull",1,max(1,`l'))=="`model'" {
		local model weibull
		local mleqn (ln_lambda`modelindex': `varlist')(ln_gamma`modelindex': `ancillary')
	}
	else if substr("gompertz",1,max(1,`l'))=="`model'" {
		local model gompertz
		local mleqn (ln_lambda`modelindex': `varlist')(gamma`modelindex': `ancillary')
	}
	else if substr("llogistic",1,max(2,`l'))=="`model'" | substr("loglogistic",1,max(4,`l'))=="`model'" {
		local model llogistic
		local mleqn (ln_lambda`modelindex': `varlist')(gamma`modelindex': `ancillary')
	}	
	else if substr("lnormal",1,max(2,`l'))=="`model'" | substr("lognormal",1,max(4,`l'))=="`model'" {
		local model lnormal
		local mleqn (mu`modelindex': `varlist')(ln_sigma`modelindex': `ancillary')
	}
	else if substr("ggamma",1,max(2,`l'))=="`model'" {
		local model gamma
		local mleqn (mu`modelindex': `varlist')(ln_sigma`modelindex': `ancillary')(kappa`modelindex': `anc2')
	}
	else if "fpm"=="`model'" {
	}
	else {
		di as error "Unknown model(`model')"
		exit 198	
	}
	
	if "fpm"!="`model'" {
		qui `noisily' streg `varlist' if `tousevar'==1, dist(`model') ancillary(`ancillary') anc2(`anc2')
		tempname inits
		mat `inits' = e(b)
		return matrix inits = `inits'
	}
	else {
		local model stpm2
		qui `noisily' stpm2 `varlist' if `tousevar'==1, `options'
		tempname inits
		mat `inits' = e(b)
		return matrix inits = `inits'
		
		//stuff for eret list for tprob
		c_local nocons`modelindex' `e(noconstant)'
		c_local orthog`modelindex' `e(orthog)'
		c_local scale`modelindex' `e(scale)'
		c_local rcsbaseoff`modelindex' `e(rcsbaseoff)'
		c_local rcsterms_base`modelindex' `e(rcsterms_base)'
		c_local ln_bhknots`modelindex' `e(ln_bhknots)'
		c_local boundary_knots`modelindex' `e(boundary_knots)'
		if "`e(orthog)'"=="orthog" {
			tempname rbhtemp
			mat `rbhtemp' = e(R_bh)
			return matrix R_bh`modelindex' = `rbhtemp'
		}
		c_local tvc`modelindex' `e(tvc)'
		foreach var in `e(tvc)' {
		
			c_local boundary_knots_`var'`modelindex' `e(boundary_knots_`var')'
			c_local ln_tvcknots_`var'`modelindex' `e(ln_tvcknots_`var')'
			if "`e(orthog)'"=="orthog" {
				tempname rbhtemp`var'
				mat `rbhtemp`var'' = e(R_`var')
				return matrix R_`var'`modelindex' = `rbhtemp`var''
			}
			
		}
		//
		cap drop _`modelindex'_rcs?
		rename _rcs? _`modelindex'_rcs?, r
		local newrcs `r(newnames)'
		cap drop _`modelindex'_d_rcs?
		rename _d_rcs? _`modelindex'_d_rcs?, r
		local newdrcs `r(newnames)'
		if `e(del_entry)' {
			cap drop _`modelindex'_s0_rcs?
			rename _s0_rcs? _`modelindex'_s0_rcs?, r
			local news0rcs `r(newnames)'
		}
		
		//handle constraints
		local index = 1
		foreach con in `e(rcsterms_base)' {
			constraint free
			constraint `r(free)' [xb`modelindex'][_`modelindex'_rcs`index']=[dxb`modelindex'][_`modelindex'_d_rcs`index']
			local conslist `conslist' `r(free)'
			if `e(del_entry)' {
				constraint free
				constraint `r(free)' [xb`modelindex'][_`modelindex'_rcs`index']=[xb0`modelindex'][_`modelindex'_s0_rcs`index']
				local conslist `conslist' `r(free)'
			}	
			local index = `index' +1
		}
		foreach var in `e(tvc)' {
			cap drop _`modelindex'_rcs_`var'?
			rename _rcs_`var'? _`modelindex'_rcs_`var'?, r
			local newrcs `newrcs' `r(newnames)'
			cap drop _`modelindex'_d_rcs_`var'?
			rename _d_rcs_`var'? _`modelindex'_d_rcs_`var'?, r
			local newdrcs `newdrcs' `r(newnames)'
			if `e(del_entry)' {
				cap drop _`modelindex'_s0_rcs_`var'?
				rename _s0_rcs_`var'? _`modelindex'_s0_rcs_`var'?, r
				local news0rcs `news0rcs' `r(newnames)'
			}
			local index = 1
			foreach con in `e(rcsterms_`var')' {
				constraint free
				constraint `r(free)' [xb`modelindex'][_`modelindex'_rcs_`var'`index']=[dxb`modelindex'][_`modelindex'_d_rcs_`var'`index']
				local conslist `conslist' `r(free)'
				if `e(del_entry)' {
					constraint free
					constraint `r(free)' [xb`modelindex'][_`modelindex'_rcs_`var'`index']=[xb0`modelindex'][_`modelindex'_s0_rcs_`var'`index']
					local conslist `conslist' `r(free)'
				}	
				local index = `index' +1
			}
		}
		
		local mleqn (xb`modelindex': `varlist' `newrcs')(dxb`modelindex': `newdrcs',nocons)

		if `e(del_entry)' {
			constraint free
			constraint `r(free)' [xb`modelindex'][_cons]=[xb0`modelindex'][_cons]
			local conslist `conslist' `r(free)'
			
			//covariate constraints with delentry
			foreach var in `e(varlist)' {
				constraint free
				constraint `r(free)' [xb`modelindex'][`var']=[xb0`modelindex'][`var']
				local conslist `conslist' `r(free)'
			}

			local mleqn `mleqn'(xb0`modelindex': `varlist' `news0rcs')

		}
		
		
	}

	
	return local model `model'
	return local mleqn `mleqn'
	return local transmatrix `transmatrix'
	return local constraints `conslist'
	return local varlist `varlist'
	return local ancillary `ancillary'
	return local anc2 `anc2'

end