#!/bin/bash
. $GVM_ROOT/scripts/functions

download_source() {
	GO_CACHE_PATH=$GVM_ROOT/archive/go
	GO_SOURCE_URL=https://go.googlecode.com/hg/
	[ -d $GO_CACHE_PATH ] && return
	echo "Downloading Go source..."
	hg clone $GO_SOURCE_URL $GO_CACHE_PATH >> $GVM_ROOT/logs/go-download.log  2>&1 ||
		display_error "Couldn't download Go source"
}

check_tag() {
	version=`hg tags -R $GO_CACHE_PATH | awk '{print $1}' | sort | grep $VERSION | head -n 1 | grep $VERSION`
}

update_source() {
	echo "Updating Go source..."
	hg pull -R $GO_CACHE_PATH >> $GVM_ROOT/logs/go-download.log 2>&1 || 
		display_error "Couldn't get latest Go version info"
}

copy_source() {
	hg clone -u $version $GO_CACHE_PATH $GO_INSTALL_ROOT >> $GVM_ROOT/logs/go-$version-install.log 2>&1 ||
		display_error "Couldn't copy source to target folder"
}


compile_go() {
	echo " * Compiling..."
	unset GOARCH && unset GOOS && unset GOPATH && unset GOBIN && unset GOROOT &&
	export GOBIN=$GO_INSTALL_ROOT/bin && 
	export PATH=$GOBIN:$PATH && 
	export GOROOT=$GO_INSTALL_ROOT &&
	cd $GO_INSTALL_ROOT/src && ./all.bash &> $GVM_ROOT/logs/go-$version-compile.log || 
		(rm -rf $GO_INSTALL_ROOT && display_error "Failed to compile")
}

create_enviroment() {
	new_env_file=$GVM_ROOT/environments/$version
	echo "export GVM_ROOT; GVM_ROOT=\"$GVM_ROOT\"" > $new_env_file
	echo "export gvm_go_name; gvm_go_name=\"$version\"" >> $new_env_file
	echo "export gvm_pkgset_name; gvm_pkgset_name=\"global\"" >> $new_env_file
	echo "export GOROOT; GOROOT=\"\$GVM_ROOT/gos/$version\"" >> $new_env_file
	echo "export GOPATH; GOPATH=\"\$GVM_ROOT/pkgsets/$version/global\"" >> $new_env_file
	echo "export PATH; PATH=\"\$GVM_ROOT/pkgsets/$version/global/bin:\$GVM_ROOT/gos/$version/bin:\$GVM_ROOT/bin:\$PATH\"" >> $new_env_file
	. $GVM_ROOT/scripts/env/use
	gvm_use $version &> /dev/null
	gvm pkgset create global
	. $GVM_ROOT/scripts/env/pkgset-use
	gvm_pkgset_use global &> /dev/null
	unset GOPATH
}

install_go() {
	GO_INSTALL_ROOT=$GVM_ROOT/gos/$version
	trap 'rm -rf $GO_INSTALL_ROOT; display_error "Canceled!"' INT

	# Check for existing install
	[ -d $GO_INSTALL_ROOT ] && 
		display_error "Already installed!"

	echo "Installing $version..."

	# Create the global package set folder
	mkdir -p $GVM_ROOT/pkgsets/$version >> $GVM_ROOT/logs/go-$version-install.log 2>&1 || 
		display_error "Couldn't create global package set folder"

	copy_source
	compile_go
	create_enviroment
}

install_gpkg() {
	echo " * Installing gpkg..."
	goinstall github.com/moovweb/gvm/gpkg > /dev/null 2>&1
	if [[ $? -ne 0 ]]; then
		echo "Failed to install gpkg"
		return 1
	fi
}

install_gb() {
	if [[ "$version" == "release.r60.3" ]]; then
		echo " * Installing gb..."
		goinstall github.com/skelterjohn/go-gb/gb > /dev/null 2>&1
		if [[ $? -ne 0 ]]; then
			echo "Failed to install gb"
			return 1
		fi
	fi
}

install_goprotobuf() {
	if [[ "$version" == "release.r60.3" ]]; then
		echo " * Installing goprotobuf..."
		goinstall goprotobuf.googlecode.com/hg/proto > /dev/null 2>&1
		if [[ $? -ne 0 ]]; then
			echo "Failed to install goprotobuf"
			return 1
		fi
		cd $GVM_ROOT/gos/$version/src/pkg/goprotobuf.googlecode.com/hg/compiler
		make install > $GVM_ROOT/logs/$version-pb-compiler.log 2>&1
		if [[ $? -ne 0 ]]; then
			echo "Failed to install goprotobuf compiler"
			return 1
		fi
	fi
}

main() {
	VERSION=$1
	trap 'display_error "Canceled!"' INT
	# GREEN!
	tput sgr0
	tput setaf 2
	[ -z $VERSION ] && display_error "No version specified"
	download_source
	check_tag || (update_source && check_tag) || display_error "Unrecognized Go version"
	install_go
	install_gpkg
	install_gb
	install_goprotobuf
	cd $GO_INSTALL_ROOT && find . > manifest
	tput sgr0
}

main $@

