#!/bin/sh
MMC_DEV="mmcblk0"
IPAM_TYPE=$(qiba-spi-get-production-info.sh -b)
if [ "${IPAM_TYPE}" == "10" ]; then
    MMC_DEV="mmcblk1"
fi

mount_data_partition()
{
    if ! mount /dev/${MMC_DEV}p4 /mnt/data; then
        echo "Warning cannot mount data partition, using shadow partition"
        export QIBA_UCI_DEVICE="/mnt/shadow"
        if ! mount -o remount,rw /mnt/shadow/ ; then
            echo "Warning cannot mount the shadow area read-write !"
            return 1
        fi
    else
        echo "Existing partion /dev/${MMC_DEV}p4 mounted on /mnt/data" 
        export QIBA_UCI_DEVICE="/mnt/data"
    fi
}
create_data_partition()
{
    newstart=$(($(cat /sys/block/${MMC_DEV}/${MMC_DEV}p3/start)+$(cat /sys/block/${MMC_DEV}/${MMC_DEV}p3/size)))
    newend=$(($(cat /sys/block/${MMC_DEV}/size)-8))
    if [ "$newend" -gt "$newstart" ]
    then
        echo "Found extra space on SD card creating data partition"
        if ! parted -s /dev/${MMC_DEV} unit s mkpart primary ext2 $newstart $newend
        then
            echo "Cannot create new data partion"
            return 1
        fi
        echo "Formatting data partition ..."
        if ! mkfs.ext4 -F -i 4096 /dev/${MMC_DEV}p4 >/dev/null
        then
            error_exit "cannot format data partition"
            return 1
        fi
        echo "Mounintg new data partition"
        mount_data_partition
    else
        echo "No space found for a new data partion, using shadow partition"
        export QIBA_UCI_DEVICE="/mnt/shadow"
        if ! mount -o remount,rw /mnt/shadow/ ; then
            echo "Warning cannot mount the shadow area read-write !"
            return 1
        fi
    fi
}
redo_data_partition()
{
    datastart=$(cat /sys/block/${MMC_DEV}/${MMC_DEV}p4/start)
    dataend=$(($(cat /sys/block/${MMC_DEV}/size)-8))

    echo "Removing existing data partion"
    if ! parted /dev/${MMC_DEV} rm 4
    then
        echo "Cannot remove old data partion, aborting"
        return 1
    fi
    echo "Creating data partion with remaining space on SD card"
    if ! parted -s /dev/${MMC_DEV} unit s mkpart primary ext2 $datastart $dataend
    then
        echo "Cannot create bigger data partion, aborting..."
        return 1	
    fi
    echo "Formatting data partition ..."
    if ! mkfs.ext4 -F -i 4096 /dev/${MMC_DEV}p4 >/dev/null
    then
        error_exit "cannot format data partition"
        return 1
    fi
}
check_data_partition()
{

    start=$(cat /sys/block/${MMC_DEV}/${MMC_DEV}p4/start)
end=$(($start+$(cat /sys/block/${MMC_DEV}/${MMC_DEV}p4/size)))
newend=$(($(cat /sys/block/${MMC_DEV}/size)-8))

if [ "$newend" -gt "$end" ]
then
    echo "Found extra space on SD card expanding data partition"
    if umount /mnt/data; then
        echo "Removing existing data partion"
        if ! parted /dev/${MMC_DEV} rm 4
        then
            echo "Cannot remove old data partion, aborting"
            mount_data_partition
        fi
        echo "Creating data partion with remaining space on SD card"
        if ! parted -s /dev/${MMC_DEV} unit s mkpart primary ext2 $start $newend
        then
            echo "Cannot create bigger data partion, aborting..."
            mount_data_partition
        fi
        echo "Resizing file system on data partition"
        if ! resize2fs -f /dev/${MMC_DEV}p4
        then
            echo "Expanding /dev/${MMC_DEV}p4 failed."
        fi
        echo "Mounting new data partition"
        mount_data_partition
    else
        echo "umount /dev/${MMC_DEV}p4 failed, aborting partion expand."
    fi
else
    echo "Existing data partion already uses all the SD card"
fi
}

echo "Setting up configuration ..."

if ! grep -qs /mnt/data /proc/mounts; then
    if ! ls /dev/${MMC_DEV}p4
    then
        echo "Cannot find SD card data partition ..."
        create_data_partition
    else
        echo "Data partition did not mount properly, reformatting it over an existing one ..."
        redo_data_partition
        mount_data_partition
    fi
else
    export QIBA_UCI_DEVICE="/mnt/data"
    check_data_partition
fi

if [ ! -d $QIBA_UCI_DEVICE/local ]; then
    mkdir $QIBA_UCI_DEVICE/local
fi

if [ ! -d /barix/local ]; then
    ln -sf $QIBA_UCI_DEVICE/local/ /barix/local
fi

if [ ! -d /barix/local/etc ]; then
    mkdir /barix/local/etc
fi

# Install default configuration if the current ones dont exist
if [ -f /usr/bin/barix-install-configs.sh ]; then
    /usr/bin/barix-install-configs.sh
fi

if [ ! -d /barix/local/app-data ]; then
    mkdir /barix/local/app-data
fi

echo "Configuration setup done."

exit 0
