#!/bin/bash
#
# OpenIPC | version 2023.11.30

# Autoupdate BUILDER repo
# Remove old building folder (for full rebuild)
# Download OpenIPC repo
# Copy files from Device Overlay
# Build Firmware
# Copy Kernel and Rootfs to Archive
# Copy Kernel and Rootfs to TFTP server

RELEASE=""
DEVICE="$1"
TFTP_STORAGE="root@172.17.32.17:/mnt/bigger-2tb/Rotator/TFTP"

BUILDER_DIR=$(pwd)
FIRMWARE_DIR="${BUILDER_DIR}/openipc"
TIMESTAMP=$(date +"%Y%m%d%H%M")
VERSION=$(stat -c"%Y" $0)

echo_c() {
    # 30 grey, 31 red, 32 green, 33 yellow, 34 blue, 35 magenta, 36 cyan, 37 white
    t="\e[1;$1m$2\e[0m" || t="$2"
    echo -e "$t"
}

autoup_rootfs() {
    DT=$(date +"%y.%m.%d")
    OPENIPC_VER=$(echo OpenIPC v${DT:0:1}.${DT:1})
    SOC=$(echo ${DEVICE} | cut -d_ -f1)

    echo_c 34 "\nDownloading u-boot created by OpenIPC"
    curl --location --output ./output/images/u-boot-${SOC}-universal.bin \
        https://github.com/OpenIPC/firmware/releases/download/latest/u-boot-${SOC}-universal.bin

    echo_c 34 "\nMaking autoupdate u-boot image"
    ./output/host/bin/mkimage -A arm -O linux -T firmware -n "$OPENIPC_VER" \
        -a 0x0 -e 0x50000 -d ./output/images/u-boot-${SOC}-universal.bin \
        ./output/images/autoupdate-uboot.img

    echo_c 34 "\nMaking autoupdate kernel image"
    ./output/host/bin/mkimage -A arm -O linux -T kernel -C none -n "$OPENIPC_VER" \
        -a 0x50000 -e 0x250000 -d ./output/images/uImage.${SOC} \
        ./output/images/autoupdate-kernel.img

    echo_c 34 "\nMaking autoupdate rootfs image"
    ./output/host/bin/mkimage -A arm -O linux -T filesystem -n "$OPENIPC_VER" \
        -a 0x250000 -e 0x750000 -d ./output/images/rootfs.squashfs.${SOC} \
        ./output/images/autoupdate-rootfs.img
}

copy_to_archive() {
    echo_c 32 "Copying files to local archive"
    mkdir -p "${BUILDER_DIR}/archive/${DEVICE}/${TIMESTAMP}"
    cp -a \
        ${FIRMWARE_DIR}/output/images/rootfs.squashfs.* \
        ${FIRMWARE_DIR}/output/images/uImage.* \
        ${FIRMWARE_DIR}/output/images/*.tar \
        ${FIRMWARE_DIR}/output/images/openipc.*.tgz \
        ${BUILDER_DIR}/archive/${DEVICE}/${TIMESTAMP}

    if [ -f "${FIRMWARE_DIR}/output/images/autoupdate-kernel.img" ] ; then
        cp -a ${FIRMWARE_DIR}/output/images/autoupdate* ${BUILDER_DIR}/archive/${DEVICE}/${TIMESTAMP}
    fi

    echo_c 35 "\nAssembled firmware available in:"
    tree -C "${BUILDER_DIR}/archive/${DEVICE}/${TIMESTAMP}"

    if $(echo ${DEVICE} | grep -q hi3518ev200_lite); then
        autoup_rootfs
    fi
}

copy_to_tftp() {
    echo_c 32 "\nCopying files to a TFTP server using SCP protocol"
    scp -r \
        ${FIRMWARE_DIR}/output/images/rootfs.squashfs.* \
        ${FIRMWARE_DIR}/output/images/uImage.* \
        ${FIRMWARE_DIR}/output/images/openipc.*.tgz \
        ${TFTP_STORAGE}

    if [ -f "${FIRMWARE_DIR}/output/images/autoupdate-kernel.img" ] ; then
        scp -r ${FIRMWARE_DIR}/output/images/autoupdate* ${TFTP_STORAGE}
    fi
}

select_device() {
    AVAILABLE_DEVICES=$(ls -1 ${BUILDER_DIR}/devices | grep '_')
    cmd="whiptail --title \"Available devices\" --menu \"Please select a device from the list below:\" 20 70 12"
    for p in $AVAILABLE_DEVICES; do cmd="${cmd} \"$p\" \"\""; done
    DEVICE=$(eval "${cmd} 3>&1 1>&2 2>&3")
    if [ $? != 0 ]; then
        echo_c 31 "Cancelled."
        exit 1
    fi
}

echo_c 37 "Experimental system for building OpenIPC firmware for known devices"
echo_c 30 "https://openipc.org/"
echo_c 30 "Version: ${VERSION}"

while [ -z "${DEVICE}" ]; do select_device; done

echo_c 31 "\nStarting a device for ${DEVICE}"
tree -C ${BUILDER_DIR}/devices/${DEVICE}

sleep 3

echo_c 33 "\nUpdating Builder"
git pull

rm -rf openipc  # Weed work with this command
if [ ! -d "$FIRMWARE_DIR" ]; then
    echo_c 33 "\nDownloading Firmware"
    git clone --depth=1 https://github.com/OpenIPC/firmware.git "$FIRMWARE_DIR"
    cd "$FIRMWARE_DIR"
else
    echo_c 33 "\nUpdating Firmware"
    cd "$FIRMWARE_DIR"
    # git reset HEAD --hard
    # git pull --rebase
fi

echo_c 33 "\nCopying device files"
cp -afv ${BUILDER_DIR}/devices/${DEVICE}/*  ${FIRMWARE_DIR}

echo_c 33 "\nBuilding the device"
make BOARD=${DEVICE} all

copy_to_archive
# copy_to_tftp
echo_c 35 "\nDone"
cd "$BUILDER_DIR"
