#!/bin/bash
#
# Copyright (c) 2021-2022 Amlogic, Inc. All rights reserved.
#
# SPDX-License-Identifier: MIT
#

###############################################################
# Function: choose board and product, set environment variables.
###############################################################

usage()
{
	echo "Usage: source $BASH_SOURCE [arch_name] [soc_name] [board_name] [product_name]"
	echo "−h: display help."
	echo ""
}

version_lt() { test "$(echo "$@" | tr " " "\n" | sort -rV | head -n 1)" != "$1"; }

CMAKE_FILE=`which cmake`
if [ -x /opt/cmake-3.18.4-Linux-x86_64/bin/cmake ]; then
	export PATH=/opt/cmake-3.18.4-Linux-x86_64/bin/:$PATH
elif [ -n "$CMAKE_FILE" ]; then
	CMAKE_VERSION=`cmake --version`
	pattern="cmake version "
	CMAKE_VERSION=`echo ${CMAKE_VERSION#*${pattern}}`
	pattern=" CMake"
	CMAKE_VERSION=`echo ${CMAKE_VERSION%${pattern}*}`
	if version_lt $CMAKE_VERSION "3.13.1"; then
		echo "cmake version $CMAKE_VERSION < 3.13.1!"
		echo "Please upgrade cmake!"
		return 0
	fi
else
	echo "cmake not found!"
	echo "Please install cmake!"
	return 0
fi

NINJA_FILE=`which ninja`
if [ -z "$NINJA_FILE" ]; then
	echo "ninja not found!"
	echo "Please install ninja!"
	return 0
fi

source scripts/gen_build_combination.sh

if [ -n "$1" ] && [ $1 == "-h" ]; then
	usage
	return 0
elif [ $# -eq 4 ]; then
	PROJECT="$1 $2 $3 $4"
	echo "Choose project:$PROJECT"
elif [ $# -eq 5 ]; then
	PROJECT="$1 $2 $3 $4 $5"
	echo "Choose project:$PROJECT"
else
	unset ARRAY

	while IFS= read -r LINE; do
		ARRAY+=( "$LINE" )
	done < $BUILD_COMBINATION

	echo "Available projects:"
	j=0
	for j in "${!ARRAY[@]}"; do
		NR=$j
		j=$((j+1))
		echo -e "\t$NR. ${ARRAY[$j-1]}"
	done
	read -p "Choose your project: " CHOICE

	# Determine whether it is a digital number
	expr $CHOICE + 1 > /dev/null 2>&1
	if [ $? -eq 0 ]; then
		if [ $CHOICE -le $j ]; then
			PROJECT=${ARRAY[$CHOICE]}
		else
			echo "Wrong choice!"
			return 0
		fi
	else
		PROJECT=$CHOICE
	fi
fi

ARCH=`echo "$PROJECT"|awk '{print $1}'`
SOC=`echo "$PROJECT"|awk '{print $2}'`
BOARD=`echo "$PROJECT"|awk '{print $3}'`
PRODUCT=`echo "$PROJECT"|awk '{print $4}'`
COMPILER=`echo "$PROJECT"|awk '{print $5}'`
# Check current project
check_build_combination $ARCH $SOC $BOARD $PRODUCT
err=$?
[ "$err" -eq 1 ] && echo "Invalid ARCH: $ARCH!" && return $err
[ "$err" -eq 2 ] && echo "Invalid SOC: $SOC!" && return $err
[ "$err" -eq 3 ] && echo "Invalid BOARD: $BOARD!" && return $err
[ "$err" -eq 4 ] && echo "Invalid PRODUCT: $PRODUCT!" && return $err

case $ARCH in
	arm) COMPILER=gcc; TOOLCHAIN_KEYWORD="arm-none-eabi" ;;
	arm64)  if [ "$COMPILER" == "clang+llvm" ]; then
			TOOLCHAIN_KEYWORD="arm"
			TOOLCHAIN_PATH=$PWD/output/toolchains/clang+llvm-arm
		else
			COMPILER="gcc"
			TOOLCHAIN_KEYWORD="aarch64-none-elf"
		fi
	      ;;
	riscv) COMPILER="gcc"; TOOLCHAIN_KEYWORD="riscv-none" ;;
	xtensa) COMPILER="xcc"; TOOLCHAIN_KEYWORD="xt" ;;
	*) echo "Failed to identify ARCH $ARCH";return 1;;
esac

CONF_FILE="$PWD/products/$PRODUCT/prj.conf"
BACKTRACE_ENABLE=0
if [ $(grep -c "CONFIG_BACKTRACE=y" $CONF_FILE) -ne '0' ]; then
	BACKTRACE_ENABLE=1
fi

KERNEL=freertos

export ARCH BOARD COMPILER KERNEL PRODUCT SOC TOOLCHAIN_KEYWORD TOOLCHAIN_PATH BACKTRACE_ENABLE
