#!/bin/bash

set -e

top_dir=$(readlink -e $(dirname $0)/../../)

# Plan to support different brezza board:
# brezza-p1: 2022/08
# brezza-p2: 2022/10
# brezza-b1: 2023/01
# brezza-b3: 2023/04
# brezza-b4: 2023/05
declare -A PRODUCT_LIST=([sirocco]="sirocco-p1 sirocco-b1 sirocco-b3 sirocco-b4" [brezza]="brezza-p0 brezza-p1 brezza-p2 brezza-b1 brezza-b3 brezza-b4")

function Help() {
  echo "Usage: $0  <eureka_workspace> <product/board> [optional build number] [other options]"
  echo "  valid product : sirocco, brezza"
  echo "  available options: --venv_root=<venv_root>"
}

function parse_args() {
  readonly eureka_src_path="$( cd "$( dirname "${1}" )" && pwd )/$(basename $1)"
  # Set the target profile as per SOC
  product=""
  revision=""
  # Check if user specify product or board
  if [[ "$2" =~ ^.+-[pb][0-9]$ ]]; then
    product=`echo $2 | cut -d "-" -f1`
    revision=`echo $2 | cut -d "-" -f2`
  else
    product=$2
  fi
  readonly product
  readonly revision

  deterministic_build=""

  shift # product
  shift # eureka_src_path

  for arg in "$@"
  do
    case $arg in
      --venv_root=*)
        pyvenv_path="${arg#*=}"
        shift # past argument=value
      ;;
      *[!0-9]* | '') # not a number
        echo "unknown option ${arg}"
      ;;
      *)
        build_number=$arg
        shift
      ;;
    esac
  done

  if [ -z "$build_number" ]; then
    build_number="${USER}-private_build"
  else
    # If we were supplied a build number, this is probably a build server build so
    # build kernel deterministically
    deterministic_build="-d"
  fi
}

function setup_pyvenv() {
  if [ -d "${pyvenv_path}" -a -f "${pyvenv_path}/bin/activate" ]; then
    source ${pyvenv_path}/bin/activate
    echo "activated virtual environment at ${pyvenv_path}"
  fi
}

function IsProductValid() {
  local available_product
  local ret=1

  for available_product in ${!PRODUCT_LIST[@]}; do
    if [ "${available_product}" == "$1" ]; then
      ret=0
      break
    fi
  done

  return ${ret}
}

function build_for_board() {
  board=$1

  # Build kernel
  pushd ${top_dir}/kernel
  echo "Build kernel for ${board}..."
  ./build.sh ${deterministic_build} ${board} ${eureka_src_path}
  popd

  # Build u-boot
  pushd ${top_dir}/bootloader
  echo "Build bootloader for ${board}..."
  ./build.sh ${deterministic_build} ${board} ${eureka_src_path}
  popd
}

function BuildAll() {
  if [ -z ${eureka_src_path} ]; then
    echo "eureka_src_path doesn't exist"
    exit 1
  fi

  if ! IsProductValid ${product}; then
    echo "Invalid product: $product"
    Help
    exit 1
  fi


  if [ $revision ]; then
    echo "Build for board ${product}-${revision}"
    build_for_board $product-$revision
  else
    echo "Build for all board revisions for product: ${product}"
    for board in ${PRODUCT_LIST[${product}]}; do
      build_for_board $board
    done
  fi

  # Build sdk modules
  pushd ${top_dir}/sdk/qca-ssdk
  ./build.sh ${product} ${eureka_src_path}
  popd

  pushd ${top_dir}/sdk/qca-nss-dp
  ./build.sh ${product} ${eureka_src_path}
  popd

  pushd ${top_dir}/sdk/qca-nss-sfe
  ./build.sh ${product} ${eureka_src_path}
  popd

  pushd ${top_dir}/sdk/qca-nss-ecm
  ./build.sh ${product} ${eureka_src_path}
  popd

  pushd ${top_dir}/ta
  ./build.sh ${product} ${eureka_src_path}
  popd
}

#########################
####### Main Entry ######
#########################
if [[ "$#" -lt 2 ]] || [[ "$#" -gt 4 ]]; then
  echo "Error: Incorrect arguments."
  Help
  exit 1
fi

parse_args $@

# Create SDK Version number
mkdir -p ${eureka_src_path}/vendor/qualcomm/${product}
sdk_version_manifest=${eureka_src_path}/vendor/qualcomm/${product}/SDK_VERSION
echo "Build #${build_number}|$(TZ='America/Los_Angeles' date)" > $sdk_version_manifest

setup_pyvenv

BuildAll
