#!/bin/bash

# Copyright (C) 2016 Paul Kocialkowski <contact@paulk.fr>
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program.  If not, see <http://www.gnu.org/licenses/>.

BUILD_SYSTEM="libreboot"

SOURCES="sources"
TAR_XZ="tar.xz"

usage() {
	printf "$executable [action] [sources path] (extract path)\n" >&2

	printf "\nActions:\n" >&2
	printf "  extract - Extract build system sources\n" >&2
	printf "  copy - Copy projects sources\n" >&2
	printf "  prepare - Extract and copy sources\n" >&2

	printf "\n  When no extract path is provided, sources are extracted in the current\n"
	printf "  directory.\n"
}

extract() {
	local sources_path=$1
	local extract_path=$2

	local build_system_path
	local archive

	build_system_path="$extract_path/$BUILD_SYSTEM"

	if [ -d "$build_system_path" ]
	then
		return
	fi

	archive=$( find $sources_path -name "$BUILD_SYSTEM-sources.$TAR_XZ" || true )
	if [ -z "$archive" ]
	then
		printf "Finding $BUILD_SYSTEM sources archive failed!\n" >&2
		usage
		exit 1
	fi

	tar -xf "$archive" -ps -C "$extract_path"

	printf "\nExtracted $BUILD_SYSTEM sources from $sources_path to $extract_path\n"
}

copy() {
	local sources_path=$1
	local extract_path=$2

	local build_system_path
	local build_system_sources_path
	local archives
	local file

	build_system_path="$extract_path/$BUILD_SYSTEM"
	build_system_sources_path="$build_system_path/$SOURCES"

	if ! [ -d "$build_system_path" ]
	then
		return
	fi

	mkdir -p "$build_system_path/$SOURCES"

	( find "$sources_path" -type f -not -name "$BUILD_SYSTEM*" || true ) | while read file
	do
		cp "$file" "$build_system_sources_path"
	done

	printf "\nCopied $BUILD_SYSTEM sources from $sources_path to $extract_path\n"
}

requirements() {
	local requirement
	local requirement_path

	for requirement in "$@"
	do
		requirement_path=$( which "$requirement" || true )

		if [ -z "$requirement_path" ]
		then
			printf "Missing requirement: $requirement\n" >&2
			exit 1
		fi
	done
}

setup() {
	root=$( realpath "$( dirname "$0" )" )
	executable=$( basename "$0" )
}

libreboot_sources() {
	local action=$1
	local sources_path=$2
	local extract_path=$3

	set -e

	setup "$@"

	if [ -z "$sources_path" ]
	then
		usage
		exit 1
	fi

	if [ -z "$extract_path" ]
	then
		extract_path=$root
	fi

	requirements "tar" "sha256sum" "gpg"

	case $action in
		"extract")
			extract "$sources_path" "$extract_path"
			;;
		"copy")
			copy "$sources_path" "$extract_path"
			;;
		"prepare")
			extract "$sources_path" "$extract_path"
			copy "$sources_path" "$extract_path"
			;;
	esac
}

libreboot_sources "$@"
