#!/usr/bin/env bash

set -e

# ------------------------------------------------------------------------------
declare -A devnode=(            \
    [rootfs.a]=/dev/mmcblk1p1   \
    [data.a]=/dev/mmcblk1p2     \
    [rootfs.b]=/dev/mmcblk1p3   \
    [data.b]=/dev/mmcblk1p4     \
)

# ------------------------------------------------------------------------------
function show-rauc-env() {
    cat << EOF
RAUC_SYSTEM_COMPATIBLE         : ${RAUC_SYSTEM_COMPATIBLE}
RAUC_SYSTEM_VARIANT            : ${RAUC_SYSTEM_VARIANT}
RAUC_SLOT_NAME                 : ${RAUC_SLOT_NAME}
RAUC_SLOT_STATE                : ${RAUC_SLOT_STATE}
RAUC_SLOT_CLASS                : ${RAUC_SLOT_CLASS}
RAUC_SLOT_TYPE                 : ${RAUC_SLOT_TYPE}
RAUC_SLOT_DEVICE               : ${RAUC_SLOT_DEVICE}
RAUC_SLOT_BOOTNAME             : ${RAUC_SLOT_BOOTNAME}
RAUC_SLOT_PARENT               : ${RAUC_SLOT_PARENT}
RAUC_SLOT_MOUNT_POINT          : ${RAUC_SLOT_MOUNT_POINT}
RAUC_IMAGE_NAME                : ${RAUC_IMAGE_NAME}
RAUC_IMAGE_SIZE                : ${RAUC_IMAGE_SIZE}
RAUC_IMAGE_DIGEST              : ${RAUC_IMAGE_DIGEST}
RAUC_IMAGE_CLASS               : ${RAUC_IMAGE_CLASS}
RAUC_MOUNT_PREFIX              : ${RAUC_MOUNT_PREFIX}
RAUC_BOOT_PARTITION_ACTIVATING : ${RAUC_BOOT_PARTITION_ACTIVATING}
RAUC_BOOT_PARTITION_START      : ${RAUC_BOOT_PARTITION_START}
RAUC_BOOT_PARTITION_SIZE       : ${RAUC_BOOT_PARTITION_SIZE}
EOF
}

# ------------------------------------------------------------------------------
function update-label() {
    local label=${RAUC_SLOT_NAME}

    case ${label} in
        rootfs.a|rootfs.b) tune2fs -L ${label} ${devnode[${label}]} ;;
        *)
            echo "Invalid slot name ${label}";
            exit 1 ;;
    esac
}

# ------------------------------------------------------------------------------
function migrate-data() {(
    case ${RAUC_SLOT_NAME} in
        rootfs.a) local src=data.b dst=data.a ;;
        rootfs.b) local src=data.a dst=data.b ;;
        *)
            echo "Invalid slot name ${RAUC_SLOT_NAME}";
            exit 1 ;;
    esac

    local device

    device=${devnode[${dst}]}
    echo "Formatting ${dst} destination device ${device} ..."
    mkfs.ext4 -t ext4 -I 256 -L ${dst} ${device}

    cd ${RAUC_MOUNT_PREFIX}

    echo "Mounting destination device ${device} -> ${dst} ..."
    mkdir -p ${dst}
    mount ${device} ${dst}

    device=${devnode[${src}]}
    echo "Mounting source device ${device} -> ${src} ..."
    mkdir -p ${src}
    mount ${device} ${src}

    echo "Copying yokis data if they exist ${src} -> ${dst}"
    mkdir -p ${dst}/./upper/etc/yokis
    if [ -z "$(ls -A ${src}/./upper/etc/yokis)" ]; then
        echo "Repo Empty"
    else
        cp -ra ${src}/./upper/etc/yokis/* ${dst}/./upper/etc/yokis/
    fi

    echo "Copying certificates data if they exist ${src} -> ${dst}"
    mkdir -p ${dst}/./upper/etc/ssl/certs/mqtt
    if [ -z "$(ls -A ${src}/./upper/etc/ssl/certs/mqtt)" ]; then
        echo "Repo Empty"
    else
        cp -ra ${src}/./upper/etc/ssl/certs/mqtt/* ${dst}/./upper/etc/ssl/certs/mqtt/
    fi    

    echo "Copying networking data if they exist ${src} -> ${dst}"
    mkdir -p ${dst}/./upper/var/lib/connman
    if [ -z "$(ls -A ${src}/./upper/var/lib/connman/wifi_*)" ]; then
        echo "Folder Empty"
    else
        cp -ra ${src}/./upper/var/lib/connman/wifi_* ${dst}/./upper/var/lib/connman/
    fi  
    if [ -z "$(ls -A ${src}/./upper/var/lib/connman/settings)" ]; then
        echo "Folder Empty"
    else
        cp -ra ${src}/./upper/var/lib/connman/settings ${dst}/./upper/var/lib/connman/
    fi  

    echo "Copying data if they exist ${src} -> ${dst}"     
    mkdir -p ${dst}/./upper/etc        
    test -f ${src}/./upper/etc/shadow && cp -ra ${src}/./upper/etc/shadow ${dst}/./upper/etc/
    test -f ${src}/./upper/etc/passwd && cp -ra ${src}/./upper/etc/passwd ${dst}/./upper/etc/

    sync
    umount ${src} ${dst}
    cd -
)}

function required_hooks() {
    # fw_setenv commands could be remove after there is no more GATE-UP in version < 0.4.0
    echo "Update u-boot var to support IS_UPDATE_OK"  
    fw_setenv select_slot_a 'if test ${BOOT_a_LEFT} -gt 0; then echo "Found valid 'a' slot (${BOOT_a_LEFT} remaining attempts)!"; env set dev 2; env set part 1; env set datapart 2; env set slot a; if test ${IS_UPDATE_OK} -eq 0; then setexpr BOOT_a_LEFT ${BOOT_a_LEFT} - 1; fi; else echo "Slot 'a' is invalid (No more remaining attempts)!"; fi'


    fw_setenv select_slot_b 'if test ${BOOT_b_LEFT} -gt 0; then echo "Found valid 'b' slot (${BOOT_b_LEFT} remaining attempts)!"; env set dev 2; env set part 3; env set datapart 4; env set slot b; if test ${IS_UPDATE_OK} -eq 0; then setexpr BOOT_b_LEFT ${BOOT_b_LEFT} - 1; fi; else echo "Slot 'b' is invalid (No more remaining attempts)!"; fi'

    fw_setenv IS_UPDATE_OK 0
    fw_setenv bootdelay 0
    fw_setenv set_bootargs 'env set bootargs console=ttymxc1,115200 root=/dev/mmcblk1p${part} rootrw=/dev/mmcblk1p${datapart} rootwait quiet rauc.slot=${slot}'

    PRODUCTVERS=`dd if=/sys/bus/nvmem/devices/imx-ocotp0/nvmem of=/dev/stdout bs=4 count=1 skip=70 | hexdump -v -e '2/4 "%04x " "\n"'`
    echo "Let's test producteurversionatgejkiodfjisdfij"
    if [[ "${PRODUCTVERS}" == *193* ]]; then
	echo "set led to 125"
	fw_setenv set_led_on 'gpio set 125'
    else
	echo "set led to 124"
	fw_setenv set_led_on 'gpio set 124'
    fi
    fw_setenv bootcmd 'run set_led_on; run select_slot; run load_and_boot_slot;'
}
 
# ------------------------------------------------------------------------------
case "$1" in
    slot-post-install)
        # only rootfs needs to be handled
        test "${RAUC_SLOT_CLASS}" = "rootfs" || exit 0
        update-label
        migrate-data
	# required_hooks
        ;;
    *)
        exit 1
        ;;
esac

exit 0
