#!/bin/sh
#copyright by monlor
#------------------【Tools】--------------------
source /etc/mixbox/bin/base
param=$1

get_status() {
	applist installed -n 2> /dev/null | while read line; do
		${mbroot}/apps/${line}/scripts/${line}.sh status 
	done
}

title() {

	clear
	newver=$(applist mixbox -v)
	if [ -z "$newver" ]; then
		newver="获取中"
		check_update_text=""
	else
		[ "$(versioncmp $mbver $newver)" = '1' ] && check_update_text="[\033[36m输入u更新工具箱\033[0m]" || check_update_text=""
	fi
	echo "***************************************"
	echo "     *****   MIXBOX 工具箱   *****     "
	echo "***************************************"
	echo -e "当前版本：[$mbver]\t最新版本：[$newver]"
	[ -f /proc/dmu/temperature ] && temp="`cat /proc/dmu/temperature | awk '{printf$4}' | cut -b 1-2`°C"
	[ -f /sys/devices/virtual/thermal/thermal_zone0/temp ] && temp="$(cat /sys/devices/virtual/thermal/thermal_zone0/temp 2> /dev/null)°C"
	if [ ! -z "$temp" ]; then
		temptext="核心温度：[$temp]" 
	else
		wan_type="$(nvram get nv_wan_type 2> /dev/null)"
		[ -n "$wan_type" ] && temptext="上网方式：[$wan_type]" || temptext="主机名称：[`uname -n`]"
	fi
	echo -e "设备型号：[$xq]  \t$temptext"
	echo "***************************************"

}

# install_app() {
# 	echo
# 	echo "获取工具箱插件列表..."
# 	wgetsh ${mbtmp}/applist.txt $mburl/temp/applist_"$xq".txt
# 	if [ $? -ne 0 ]; then
# 		[ "$model" == "arm" ] && applist="applist.txt"
# 		[ "$model" == "mips" ] && applist="applist_mips.txt"
# 		wgetsh ${mbtmp}/applist.txt $mburl/temp/"$applist"
# 	fi
# 	echo "********* 安装/更新插件 ***********"
# 	echo "00. 返回"
# 	i=1
# 	if [ -f ${mbtmp}/applist.txt ]; then
# 		cat ${mbtmp}/applist.txt | while read line
# 		do
# 			checkuci ${line} && tmp="`echo -e "\033[32m已安装\033[0m"`" || tmp="`echo -e "\033[31m未安装\033[0m"`"
# 			[ "$i" -lt "10" ] && k="0$i" || k="$i"
# 			echo "$k. [$tmp] ${line}"
# 			let i=$i+1
# 		done
# 	else
# 		echo "[插件列表未找到，请检查网络问题！]"
# 	fi
# 	echo
# 	read -p "请选择要安装/更新的插件：" res
# 	if [ ! -z "$res" ]; then 
# 		if [ "$res" == '0' -o "$res" == '00' -o ! -f ${mbtmp}/applist.txt ]; then
# 			manage
# 		else
# 			result=$(echo $res | grep -c "^[0-9][0-9]*$")
# 			if [ "$result" == '1' ]; then
# 				appname=$(cat ${mbtmp}/applist.txt | sed -n "$res"p)
# 				if [ ! -z "${appname}" ]; then
# 					if checkuci ${appname}; then 
# 						read -p "插件${appname}已安装，是否要更新？[1/0] " res
# 						[ "$res" == '1' ] && ${mbroot}/scripts/appmanage.sh upgrade ${appname} 
# 					else
# 						${mbroot}/scripts/appmanage.sh install ${appname}
# 						if checkuci ${appname}; then 
# 							source "${mbroot}"/apps/${appname}/config/mixbox.conf 
# 							${appname}
# 							
# 						fi
# 					fi
# 				else
# 					echo "输入有误！"
# 				fi
# 			fi 
# 		fi
# 	fi
# }

uninstall_app() {
	echo
	echo "********* 卸载插件 ***********"
	echo "00. 返回管理菜单"
	i=1
	applist installed -n | while read line
	do
		[ "$i" -lt "10" ] && k="0$i" || k="$i"
		echo "$k. ${line}"
		let i=$i+1
	done
	echo
	read -p "请选择要卸载的插件：" res
	if [ ! -z "$res" ]; then
		if [ "$res" == '0' ]; then
			manage_menu
		else
			appname=$(applist installed -n | sed -n "$res"p)
			if [ ! -z "${appname}" ]; then
				${mbroot}/scripts/appmanage.sh uninstall ${appname}
			else
				echo "输入有误，请重新输入！"
				uninstall_app
			fi
		fi
	fi
}

backup() {
	if [ -f "$mbbackup".tar.gz ]; then
		read -p "检测到已被备份插件配置, 确认覆盖？[1/0] " res
	else
		read -p "确定要备份所有插件配置吗？[1/0] " res
	fi
	if [ "$res" == '1' ]; then
		rm -rf $mbbackup
		rm -rf "$mbbackup".tar.gz
		mkdir -p $mbbackup
		cp -rf ${mbroot}/mbdb $mbbackup
		applist installed -n | while read line; do
			echo "$(mbdb get ${line}.main.backupfiles)" | tr ',' '\n' | while read file; do
			  [ -z "$file" ] && continue
				savepath="$(dirname $mbbackup/${line}/$file)"
				[ ! -d "$savepath" ] && mkdir -p $savepath
				cp -rf ${mbroot}/apps/${line}/$file $mbbackup/${line}/$file &> /dev/null
			done
		done
		cp -rf ${mbroot}/config/applist.txt $mbbackup/applist.txt
		cp -rf ${mbroot}/scripts/userscript.sh $mbbackup/userscript.sh
		cp -rf ${mbroot}/mbdb $mbbackup/mbdb
		tar zcvf "$mbbackup".tar.gz $mbbackup > /dev/null 2>&1
		rm -rf $mbbackup
		echo "备份完成, 配置已备份至$mbbackup.tar.gz"
	fi
}

recover(){
	read -p "确定要恢复所有插件配置吗(将会覆盖当前配置)？[1/0] " res
	if [ "$res" == '1' ]; then
		[ ! -f "$mbbackup".tar.gz ] && echo "未找到备份文件！" && return 1
		rm -rf $mbbackup
		tar zxvf "$mbbackup".tar.gz -C / > /dev/null 2>&1
		cp -rf $mbbackup/applist.txt ${mbroot}/config/applist.txt
		applist installed -n | while read line 
		do
			checkuci ${line} || ${mbroot}/scripts/appmanage.sh install ${line} 
			[ -d "$mbbackup/${line}" ] && cp -rf $mbbackup/${line}/* ${mbroot}/apps/${line}/
		done
		# 恢复uci配置
		cp -rf $mbbackup/mbdb ${mbroot}/
		cp -rf $mbbackup/userscript.sh ${mbroot}/scripts/userscript.sh
		rm -rf $mbbackup
		echo "恢复完成, 初始化工具箱..."
		${mbroot}/scripts/init.sh
	fi	
}

modify_source() {
	local mburl_tmp=""
	case "$mburl" in
		"$mburl_coding") url_text="coding下载源" ;;
		"$mburl_github") url_text="github下载源" ;;
		# "$mburl_test") url_text="coding测试源" ;;
		*) url_text="$mburl" ;;
	esac
	echo "下载源【$url_text】使用中"
	echo "0. 不修改"
	echo "1. coding下载源"
	echo "2. github下载源"
	# echo "3. coding测试源(不推荐)"
	read -p "请选择或输入下载源：" res
	case "$res" in
		0) return ;;
		1) mburl_tmp="$mburl_coding" ;;
		2) mburl_tmp="$mburl_github" ;;
		# 3) mburl_tmp="$mburl_test" ;;
		*) [ -n "$res" ] && mburl_tmp="$res" ;;
	esac
	if [ -n "$mburl_tmp" ]; then
		mbdb set mixbox.main.url="$mburl_tmp" 
		
		applist update
	fi
}

# enable_webui() {
# 	read -p "是否要启用工具箱web界面？[1/0] " res
# 	mbdb set mixbox.main.webui="$res"
# 	if [ "$res" == '0' ]; then
# 		umount -lf /usr/lib/lua/luci
# 		rm -rf ${mbtmp}/mountfiles
# 		rm -rf ${mbtmp}/syslogbackup/css
# 		rm -rf ${mbtmp}/syslogbackup/img
# 		rm -rf ${mbtmp}/luci-modulecache
# 		rm -rf ${mbtmp}/luci-indexcache
# 	elif [ "$res" == '1' ]; then
# 		${mbroot}/scripts/addweb.sh
# 	fi
# }

uninstall() {
	# wgetsh ${mbtmp}/uninstall.sh $mburl/apps/mixbox/scripts/uninstall.sh
	# [ $? -eq 0 ] && ${mbtmp}/uninstall.sh || echo "获取卸载脚本失败！"
	${mbroot}/scripts/uninstall.sh
	exit
}

update() {
	# wgetsh ${mbtmp}/update.sh $mburl/apps/mixbox/scripts/update.sh 
	# [ $? -eq 0 ] && ${mbtmp}/update.sh || echo "获取更新脚本失败！"
	${mbroot}/scripts/update.sh
	exit
}

check_install() {

	if checkuci $1; then
		status=$(mbdb get $1.main.status | cut -d'|' -f1) > /dev/null 2>&1
		if [ ! -z "$status" ]; then
			if [ "$status" != "未运行" ]; then
				echo -n "[\033[32m$status\033[0m]" 
			else
				echo -n "[\033[31m$status\033[0m]" 
			fi
		else
			echo -n "[\033[31m未运行\033[0m]" 
		fi
	else 
		echo -n "[选择以安装]"
	fi
}

check_update() {
	[ -z "$1" ] && return
	[ -n "$2" ] && newver="$2" || newver="$(applist $1 -v)"
	oldver=$(mbdb get $1.main.version)
	if [ ! -z "$newver" -a ! -z "$oldver" ] && [ "$(versioncmp $oldver $newver)" = '1' ]; then
		echo -n "[\033[36m有更新\033[0m]"
		return 0
	fi
	return 1

}

menulist() {

	# if [ "$1" = '0' ]; then
	# # 检查是否在进行状态检查
	# 	for i in $(seq 1 5); do
	# 		if [ -n "$(pssh | grep "mixbox.*status")" ]; then
	# 			echo "正在检查插件状态，请稍等一会儿~" && sleep 2
	# 		else
	# 			break
	# 		fi
	# 	done
	# fi
	rm -rf ${mbtmp}/applist_menu.txt
	echo "00. 返回主菜单"
	i=0;
	if [ "$1" = '0' ]; then
		applist installed -a > ${mbtmp}/applist_all.txt
	else
		applist all -a > ${mbtmp}/applist_all.txt
	fi

	while read line
	do
		if [ "$1" = '0' ]; then
			info=""
			name="$(echo "$line" | cut -d'|' -f1)"
			checkuci $name || continue
		elif [ "$1" = '1' ]; then
			name="$(echo "$line" | cut -d'|' -f1)"
			info=["$(echo "$line" | cut -d'|' -f2)"]
			checkuci $name && continue
			
		fi
		appver="$(cat $mbtmp/applist.txt | grep "^$name|" | cut -d'|' -f4)"
		echo $name >> ${mbtmp}/applist_menu.txt
		let i=$i+1
		args="\t"
		[ "$i" -ge 10 ] && head="$i. $name" || head="0$i. $name"
		[ "${#head}" -lt 8 ] && args="\t\t"
		[ "${#head}" -eq 16 ] && args=""
		if [ "$1" = '0' ]; then
			echo -e "$head$args`check_install $name` `check_update $name $appver`"
		elif [ "$1" = '1' ]; then
			echo -e "$head$info [\033[31m未安装\033[0m]"
		fi

	done < ${mbtmp}/applist_all.txt
	rm -rf ${mbtmp}/applist_all.txt

	if [ "$i" = '0' ]; then
		[ "$1" = '0' ] && echo -e "[未安装任何插件！]" || echo -e "[已经没有插件可安装了哦！]"
	fi
	echo
}

wait_back() {
	echo
	#echo "$1秒后返回..."
	#sleep $1
	echo -n "按任意键返回."
	read 

}

select_app() {
	read -p "请输入你的选择`echo -e $check_update_text`：" select
	if [ "$select" = 'u' ]; then
		update
	elif [ `echo $select | grep -c '^[0-9][0-9]*$'` -eq 1 ]; then
		if [ "$select" -eq '0' ]; then
			return 0
		elif [ "$select" -gt '0' ] && [ "$select" -le "$(cat ${mbtmp}/applist_menu.txt | wc -l)" ]; then
			appname=$(cat ${mbtmp}/applist_menu.txt | sed -n "$select"p)
			if [ ! -z "${appname}" ]; then
				if ! checkuci ${appname}; then
					read -p "确定要安装${appname}插件？[1/0] " install
					[ "$install" = '1' ] && ${mbroot}/scripts/appmanage.sh install ${appname} 
				else
					if [ -n "$(check_update ${appname})" ]; then
						read -p "是否要更新${appname}插件？[1/0] " update
						[ "$update" == '1' ] && ${mbroot}/scripts/appmanage.sh upgrade ${appname} 
					fi
					# todo 配置方式修改
					if [ -f ${mbroot}/apps/${appname}/config.sh ]; then
						${mbroot}/apps/${appname}/config.sh
						if [ $? -eq 0 ]; then
							${mbroot}/apps/${appname}/scripts/${appname}.sh restart
						else
							${mbroot}/apps/${appname}/scripts/${appname}.sh stop
						fi
					else
						source "${mbroot}"/apps/${appname}/config/mixbox.conf 
						${appname}
					fi
					${mbroot}/apps/${appname}/scripts/${appname}.sh status
				fi
			else 
				echo "输入有误，未找到该插件！"
			fi
		else
			echo "输入有误，没有该序号！"
		fi
	else
		echo "输入有误，请输入数字！"
	fi
	rm -rf ${mbtmp}/applist_menu.txt
	wait_back && (title && menulist $1 && select_app $1)
}

auto_update() {
	[ "$(mbdb get mixbox.main.autoupdate)" = '1' ] && local tmptext="已启用" || local tmptext="未启用"
	read -p "【谨慎】是否要自动更新工具箱和插件($tmptext)？[1/0] " res
	checkread $res && mbdb set mixbox.main.autoupdate="$res"
}

manage_menu() {
	echo "00. 返回主菜单"
	echo "01. 更换工具箱下载源"
	echo "02. 备份工具箱配置"
	echo "03. 恢复工具箱配置"
	echo "04. 自动更新工具箱和插件"
	echo "05. 卸载插件"
	echo "06. 卸载工具箱"
	echo 
	read -p "请输入你的选择`echo -e $check_update_text`：" select
	case "$select" in
		1|01) modify_source ;;
		2|02) backup ;;
		3|03) recover ;;
		4|04) auto_update ;;
		5|05) uninstall_app ;;
		6|06) uninstall && exit ;;
		u) update && exit ;;
		0|00) return ;;
		*) echo "输入有误，请重新输入！" 
	esac
	wait_back && (title && manage_menu)
}

menu() {

	while(true)
	do
	title
	echo "00. 退出工具箱"
	echo "01. 已安装插件"
	echo "02. 未安装插件"
	echo "03. 工具箱管理"
	echo
	echo -n "请输入你的选择`echo -e $check_update_text`："
	read select
	case "$select" in 
		00|0) exit 1 ;;
		01|1) title && menulist 0 && select_app 0;;
		02|2) title && menulist 1 && select_app 1;;
		03|3) title && manage_menu ;;
		u) update ;;
		*) echo "输入有误，请重新输入！" && wait_back ;;
	esac
	echo
	
	done

}

install() {
	${mbroot}/scripts/appmanage.sh install $1
}

remove() {
	${mbroot}/scripts/appmanage.sh uninstall $1
}

upgrade() {
	${mbroot}/scripts/appmanage.sh upgrade $1
}

start() {
	mbdb set $1.main.enable=1
	/etc/mixbox/apps/$1/scripts/$1.sh start
}

restart() {
	mbdb set $1.main.enable=1
	/etc/mixbox/apps/$1/scripts/$1.sh restart
}

stop() {
	mbdb set $1.main.enable=0
	/etc/mixbox/apps/$1/scripts/$1.sh stop
}

help() {
	cat << EOF
Usages: $0 {install|remove|upgrade|start|restart|stop|update|backup|recover|uninstall} 
Options:
		install appname   	Install App
		remove appname    	Remove App
		upgrade appname     Upgrade App
		start appname     	Start App
		restart appname   	Restart App
		stop appname      	Stop App
		update  		  Update Tool
		backup  		  Backup Tool
		recover 		  Recover Tool
		uninstall  		  Uninstall Tool
Example:
		1. mixbox install shadowsocks
		2. mixbox upgrade kms
		3. mixbox update

EOF
}

#------------------【Tools】--------------------
if [ ! -z $param ]; then 
	[ -f ${mbroot}/apps/$param/config/mixbox.conf ] && source ${mbroot}/apps/$param/config/mixbox.conf
	shift 1
	$param $@
else 
	echo "获取工具箱插件列表..."
	applist update &
	get_status 
	menu
fi
