#!/bin/bash
#
# Copyright 2018 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.

function partition_table_image {
    if [[ $1 -gt 7000000000 ]] && [[ $1 -lt 8000000000 ]]; then
        echo "partition-table-8gb.img"
    elif [[ $1 -gt 14000000000 ]] && [[ $1 -lt 17000000000 ]]; then
        echo "partition-table-16gb.img"
    elif [[ $1 -gt 60000000000 ]]; then
        echo "partition-table-64gb.img"
    fi
}

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

function try {
    $@ || die "Failed to execute $@"
}

ROOTDIR=$(dirname $0)/..
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"

FASTBOOT_CMD="$(which fastboot)"
if [[ ! -x ${FASTBOOT_CMD} ]]; then
    die "Couldn't find fastboot on your PATH -- did you install it?"
fi

if [[ -n ${SERIAL} ]]; then
    FASTBOOT_CMD="fastboot -s ${SERIAL}"
fi

# Set USERSPACE_ARCH to arm64, if not set in the environment
USERSPACE_ARCH=${USERSPACE_ARCH:=arm64}

# If there's a boot.img in the same folder as flash.sh,
# find artifacts in the directory containing the script.
if [ -e ${SCRIPT_DIR}/boot_${USERSPACE_ARCH}.img ]; then
    PRODUCT_OUT=${SCRIPT_DIR}
else
    PRODUCT_OUT=${PRODUCT_OUT:=${ROOTDIR}/out/target/product/imx8m_phanbell}
fi

# Figure out which partition map we need based upon fastboot vars
MMC_SIZE=$(${FASTBOOT_CMD} getvar mmc_size 2>&1 | awk '/mmc_size:/ { print $2 }')
PART_IMAGE=$(partition_table_image ${MMC_SIZE})

if [[ -z ${PART_IMAGE} ]]; then
    die "No partition map available for an emmc of size ${MMC_SIZE}"
fi

for i in u-boot.imx boot_${USERSPACE_ARCH}.img rootfs_${USERSPACE_ARCH}.img ${PART_IMAGE}; do
    [[ ! -f ${PRODUCT_OUT}/$i ]] && die "${PRODUCT_OUT}/$i is missing."
done

# Flash bootloader
try ${FASTBOOT_CMD} flash bootloader0 ${PRODUCT_OUT}/u-boot.imx
try ${FASTBOOT_CMD} reboot-bootloader
sleep 3

# Check to see if HOME existed before we clobber the GPT
HOME_MISSING=$(${FASTBOOT_CMD} getvar partition-type:home 2>&1 |grep -q FAILED && echo true)
if [[ "${HOME_MISSING}" == "true" ]]; then
    echo "*** home partition is missing -- will flash home partition"
else
    echo -n "*** home partition present; "

    if [[ "$1" == "--clobber-home" ]]; then
        echo "--clobber-home specified. WILL flash home partition"
    else
        echo "WILL NOT flash home partition"
    fi
fi

# Flash partition table
try ${FASTBOOT_CMD} flash gpt ${PRODUCT_OUT}/${PART_IMAGE}
try ${FASTBOOT_CMD} reboot-bootloader
sleep 3

# Flash filesystems
try ${FASTBOOT_CMD} erase misc

# If home was present before we stuffed in the new GPT, only clobber
# if the user asked for it.
if [[ "${HOME_MISSING}" == "true" ]] || [[ "$1" == "--clobber-home" ]] ; then
    try ${FASTBOOT_CMD} flash home ${PRODUCT_OUT}/home.img
fi

try ${FASTBOOT_CMD} flash boot ${PRODUCT_OUT}/boot_${USERSPACE_ARCH}.img
try ${FASTBOOT_CMD} flash rootfs ${PRODUCT_OUT}/rootfs_${USERSPACE_ARCH}.img
try ${FASTBOOT_CMD} reboot
