#!/bin/bash
#
# Copyright 2020 Google LLC
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#     https://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
DRAM_SIZE=2G

function die {
  echo "$@" >/dev/stderr
  exit 1
}

function load_fastboot {
  local files_dir="$1"
  python3 "${files_dir}/flashtools/debug_board_reset.py" --rom &
  sleep 1
  pushd "${files_dir}"
  python3 "${files_dir}/flashtools/fbtool.py" -f "${files_dir}/dl_addr.ini"
  sleep 1
  popd
}

function ensure_files_present {
  local found_all_files=true
  local files_dir="$1"; shift
  local link_dir="$1"; shift
  local files=(
    "dl_addr.ini"
    "flashtools/debug_board_reset.py"
    "flashtools/dl_addr.ini"
    "flashtools/fbtool.py"
    "lk.bin"
  )

  if [[ "${PRODUCT_OUT}" == "${files_dir}" ]]; then
    ln -sf "${ROOTDIR}/board/flashtools/dl_addr.ini" "${files_dir}/dl_addr.ini"
    rm -f "${files_dir}/flashtools"
    ln -sf "${ROOTDIR}/board/flashtools" "${files_dir}/flashtools"
  fi

  for file in "${files_dir}/*"; do
    ln -sf ${file} "${link_dir}"
  done

  # LK needs to be handled separatedly for now.
  if [[ -f "${files_dir}/lk_${DRAM_SIZE}.bin" ]]; then
    ln -sf "${files_dir}/lk_${DRAM_SIZE}.bin" "${link_dir}/lk.bin"
  else
    echo "lk_${DRAM_SIZE}.bin is missing!"
    found_all_files=""
  fi

  for file in "${files[@]}"; do
    if [[ ! -f "${link_dir}/${file}" ]]; then
      echo "${file} is missing!"
      found_all_files=""
    fi
  done

  if [[ -z "${found_all_files}" ]]; then
    die "Required files are missing. Can not continue."
  fi
}

function main {
		local usage=$(cat <<EOF
Usage: enable_lk_fastboot.sh [-d <files_dir>]
  -d <files_dir>      Boot LK with files from <files_dir> (defaults to current dir)
  -o                  Boot LK on the old boards.
EOF
)

  local files_dir                 # -d <files_dir>
  local lk_fastboot               # -l
  local args=$(getopt hod: $*)
  set -- $args

  for i; do
    case "$1" in
      -d)  # files dir
        files_dir="$2"
        shift 2
        ;;

      -o)  # old board
        DRAM_SIZE=1G
        shift 1
        ;;

      --)  # end of args
        shift
        break
        ;;

      *)  # help
        die "${usage}"
        ;;

    esac
  done

  if [[ -z "${files_dir}" ]]; then
    if [[ -n "${PRODUCT_OUT}" ]]; then
      files_dir="${PRODUCT_OUT}"
    else
      files_dir="${SCRIPT_DIR}"
    fi
  fi

  link_dir=$(mktemp -d)
  trap 'rm -rf ${link_dir}' EXIT
  ensure_files_present "${files_dir}" "${link_dir}"

  load_fastboot "${link_dir}"
}

main "$@"
