#!/bin/bash
#
# Copyright (c) 2021-2022 Amlogic, Inc. All rights reserved.
#
# SPDX-License-Identifier: MIT
#

# Build and upload document
publish_docoment() {
	REMOTE_DOC_PATH="ftp://platform:platform@10.68.11.163:2222/Documents/Ecosystem/RTOS/rtos-sdk/"

	find -type f | while read filename; do
		curl -s --ftp-create-dirs -T $filename $REMOTE_DOC_PATH/$filename
		if [ $? -ne 0 ]; then
			return 1
		fi
	done
}

[ -z "$OUTPUT_DIR" ] && OUTPUT_DIR=$PWD/output
LOCAL_PATH=$OUTPUT_DIR

BUILD_DATE=$(date +%F)
REMOTE_BASE=/data/shanghai/image/RTOS
if [[ "$SUBMIT_TYPE" == "daily" || "$SUBMIT_TYPE" == "release" ]]; then
	REMOTE_PATH=$REMOTE_BASE/$SUBMIT_TYPE/$BUILD_DATE
else
	REMOTE_PATH=$REMOTE_BASE/$SUBMIT_TYPE
fi
LATEST_PATH=$REMOTE_BASE/$SUBMIT_TYPE/latest

FIRMWARE_ACCOUNT=autobuild
FIRMWARE_SERVER=firmware.amlogic.com

make_image() {
	LOCAL_IMAGE_PATH=$LOCAL_PATH/$ARCH-$BOARD-$PRODUCT
	mkimage -A $ARCH -O u-boot -T standalone -C none -a 0x10000 -e 0x10000 -n rtos -d $LOCAL_IMAGE_PATH/images/freertos-signed.bin $LOCAL_IMAGE_PATH/images/rtos-uImage
}

publish_images() {
	LOCAL_IMAGE_PATH=$LOCAL_PATH/$ARCH-$BOARD-$PRODUCT
	REMOTE_IMAGE_PATH=$REMOTE_PATH/$ARCH-$BOARD-$PRODUCT
	echo "publish to $REMOTE_IMAGE_PATH"
	if [ -d $LOCAL_IMAGE_PATH ]; then
		ssh -n $FIRMWARE_ACCOUNT@$FIRMWARE_SERVER "mkdir -p $REMOTE_IMAGE_PATH"

		if [ $? -ne 0 ]; then
			echo "Failed to create remote image path! $REMOTE_IMAGE_PATH"
			exit 1
		else
			echo "Remote image path: $REMOTE_IMAGE_PATH"
		fi
		pushd $LOCAL_IMAGE_PATH >/dev/null
		scp images/* $FIRMWARE_ACCOUNT@$FIRMWARE_SERVER:$REMOTE_IMAGE_PATH
		popd >/dev/null
		echo "Images publish done."
	else
		echo "No local image path! $LOCAL_IMAGE_PATH"
	fi
}

post_publish_images() {
	ssh -n $FIRMWARE_ACCOUNT@$FIRMWARE_SERVER "mkdir -p $REMOTE_PATH"
	if [ $? -ne 0 ]; then
		echo "Failed to create remote image path! $REMOTE_PATH"
		exit 1
	else
		echo "Remote image path: $REMOTE_PATH"
	fi

	LOCAL_FILES="$LOCAL_PATH/build.log"
	[ -z "$MANIFEST" ] && MANIFEST="$OUTPUT_DIR/manifest.xml"
	[ -f $MANIFEST ] && LOCAL_FILES+=" $MANIFEST"
	[ -z "$JENKINS_TRIGGER" ] && JENKINS_TRIGGER="$OUTPUT_DIR/jenkins_trigger.txt"
	[ -f $JENKINS_TRIGGER ] && LOCAL_FILES+=" $JENKINS_TRIGGER"
	scp $LOCAL_FILES $FIRMWARE_ACCOUNT@$FIRMWARE_SERVER:$REMOTE_PATH

	ssh -n $FIRMWARE_ACCOUNT@$FIRMWARE_SERVER "rm -f $LATEST_PATH"
	ssh -n $FIRMWARE_ACCOUNT@$FIRMWARE_SERVER "ln -s $REMOTE_PATH $LATEST_PATH"
	echo "Post images publish done."
}

publish_packages() {
	LOCAL_PACKAGE_PATH=$LOCAL_PATH/packages/$CURRENT_PRODUCTS_DIR_NAME
	REMOTE_PACKAGE_PATH=$REMOTE_PATH/$CURRENT_PRODUCTS_DIR_NAME

	if [ -d $LOCAL_PACKAGE_PATH ]; then
		ssh -n $FIRMWARE_ACCOUNT@$FIRMWARE_SERVER "mkdir -p $REMOTE_PACKAGE_PATH"
		if [ $? -ne 0 ]; then
			echo "Failed to create remote package path! $REMOTE_PACKAGE_PATH"
			exit 1
		else
			echo "Remote package path: $REMOTE_PACKAGE_PATH"
		fi
		pushd $LOCAL_PACKAGE_PATH >/dev/null

		scp -r . $FIRMWARE_ACCOUNT@$FIRMWARE_SERVER:$REMOTE_PACKAGE_PATH
		popd >/dev/null
		echo "Packages publish done."
	else
		echo "No local package path! $LOCAL_PACKAGE_PATH"
	fi
}

post_publish_packages() {
	ssh -n $FIRMWARE_ACCOUNT@$FIRMWARE_SERVER "mkdir -p $REMOTE_PATH"
	if [ $? -ne 0 ]; then
		echo "Failed to create remote package path! $REMOTE_PATH"
		exit 1
	else
		echo "Remote package path: $REMOTE_PATH"
	fi
	LOCAL_FILES="$LOCAL_PATH/build.log $LOCAL_PATH/manifest.xml"
	scp $LOCAL_FILES $FIRMWARE_ACCOUNT@$FIRMWARE_SERVER:$REMOTE_PATH
	echo "Post packages publish done."
}

show_download_url() {
	WEB_PATH=`echo ${LATEST_PATH#*data}`
	DOWNLOAD_URL="http://$FIRMWARE_SERVER$WEB_PATH"
	echo "<Download Address> $DOWNLOAD_URL"
}
