#!/bin/bash


DEVICE='<device oznaceni pro adb, viz `adb devices`>'                                       # FIXME: uprav podle sebe

BACKUP_NAME='<jmeno adresare>'                                                              # FIXME: uprav podle sebe
BACKUP_DIR_PHONE="/data/media/0/TWRP/BACKUPS/${DEVICE}/${BACKUP_NAME}"
BACKUP_DIR_LOCAL="${HOME}/telefon/zaloha/${BACKUP_NAME}"                                    # FIXME: uprav podle sebe
BACKUP_DIR_SD="${BACKUP_DIR_LOCAL}/sd"
SD_DIRS=$(echo /sdcard/{Android,data,DCIM,Download,Pictures,Ringtones,Tickmate,Walps,ztd})  # FIXME: uprav podle sebe
ADB_SYNC_LOG="${BACKUP_DIR_LOCAL}/adb-sync.log"
DATA_BACKUP="${BACKUP_DIR_LOCAL}/data.ext4.win"
CONTACTS_DB_DATA='/data/com.android.providers.contacts/databases/contacts2.db'
CONTACTS_DIR_LOCAL="${BACKUP_DIR_LOCAL}/contacts"
LOG_FILE="${BACKUP_DIR_LOCAL}/zaloha.log"

# NOTE: Sadly, adb get-state can't be trusted to tell whether the phone is in recovery,
#       some devices still report 'device' even though they are in recovery.
#       So I'm using have_twrp() as seen below for that instead.
function device_state()
{
	adb -s "${DEVICE}" get-state
}

function have_twrp
{
	# Using "echo $?" trick, because adb shell won't relay process exit status
	[[ "$(adb -s "${DEVICE}" shell 'which twrp &> /dev/null; echo -n $?')" = "0" ]] && return 0 || return 1
}


exec &> >(tee -a "$LOG_FILE")

echo 'Starting adb...'
sudo adb start-server

echo -n 'Checking device...'
if [[ "$(device_state)" = "device" ]]
then
	echo ' ready'
else
	echo ' not ready'
	exit 2
fi

echo -n 'Syncing sdcard data...'
adb-sync -s "${DEVICE}" -R $SD_DIRS "${BACKUP_DIR_SD}" &> "${ADB_SYNC_LOG}" || exit 1
echo ' ok'

echo -n 'Rebooting to recovery...'
adb -s "${DEVICE}" reboot recovery
# NOTE: the wait-for-device command didn't work
sleep 30
if have_twrp
then
	echo ' ok'
else
	echo ' fail (not in recovery or not a TWRP recovery)'
	exit 3
fi

# Create TWRP backup
echo 'Creating TWRP backup...'
adb -s "${DEVICE}" shell twrp backup SDRB "${BACKUP_NAME}" || exit 1

# Download & verify the backup
echo 'Downloading backup files...'
adb -s "${DEVICE}" pull -p "${BACKUP_DIR_PHONE}" "${BACKUP_DIR_LOCAL}"
echo 'Verifying backup files...'
pushd "$BACKUP_DIR_LOCAL" &> /dev/null
md5sum -c *.md5 || exit 1
popd &> /dev/null

# Remove backup
echo 'Removing TWRP backup...'
adb -s "${DEVICE}" shell rm -rf "${BACKUP_DIR_PHONE}"

echo 'Rebooting...'
adb -s "${DEVICE}" reboot

# Export contacts
echo 'Exporting contacts...'
[[ -d "${CONTACTS_DIR_LOCAL}" ]] || mkdir -p "${CONTACTS_DIR_LOCAL}"
tar -xOvf "${DATA_BACKUP}" "${CONTACTS_DB_DATA}" > "${CONTACTS_DIR_LOCAL}/contacts2.db"
dump-contacts2db "${CONTACTS_DIR_LOCAL}/contacts2.db" > "${CONTACTS_DIR_LOCAL}/contacts2.vcf"
