#!/bin/bash

VERSIONCOUNTER=313
SIMPLEVERSION="-NEXT-"
OIFS=$IFS
export NCURSES_NO_UTF8_ACS=1

here_=$(pwd)
realdir=$(readlink -f $0)
cd "$(dirname $realdir)"

#set dir_vars
workdir="$(pwd)"
 bindir="$sdir/upx"
   PATH="$bindir:$PATH"
   sdir="$workdir/support"

    osdir="$sdir/os"
     ldir="$sdir/logs"
     adir="$sdir/archive"
configdir="$sdir/configs"
     pdir="$sdir/patches"
  profdir="$sdir/profiles"
     bdir="$sdir/binaries"
    sodir="$sdir/software"
    dldir="$sdir/downloads"
     fdir="$sdir/functions"
  menudir="$sdir/menu_save"
     bsvn="$sdir/backup_svn"
    tcdir="$sdir/toolchains"
     tdir="$sdir/translation"
   svndir="$workdir/oscam-svn"
 tccfgdir="$sdir/toolchains.cfg"

# create folders
mkdir -p "$tcdir/native/bin" 2>/dev/null
mkdir -p support/{archive,binaries,downloads,software,logs,patches,backup_svn,menu_save,upx} 2>/dev/null

# create links
[ ! -d "$ldir" ] && clear && echo -e "\n folder creation error\n\n" && exit
[ -L "$workdir/logs" ]     || ln -sf "$ldir" "$workdir/logs"     2>/dev/null
[ -L "$workdir/archive" ]  || ln -sf "$adir" "$workdir/archive"  2>/dev/null
[ -L "$workdir/patches" ]  || ln -sf "$pdir" "$workdir/patches"  2>/dev/null
[ -L "$workdir/binaries" ] || ln -sf "$bdir" "$workdir/binaries" 2>/dev/null
[ -L "$workdir/software" ] || ln -sf "$sodir" "$workdir/software" 2>/dev/null
[ -L "$workdir/profiles" ] || ln -sf "$profdir" "$workdir/profiles" 2>/dev/null

#set arrays
array_names_a=( SHORT_PROTOCOLS SHORT_READERS SHORT_CARD_READERS AVAI_TCLIST
		MISS_TCLIST SHORT_ADDONS DISABLED_MODULES SHORT_MODULENAMES
		ALL_MODULES_LONG  ENABLED_MODULES INST_TCLIST SSH_CONF_CONTENT )
array_names_A=( INTERNAL_MODULES USE_vars USE_vars_disable s3cfg_vars )

for a_n in "${array_names_a[@]}"
do
	unset $a_n
	declare -a $a_n
done

for a_n in "${array_names_A[@]}"
do
	unset $a_n
	declare -A $a_n
done


USE_vars[USE_DIAG]=;
USE_vars[USE_TARGZ]=;
USE_vars[USE_PATCH]=;
USE_vars[USE_STAPI]=;
USE_vars[USE_STAPI5]=;
USE_vars[USE_CONFDIR]=;
USE_vars[USE_COMPRESS]=;
USE_vars[USE_OSCAMNAME]=;

s3cfg_vars[USE_TARGZ]=0
s3cfg_vars[DIRECTMENU]=0
s3cfg_vars[USE_VERBOSE]=0
s3cfg_vars[USE_COMPRESS]=0
s3cfg_vars[S3_UPDATE_CHECK]=1
s3cfg_vars[SAVE_LISTSMARGO]=1
s3cfg_vars[ADD_PROFILE_NAME]=0
s3cfg_vars[NO_SVN_AUTOUPDATE]=0
s3cfg_vars[delete_oscamdebugbinary]=1

#filled arrays
config_cases=( all addons protocols readers card_readers );
s3opts=( cedit checkout clean enable_emu fix_me get_patch help lang_select loadonly\
	menu profiles ssh_profiles svnpatch svnrestore svnup syscheck sysinfo tccheck\
	tcrepair tedit update update_emu update_me upload ) # extendable with plugins

CUSTOM_CONFDIR="not_set"
pf_name="not_set"
UPX="not_set"

#internal vars
OPENBOX=0
UFS916003=0
_t1e="VG9vbGNoYWluLQ=="
_u1e="aHR0cHM6Ly9maWxlcy5zdHJlYW1ib2FyZC50di90b29sY2hhaW5zLw=="

run="0"
cposx=0
cposy=0
on="_on"
off="_off"
pf="empty"
_verbose=""
menucall="no"
file_exist="0"
loadprofile="no"
s3cfg="$configdir/simplebuild.config"

# Compiler settings
cc_warn="-W -Wall -Wshadow -Wredundant-decls -Wstrict-prototypes -Wold-style-definition"
cc_opts="-ggdb -pipe -ffunction-sections -fdata-sections -o nodeadcode"
#optimized compiling options
#cc_opts="-ggdb -pipe -ffunction-sections -fdata-sections -o nodeadcode -ffast-math -fomit-frame-pointer -fthread-jumps -foptimize-strlen --no-inline"

#default url
trunkurl="https://svn.streamboard.tv/oscam/trunk"

[ -f "$workdir/oscamsource.url" ] && source "$workdir/oscamsource.url"

#load translationlist
cd "$tdir"
langsupport=(*)

#load functions and plugins
if [ -d "$fdir" ]
then
	cd "$fdir"
	x=(*)
	for i in "${x[@]}"
	do
		source "$i"
		plugin=$(awk '/^#simplebuild_plugin/ {printf $2}' $i)
		[ -z "$plugin" ] || s3opts+=($plugin)
	done
else
	echo "fail functions"
fi

#software build support
if [ -d "$sodir" ]
then
	cd "$sodir"
	x=(*)
	for i in "${x[@]}"
	do
	    if [ -f "$i" ]; then
		source "$i"
		plugin=$(awk '/^#simplebuild_plugin/ {printf $2}' $i)
		[ -z "$plugin" ] || s3opts+=($plugin)
	    fi
	done
fi

#initialize simplebuild
initializeANSI	# load colors
auto_langset	# echo "info $txt_load_ok";

# check system #########################################################
syscheck
[ ! "$sanity" == "1" ] && echo "sanity fail" && sleep 5 && bye
########################################################################

_create_native_profile	# put native datas to toolchains and configs
_get_config_con "$1"	# echo $addons;exit;
_create_module_arrays	# fill module arrays
_fill_tc_array		# get # AVAI_TCLIST # INST_TCLIST # MISS_TCLIST
read_s3cfg		# read simplebuild config
_set_dialog_types	# fill $gui vars
_systype		# check used uname

if [ -z "$1" ]
then
	[ "${s3cfg_vars[DIRECTMENU]}" == "1" ] && _dialog_checkout && exit
	_help
	exit

else
	for e in "${s3opts[@]}"
	do

		if [ "$e" == "$1" ]
		then

			case $e in

			fix_me|checkout|update_me|update_emu|svnrestore|enable_emu|upload_cam)
				if [ ! -n "$2" ]
				then
					eval "$e"
				else
					eval "$e" "$2"
				fi
				exit;;

			menu)
				if [ ! -n "$2" ]
				then
					_dialog_checkout
				else
					_dialog_checkout "$2"
				fi;;

			loadonly)
				if [ ! -n "$2" ]
				then
					_nl
					clear
					s3logo
					echo -e "$r_l\n  $txt_error: toolchain $txt_parameter $txt_missing\n""$w_l"
					_help_toolchain
					sleep 2
					exit
				else
					for t in "${AVAI_TCLIST[@]}"
					do
						_tmp="$2"
						[ "$t" == "$2" ] && _load_toolchain "$2" && break
					done
					if [ -f "$tc_dl" ]
					then
						echo -e "$p_l\n\n  toolchain for $_tmp loaded\n"
					else
						_nl
						clear
						s3logo
						printf "$r_l  toolchain missing/error\n"
					fi
					exit
				fi;;

			tccheck)
				if [ ! -n "$2" ]
				then
					_nl
					clear
					s3logo
					printf "$r_l\n  $txt_error: toolchain $txt_parameter $txt_missing\n""$w_l"
					_help_toolchain
					printf "$W"
					sleep 2
					exit
				else
					for t in "${AVAI_TCLIST[@]}"
					do
						[ "$t" == "$2" ] && _toolchain_check "$2" && break
					done
					_nl
					clear
					s3logo
					printf "$r_l\n  toolchain missing/error\n$w_l"
					_help_toolchain
					echo -e "$W"
					sleep 2
					exit
				fi;;

			tcrepair)
				if [ ! -n "$2" ];then
					_nl
					clear
					s3logo
					printf "$r_l\n  $txt_error: toolchain $txt_parameter $txt_missing\n""$w_l"
					_help_toolchain
					printf "$W"
					sleep 2
					exit
				else
					_nl
					clear
					_toolchain_repair "$2"
					sleep 2
					exit
				fi;;

			upload)
				if [ ! -n "$2" ]
				then
					_nl
					clear
					s3logo
					echo -e "$r_l\n  $txt_error: $txt_parameter $txt_missing""$w_l"
					menucall="yes"
					ssh_profiles
				else
					upload_cam "$2"
				fi
				exit;;

			syscheck)
				syscheck silent $2
				exit;;

			tedit)
				if [ -n "$2" ]
				then
					for telement in ${INST_TCLIST[@]}
					do
						if [ "$telement" == "$2" ]
						then
							tedit $2
							exit
						fi
					done
					clear
					s3logo
					printf "$w_l\n  $2 toolchain not installed\n"$W
				fi
				exit;;

			help)
				_help
				exit;;

			*)
				shift && eval "$e" "$@"; #Remove the first command line argument and pass the remaining ones to the plugin
				exit;;
			esac

		fi
	done

	for t in "${AVAI_TCLIST[@]}"
	do

		if [ "$t" == "$1" ]
		then
		
			[ "${2:0:4}" == "here" ] && EXTRA_COPY_DIR=1 || EXTRA_COPY_DIR=0

			if [ "${2:0:3}" == "-p=" ] || [ "${2:0:3}" == "-P=" ]
			then
				if [ -f "$profdir/${2#*=}" ]
				then
					pf=$(cat "$profdir/${2#*=}")
					pf_name="${2#*=}"
				fi
			fi

			if [ "${3:0:3}" == "-p=" ] || [ "${3:0:3}" == "-P=" ]
			then
				if [ -f "$profdir/${2#*=}" ]
				then
					pf=$(cat "$profdir/${2#*=}")
					pf_name="${2#*=}"
				fi
			fi

			if [ "${2:0:5}" == "-upx=" ] || [ "${2:0:5}" == "-UPX=" ]
			then
				UPX=${2#*=};USE_vars[USE_COMPRESS]="USE_COMPRESS=1"
			fi

			if [ "${3:0:5}" == "-upx=" ] || [ "${3:0:5}" == "-UPX=" ]
			then
				UPX=${2#*=}
				USE_vars[USE_COMPRESS]="USE_COMPRESS=1"
			fi

			[ "$pf" == "empty" ] && c_m_d="$*" || c_m_d="all_off $pf $*"; # set only active module with profiles
			for cmd in $c_m_d
			do

				if [ "${cmd:0:3}" == "-c=" ] || [ "${cmd:0:3}" == "-C=" ]
				then
					CUSTOM_CONFDIR="${cmd#*=}"
				fi

				if [ "${cmd:0:11}" == "-oscamname=" ]
				then
					USE_vars[USE_OSCAMNAME]="USE_OSCAMNAME=${cmd#*=}"
				fi

				if [ "${cmd:0:5}" == "-upx=" ] || [ "${cmd:0:5}" == "-UPX=" ]
				then
					UPX="${cmd#*=}"
					USE_vars[USE_COMPRESS]="USE_COMPRESS=1"
				fi

				for cc in "${config_cases[@]}"
				do
					[ "$cmd" == "$cc$on" ]  && all_cc+=($cc$on) && break
					[ "$cmd" == "$cc$off" ] && all_cc+=($cc$off) && break
				done

				for sm in "${SHORT_MODULENAMES[@]}"
				do
					[ "$cmd" == "$sm" ]     && all_cc+=($(get_module_name "$sm")$on) && break
					[ "$cmd" == "$sm$off" ] && all_cc+=($(get_module_name "$sm")$off) && break
				done

				for uvar in "${!USE_vars[@]}"
				do
					[ "$cmd" == "$uvar" ]             && USE_vars[$uvar]="$uvar=1" && break
					[ "$cmd" == "$uvar$off" ] && USE_vars_disable[$uvar]="$uvar=1" && break
				done

				case $cmd in
					OPENBOX)  OPENBOX=1;;
					UFS916003) UFS916003=1;;
					USE_VERBOSE) s3cfg_vars[USE_VERBOSE]=1;;
				esac

			done
			_pre_build "$t"
			exit
		fi

	done
	_help
fi
exit
