#!/bin/bash
# LNXALL APP SDK Configuration Tool
# Created by hongbo.he@lnxall.com
#
TER_G='\033[0;32m'
TER_Y='\033[1;33m'
TER_B='\033[0;34m'
TER_R='\033[31m'
NC='\033[0m'

SYSTEM_RL_URL="http://192.168.22.226:8000/system_releases/"
LNXALL_AUTH="support:lnxall1234!@#$"
REPO_URL="git@192.168.22.227:lnxall/wlos_staging/wlos_nobsp.git"
MANIFEST="sdk_application.xml"
DEFAULT_SDK_DIR="application-sdk"

echo -e "$TER_G>>> LNXALL 应用开发环境搭建 ...$NC"
read -p "请输入待创建的开发环境目录(Default: $DEFAULT_SDK_DIR): " input_dir
SDK_DIR=${input_dir:-$DEFAULT_SDK_DIR}
if [ -d "$SDK_DIR/application" ] ; then
	echo -ne "${TER_Y}$SDK_DIR 已存在, 是否清理旧的编译结构并重新配置? (y/N)$NC " && read -r confirm
	if [[ -z "$confirm" || "$confirm" =~ ^[yY]([eE][sS])?$ ]] ; then
		cd $SDK_DIR/application || exit 1
		./build.bash clean > /dev/null
		rm -rf ./target/install ./target/staging
		rm -f target tagman/sources.sh tagman/select_app/appconfig.sh
	else
		exit 1
	fi
else
	mkdir -p "$SDK_DIR" ; cd "$SDK_DIR"
	if [ -d ".repo" ] ; then
		echo -e "$TER_G repo 已初始化, 跳过 init $NC"
	else
		repo init -u "$REPO_URL" -m "$MANIFEST" --no-clone-bundle --no-repo-verify
	fi
	echo -e "$TER_Y正在拉取仓库...$NC"
	repo sync || { echo "Error, 执行 repo sync 失败" ; exit 1; }
	cd application
fi

# CONFIG
echo -e "$TER_G请选择设备型号: $NC"
device_options=("EMS-1000" "EMS-500" "WooLink-2004" "ECU-1170" "EMS-500-X" "X86_64")
PS3="请选择设备编号(1-6): "
APPCONF=
if [ ! -t 0 ] ; then
	echo -e "${TER_R}Error, 当前环境不是交互式终端，无法读取设备选择输入$NC"
	exit 1
fi
select device in "${device_options[@]}"; do
    case $device in
        "EMS-1000")
            APPCONF="appconfig_ems1000.sh"
			TARGET="target_rk3568_glibc"
            break
            ;;
        "EMS-500")
            APPCONF="appconfig_ems500.sh"
			TARGET="target_iMX6ULL_glibc"
            break
            ;;
        "WooLink-2004")
            APPCONF="appconfig_ems500.sh"
			TARGET="target_iMX6ULL_wl2004"
            break
            ;;
		"ECU-1170")
			APPCONF="appconfig_yanhua_ecu1170.sh"
			TARGET="target_yanhua_ecu1170"
			break
			;;
		"EMS-500-X")
            APPCONF="appconfig_ems500.sh"
			TARGET="target_ma35d1_glibc"
			break
			;;
		"X86_64")
            APPCONF="appconfig_x86_64.sh"
			TARGET="target_x86-64_glibc"
			break
			;;
        *)
            echo "无效选项, 请重新选择"
            ;;
    esac
done
if [ -n "$APPCONF" ] ; then
	rm -f tagman/select_app/appconfig.sh
	ln -sv -f "$APPCONF" tagman/select_app/appconfig.sh
fi
ln -sv -f "$TARGET" target

echo -e "$TER_G请选择软件版本: $NC"
software_options=("EMS 1.0" "EMS 2.0" "EMS 2.1")
PS3="请选择软件版本编号(1-3): "
SOURCE_CONF=
select software in "${software_options[@]}"; do
	case $software in
		"EMS 1.0")
			SOURCE_CONF="ems1.0_sources.sh"
			break
			;;
		"EMS 2.0")
			SOURCE_CONF="ems2.0_sources.sh"
			break
			;;
		"EMS 2.1")
			SOURCE_CONF="ems2.1_sources.sh"
			break
			;;
		*)
			echo "无效选项, 请重新选择"
			;;
	esac
done
if [ ! -f "tagman/$SOURCE_CONF" ] ; then
	echo -e "${TER_R}Error, 未找到软件配置文件: tagman/$SOURCE_CONF$NC"
	exit 1
fi
ln -sv -f "$SOURCE_CONF" tagman/sources.sh

# 先选择 tagman 分支
echo -e "$TER_G请选择 tagman 分支: $NC"
cd tagman || { echo -e "${TER_R}Error, 无法进入 tagman 目录$NC"; exit 1; }
git fetch --all --tags 2>/dev/null
current_branch=$(git branch --show-current 2>/dev/null)
if [ -z "$current_branch" ]; then
	current_branch=$(git rev-parse --short HEAD 2>/dev/null)
fi
# 获取所有分支(去重, 去除 HEAD, 去除 remotes 前缀)
raw_branches=$(git branch -a | grep -v 'HEAD' | sed '/->/d; s/^[* ]*//; s|^remotes/[^/]*/||' | grep -v '^remotes/' | sort -u)
cd - > /dev/null
# 构建分支列表
branch_opts=()
while IFS= read -r b; do
    if [ -n "$b" ]; then
        branch_opts+=("$b")
    fi
done <<< "$raw_branches"
echo -e "${TER_Y}当前 tagman 分支: ${current_branch:-未知}${NC}"
if [ ${#branch_opts[@]} -eq 0 ]; then
	echo -e "${TER_Y}未找到可切换分支，保持当前分支${NC}"
else
	for i in "${!branch_opts[@]}"; do
		printf "%d) %s\n" "$((i + 1))" "${branch_opts[$i]}"
	done
	while true; do
		read -r -p "请选择分支编号(1-${#branch_opts[@]})，直接回车保持当前分支: " branch_reply
		if [ -z "$branch_reply" ]; then
			echo -e "$TER_G保持当前分支: ${current_branch:-未知} $NC"
			break
		fi
		if [[ "$branch_reply" =~ ^[0-9]+$ ]] && [ "$branch_reply" -ge 1 ] && [ "$branch_reply" -le "${#branch_opts[@]}" ]; then
			SELECTED_BRANCH="${branch_opts[$((branch_reply - 1))]}"
			echo -e "$TER_G已选择分支: $SELECTED_BRANCH $NC"
			cd tagman || exit 1
			git checkout "$SELECTED_BRANCH" 2>/dev/null || { echo -e "${TER_R}Error, 切换分支失败: $SELECTED_BRANCH，请检查 tagman 仓库是否存在未修改文件$NC"; exit 1; }
			git pull origin "$SELECTED_BRANCH" 2>/dev/null
			cd - > /dev/null
			break
		fi
		echo "无效选项, 请重新选择"
	done
fi

echo -e "$TER_G请选择应用包配置:$NC"
tagman_repo_configs=($(ls tagman/repo-*.json 2>/dev/null))
if [ ${#tagman_repo_configs[@]} -eq 0 ] ; then
	echo "Error, 未找到 TAGMAN 配置文件"
	exit 1
fi
tagman_cfgs=()
for cfg in "${tagman_repo_configs[@]}"; do
	tagman_cfgs+=($(basename "$cfg"))
done
PS3="请输入序列号 (1-${#tagman_repo_configs[@]}): "
select opt in "${tagman_cfgs[@]}"; do
    if [ -n "$opt" ]; then
        SELECTED_CONF="$opt"
        echo -e "$TER_G已选择: $SELECTED_CONF $NC"
        break
    else
        echo "无效选项, 请重新选择"
    fi
done
TAGMAN_CONF="$SELECTED_CONF" ./tagman/tagman

# SYSTEM DEP
echo -e "$TER_B>>> 正在获取远程系统包列表...$NC"
vlist=($(curl -s -u "$LNXALL_AUTH" "$SYSTEM_RL_URL" | grep -oP '(?<=href=")[^"]+/(?=")' | grep -v '\.\./' | sed 's/\///' | sort -r))
PS3="请选择系统包版本(Suggest: [1]):"
DOWNLOAD_URL=
select ver in "${vlist[@]}"; do
    if [ -n "$ver" ]; then
        DOWNLOAD_URL="${SYSTEM_RL_URL}${ver}/${TARGET}-${ver}/install.tar.xz"
        break
    fi
done
if [ -f "install.tar.xz" ] ; then
	rm -f "install.tar.xz"
fi
wget -N --user="${LNXALL_AUTH%%:*}" --password="${LNXALL_AUTH#*:}" $DOWNLOAD_URL
if [ $? -eq 0 ] ; then
	echo -e "$TER_G下载成功, 正在安装...$NC"
	./scripts/unpack-install "install.tar.xz" ; rm -f "install.tar.xz"
else
	echo -e "${TER_R}Error, 文件下载失败，请检查 URL: $DOWNLOAD_URL"
	exit 1
fi
echo -e "${TER_G}SDK 配置完成$NC"
