#!/bin/bash

# Functions
function inst_out
{
	echo "[inst] $1"
}

function inst_fatal
{
	inst_out "FATAL : $1"
}

function inst_fail
{
	inst_fatal 'installation has failed'
}

# Welcome
inst_out 'Script begins'

# Check argument
if [ $# -lt 1 ]
then
	inst_fatal 'No script provided'
	inst_out 'Usage : inst <script> [user] [prompting:enable|disable] [target]'
	exit 1
fi

# Initialize variables
script=$1
user=$USER
prompting='enable'
target='/usr/local/bin/'

if [ $# -gt 1 ] && [ ! -z $2 ]
then
	user=$2
fi

if [ $# -gt 2 ] && [ ! -z $3 ]
then
	prompting=$3
fi

if [ $# -gt 3 ] && [ ! -z $4 ]
then
	target=$4
fi

# Check file existence
if [ ! -e $script ]
then
	inst_fatal "$script does not exist"
	exit 1
fi

# Prompt before installation
inst_out 'Ready for installation'
inst_out "script : $script"
inst_out "user : $user"
inst_out "target : $target"

if [ $prompting = 'enable' ]
then
	read -p 'Confirm installation ? [Y/n] > ' choice
else
	choice='Y'
fi

if [ ! -z $choice ] && [ "$choice" != 'Y' ]
then
	inst_out 'Cancel installation'
	exit 0
fi

# Start installing
inst_out 'Installation begins'

# Check if script executable
if [ -x $script ]
then
	inst_out 'Script already executable'
else
	if [ $USER != 'root' ]
	then
		inst_fatal "$script is not executable"
		inst_out 'to fix it :'
		inst_out "chmod u+x $script"
		inst_out 'or'
		inst_out "sudo $0 $script $user $target"
		exit 1
	else
		chmod u+x $script
	fi
fi

# Copy script
cp "$script" "$target$script"

if [ $? -ne 0 ]
then
	inst_fatal 'Something went wrong during copy'
	inst_out "command : cp $script $target$script"
	exit $?
fi

# Chown
if [ $USER = 'root' ]
then
	chown "$user:$user" "$target$script"
	if [ $? -ne 0 ]
	then
		inst_fatal 'Something went wrong during chown'
		inst_out "chown $user:$user $target$script"
		exit $?
	fi
fi

# Check if all right
output="$target$script"
owner_user=`stat --format '%U' $output`
owner_group=`stat --format '%G' $output`

if [ ! -e $output ]
then
	inst_fatal "$output does not exist"
	inst_fail
	exit 1
elif [ $owner_user != $user ]
then
	inst_fatal "$output owner user is not $user but $owner_user"
	inst_fail
	exit 1
elif [ $owner_group != $user ]
then
	inst_fatal "$output group is not $user but $owner_group"
	inst_fail
	exit 1
elif [ ! -x $output ]
then
	inst_fatal "$output is not executable"
	inst_out "fix : sudo chmod u+x $output"
	inst_fail
	exit 1
fi

# End
inst_out 'Script finished'
exit $?