capture program drop valid
program valid
syntax varlist, PARTition(numlist integer >0) [SCOrename(string) IMPute NORound CALCmethod(string) DESCitems GRAPHs cfa CFAMethod(string) CFAStand CONVdiv TCONVdiv(real 0.4) CONVDIVBoxplots Alpha(real 0.7) Delta(real 0.9) h(real 0.3) HJmin(real 0.3) REPet(varlist) KAPpa ICKAPpa(integer 0) kgv(varlist) KGVBoxplots KGVGroupboxplots conc(varlist) tconc(real 0.4)]
preserve

qui set autotabgraphs on

qui set more off

local C = 0
foreach z in `partition' {
	local C = `C' + `z'
}

local nbvars : word count `varlist' 
/*
if `C' > `nbvars' {
	di in red "The sum of the numbers in the partition option is greater than the number of variables in the dataset"
	exit 119
}
*/
local nbvars : word count `varlist'
if `C' != `nbvars' {
	di in red "The sum of the numbers in the partition option is different from the number of variables precised in varlist"
	exit 119
}

local P:word count `partition'

if "`scorename'" !="" {
	local S:word count `scorename'
	if `P'!=`S' {
		di in red "The number of score names given is different from the number of dimensions in the partition option" 
		exit 119
	}
	foreach sco in `scorename' {
		capture confirm variable `sco'
		if !_rc {
			di in red "`sco' is a variable of the dataset. Choose another name"
			exit 119
        }
		tokenize `scorename'
		local g = 0
		forvalues i = 1/`S' {
			if "`sco'" == "``i''" {
				local `++g'
			}
		}
		if `g' > 1 {
			di in red "2 or more dimensions have the same name"
			exit 119
		}
    }
}
else {
	local name
	local nname
	
	forvalues i = 1/`P' {
		local name "Dim`i'"
		local nname `nname' `name'
	}
local scorename = "`nname'"
}

/*
if "`ident'" == "" {
	tempvar id
	qui gen `id' = _n 
}
else {
	qui tab `ident', nofreq
	local u = r(r)
	if `u' != _N {
		di in red "`ident' has not unique values"
		exit 119
	}
}
*/
/*
if "`repitems'" !="" {
	local a : word count `repitems'
	if mod(`a',2) != 0 {
		di in red "error repitems: odd number"
		exit
	}
	foreach r in `repitems' {
		capture confirm variable `r'
		if _rc!=0 {
			di in red "`r' does not exist" 
			exit 119
        }
    }
}
*/
/*
local y = 0
if "`repscores'" !="" {
	local a : word count `repscores'
	if mod(`a',2) != 0 {
		di in red "error repscores : odd number"
		exit 119
	}
	foreach r in `repscores' {
		local x = 0
		local y = 0
		capture confirm variable `r'
		if _rc!=0 local x = 1
        foreach s in `scorename' {
			if "`r'" == "`s'" local y = `y'+1
		}
		if `x' == 1 & `y' < 1 {
			di "`r' " "non défini"
		exit 119
		}
	}
}
*/

if "`kgv'" !="" {
	foreach k in `kgv' {
		capture confirm variable `k'
		if _rc!=0 {
			di in red "`k' does not exist" 
			exit 119
		}
    }
}

if "`conc'" !="" {
	foreach c in `conc' {
		capture confirm variable `c'
		if _rc!=0 {
			di in red "`c' does not exist" 
			exit 119
		}
    }
}
/*
if `t2from' > _N {
	di in red "Reproductibility : invalid range for observations at time 2 (`t2from' > number of observations)"
	exit 119
}

if `t2to' > _N {
	di in red "Reproductibility : invalid range for observations at time 2 (`t2to' > number of observations)"
	exit 119
}

if "`t2from'" != "" & "`t2to'" != "" {
	if `t2from' > `t2to' {
		di in red "Reproductibility : invalid range for observations at time 2"
		exit 119
	}
}

if "`t2from'" == "" local t2from = 1
if "`t2to'" == "" local t2to = _N
*/

local i = 1 
foreach x in `varlist' {
	local var`i' = "`x'"
	local `++i'
}

di as result "Items used for calculation of the scores"
di

local i = 1
local j = 1
local y = 1
foreach p in `partition' {
	tokenize `scorename'
	di "{bf:``i''} : " _c
	
	if `j' == 1 local s = `p'
	else local s = `s' +`p'
	forvalues z = `y'/`s' {
		di "{text:`var`z'' }" _c
	}
	local `i++' 
	local `j++' 
	local y = `s'+1
	di
}

qui destring _all, replace
di
/*
local cpt = 0
if "`sum'" != "" {
	local cpt `cpt' + 1
}
if "`mean'" != "" {
	local cpt `cpt' + 1
}
if "`stand'" != "" {
	local cpt `cpt' + 1
}
if `cpt'>1 {
	di in red "You must choose between mean, sum or stand (the options are exclusive)"
	exit 119
}
*/
calcscore `varlist', scorename(`scorename') partition(`partition') calcmethod(`calcmethod')

if "`descitems'" != "" {
	di as result "{hline}"
	di "Description of items"
	di as result "{hline}"
	di
	descitems `varlist', partition(`partition')
	di
}
if "`graphs'" != "" {
	_graph `varlist', partition(`partition') scorename(`scorename') calcmethod(`calcmethod')
}

if "`repet'" != "" {
	if "`descitems'" != "" {
		di as result "{hline}"
		di "Description of items (time 2)"
		di as result "{hline}"
		di
		descitems `repet', partition(`partition')
		di
	}
}

if "`impute'" != "" {
	*if "`noround'" != "" { 
		*di "Missing data handling (noround)"
		*di
		
		imp `varlist', partition(`partition') `noround'
		if "`descitems'" != "" {
			di as result "{hline}"
			di "Description of items after missing data handling"
			di as result "{hline}"
			di
			descitems `varlist', partition(`partition')
			di
		}
		if "`graphs'" != "" {
			*_graph `varlist', partition(`partition') scorename(`scorename')
		}
		if "`repet'" != "" {
			imp `repet', partition(`partition') `noround'
			if "`descitems'" != "" {
				di as result "{hline}"
				di "Description of items after missing data handling (time 2)"
				di as result "{hline}"
				di
				descitems `repet', partition(`partition')
				di
			}
		}
		
		
	*}
	/*else {
		di "Missing data handling (round)"
		di
		imp `varlist', partition(`partition')
		di "Description of items after missing data handling"
		di
		desc_item `varlist', partition(`partition')
		if "`graphs'" != "" {
			*_graph `varlist', partition(`partition') scorename(`scorename')
		}
		di "Description of items after missing data handling (time 2)"
		di
		if "`repet'" != "" {
			imp `repet', partition(`partition')
			desc_item `repet', partition(`partition')
		}
		di "{hline}"
	}*/
}  

/*
if "`imp'" == "" & "`noround'" != "" {
	*di "noround"
	di
	imp `varlist', partition(`partition') `noround'
	if "`desc_items'" != "" {
		di "Description of items after missing data handling"
		di
		desc_item `varlist', partition(`partition')
	
	}
	if "`graphs'" != "" {
		*_graph `varlist', partition(`partition') scorename(`scorename')
	}
	di "Description of items after missing data handling (time 2)"
	di
	imp `repet', partition(`partition') `noround'
	desc_item `repet', partition(`partition')
	di "{hline}"
	
}
*/
		
*di "{hline}"

if "`convdiv'" != "" {
	convdiv `varlist', scorename(`scorename') partition(`partition') tconvdiv(`tconvdiv') `convdivboxplots'
	*di as result "{hline}"
	di
}

/*
if "`cfa'" != "" {
	local cpt = 0
	if "`cfa_ml'" != ""{
		local method = "cfa_ml"
		local cpt `cpt' + 1
	}
	if "`cfa_mlmv'" != "" {
		local method = "cfa_mlmv"
		local cpt `cpt' + 1
	}
	if "`cfa_adf'" != ""  {
		local method = "cfa_adf"
		local cpt `cpt' + 1
	}
	else local method = "cfa_ml"
	if `cpt' > 1 {
		di in red "You must choose between cfa_ml, cfa_mlmv or cfa_adf (the options are exclusive)"
		exit 119
	}

	cfa `varlist', scorename(`scorename') partition(`partition') `method' `cfa_stand'
	di as result "{hline}"	
}
*/

if "`cfa'" != "" {
	cfa `varlist', scorename(`scorename') partition(`partition') cfamethod(`cfamethod') `cfastand'
	*di as result "{hline}"
	di
}

rel `varlist', scorename(`scorename') partition(`partition') alpha(`alpha') delta(`delta') h(`h') hjmin(`hjmin')
di
*di "{hline}"

if "`repet'" != "" {
	repet `varlist', t2(`repet') partition(`partition') scorename(`scorename') `kappa' ickappa(`ickappa') calcmethod(`calcmethod')
	*di "{hline}"
	di
}

if "`kgv'" != "" {
	kgv `scorename', categ(`kgv') `kgvboxplots' `kgvgroupboxplots'
	*di "{hline}"
	di
}

if "`conc'" != "" {
	conc `scorename', comp(`conc') tconc(`tconc')
	*di "{hline}"
}
end
