#!/usr/bin/env bash
# wslu - Windows 10 linux Subsystem Utility
# Component of Windows 10 linux Subsystem Utility
# <https://github.com/wslutilities/wslu>
# Copyright (C) 2019 Patrick Wu
#
# 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/>.

# Version
wslu_version=2.0.0

# Speed up script by not using unicode.
LC_ALL=C
LANG=C

# force bash to not showing code manually.
set +x

# checking interopability
#cat /proc/sys/fs/binfmt_misc/WSLInterop | grep enabled >/dev/null || (echo "WSL Interopability is disabled. Please enable it before using WSL."; exit 1)

# variables
## color
black=`echo -e '\e[30m'`
red=`echo -e '\e[31m'`
green=`echo -e '\e[32m'`
brown=`echo -e '\e[33m'`
blue=`echo -e '\e[34m'`
purple=`echo -e '\e[35m'`
cyan=`echo -e '\e[36m'`
yellow=`echo -e '\e[1;33m'`
white=`echo -e '\e[1;37m'`
dark_gray=`echo -e '\e[1;30m'`
light_red=`echo -e '\e[1;31m'`
light_green=`echo -e '\e[1;32m'`
light_blue=`echo -e '\e[1;34m'`
light_purple=`echo -e '\e[1;35m'`
light_cyan=`echo -e '\e[1;36m'`
light_gray=`echo -e '\e[37m'`
orange=`echo -e '\e[38;5;202m'`
light_orange=`echo -e '\e[38;5;214m'`
bold=`echo -e '\033[1m'`
reset=`echo -e '\033(B\033[m'`

## indicator
info="${green}[info]${reset}"
error="${red}[error]${reset}"
warn="${orange}[warn]${reset}"
debug="${orange}${bold}[debug]${reset}"

# functions

function help {
	echo -e "`basename "$1"` - Part of wslu, a collection of utilities for Windows 10 Windows Subsystem for Linux
Usage: $2

For more help for `basename "$1"`, visit the following site: https://github.com/wslutilities/wslu/wiki/`basename "$1"`"
}

function double_dash_p {
	echo "$(echo $@ | sed -e 's|\\|\\\\|g')"
}

function interop_prefix {
	if [ -f /etc/wsl.conf ]; then
		tmp=$(awk -F '=' '/root/ {print $2}' /etc/wsl.conf)
		if [ "$tmp" == "" ]; then
			echo "/mnt/"
		else
			echo $tmp
		fi
	else
		echo "/mnt/"
	fi
}

function winps_exec {
	$(interop_prefix)c/Windows/System32/WindowsPowerShell/v1.0/powershell.exe -NoProfile -NonInteractive -Command $@
}

# when --debug, debug.
if [ "$1" == "--debug" ]; then
	echo "${debug}Debug Mode Enabled."
	shift
	set -x
fi

# basic distro detection
distro="$(cat /etc/os-release | head -n1 | sed -e 's/NAME=\"//g')"
case $distro in
    *WLinux*) distro="wlinux";;
    Ubuntu*) distro="ubuntu";;
    *Debian*) distro="debian";;
    *Kali*) distro="kali";;
    openSUSE*) distro="opensuse";;
    SLES*) distro="sles";;
    Alpine*) distro="alpine";;
    Arch*) distro="archlinux";;
    Scientific*) distro="scilinux";;
    *Fedora*) distro="fedora";;
	*Generic*) [ "fedora" == "$(cat /etc/os-release | grep -e "LIKE=" | sed -e 's/ID_LIKE=//g')" ] && distro="fedora" || distro="unknown";;
    *) distro="unknown";;
esac
version="28"

cname=""
iconpath="$(double_dash_p $(wslvar -s USERPROFILE))\\wslu\\wsl.ico"
is_icon=0
is_gui=0
customname=""
customenv=""

help_short="wslusc (--env [PATH]|--name [NAME]|--icon [ICO FILE]|--gui|--help|--version) [COMMAND]"

while [ "$1" != "" ]; do
	case "$1" in
		-i|--icon)shift;is_icon=1;iconpath=$1;shift;;
		-n|--name)shift;customname=$1;shift;;
		-e|--env)shift;customenv=$1;shift;;
		-g|--gui)is_gui=1;shift;;
		-h|--help) help $0 "$help_short"; exit;;
		-v|--version) echo "wslu v$wslu_version; wslusc v$version"; exit;;
		*) cname=$@;break;;
	esac
done
if [[ "$cname" != "" ]]; then
	tpath=$(double_dash_p $(wslvar -s TMP))
	dpath=$(wslpath $(wslvar -l Desktop))
	script_location="$(wslpath $(wslvar -s USERPROFILE))/wslu"
	localfile_path="/usr/share/wslu"
	script_location_win="$(double_dash_p $(wslvar -s USERPROFILE))\\wslu"
	
	new_cname=$(basename $(echo "$cname" | awk '{print $1}'))
	if [[ "$customname" != "" ]]; then
		new_cname=$customname
	fi
	
	# Check default icon location
	if [[ ! -f $script_location/wsl.ico ]]; then
		echo "${warn} Default wslusc icon \"wsl.ico\" not found in Windows directory. Copying right now..."
		[[ -d $script_location ]] || mkdir $script_location
		if [[ $localfile_path/wsl.ico ]]; then
			cp $localfile_path/wsl.ico $script_location
			echo "${info} Default wslusc icon \"wsl.ico\" copied. Located at $script_location."
		else
			echo "${error} runHidden.vbs not found. Failed to copy."
			exit 30
		fi
	fi
	# Check presence of runHidden.vbs 
	if [[ ! -f $script_location/runHidden.vbs ]]; then
		echo "${warn} runHidden.vbs not found in Windows directory. Copying right now..."
		[[ -d $script_location ]] || mkdir $script_location
		if [[ -f $localfile_path/runHidden.vbs ]]; then
			cp $localfile_path/runHidden.vbs $script_location
			echo "${info} runHidden.vbs copied. Located at $script_location."
		else
			echo "${error} runHidden.vbs not found. Failed to copy."
			exit 30
		fi
	fi

	if [[ "$is_icon" == "1" ]]; then
		icon_filename="$(basename $iconpath)"
		ext="${iconpath##*.}"

		if [[ ! -f $iconpath ]]; then
			iconpath="$(double_dash_p $(wslvar -s USERPROFILE))\\wslu\\wsl.ico"
			echo "${warn} Icon not found. Reset to default icon..."
		else
			echo "${info} You choose to use custom icon: $iconpath. Processing..."
			cp $iconpath $script_location
		
			if [[ "$ext" != "ico" ]]; then
				if [[ "$ext" == "svg" ]] || [[ "$ext" == "png" ]]; then
					if ! type convert > /dev/null 2>&1; then
						echo "The 'convert' command is needed for converting the icon."
						if [ -x /usr/lib/command-not-found ]; then
							echo " It can be installed with:" >&2
							echo "" >&2
							/usr/lib/command-not-found convert 2>&1 | egrep -v '(not found|^$)' >&2
						else
							echo "It can usally be found in the imagemagick package, please install it."
						fi
						exit 22
					fi
					echo "${info} Converting $ext icon to ico..."
					convert "$script_location/$icon_filename" -resize 256X256 "$script_location/${icon_filename%.$ext}.ico"
					icon_filename="${icon_filename%.$ext}.ico"
				else
					echo "${error} wslusc only support creating shortcut using .png/.svg/.ico icon. Aborted."
					exit 22
				fi
			fi
			iconpath="$script_location_win\\$icon_filename"
		fi
	fi
	
	if [[ "$customenv" != "" ]]; then
		echo "${info} the following custom variable/command will be applied: $customenv"
	fi

	if [[ "$is_gui" == "1" ]]; then
		winps_exec "Import-Module 'C:\\WINDOWS\\system32\\WindowsPowerShell\\v1.0\\Modules\\Microsoft.PowerShell.Utility\\Microsoft.PowerShell.Utility.psd1';\$s=(New-Object -COM WScript.Shell).CreateShortcut('$tpath\\$new_cname.lnk');\$s.TargetPath='C:\\Windows\\System32\\wscript.exe';\$s.Arguments='$script_location_win\\runHidden.vbs bash.exe -c \"cd ~; export DISPLAY=:0; $customenv $cname\"';\$s.IconLocation='$iconpath';\$s.Save();"
	else
		winps_exec "Import-Module 'C:\\WINDOWS\\system32\\WindowsPowerShell\\v1.0\\Modules\\Microsoft.PowerShell.Utility\\Microsoft.PowerShell.Utility.psd1';\$s=(New-Object -COM WScript.Shell).CreateShortcut('$tpath\\$new_cname.lnk');\$s.TargetPath='C:\\Windows\\System32\\bash.exe';\$s.Arguments='-c \"cd ~; $customenv $cname\"';\$s.IconLocation='$iconpath';\$s.Save();"
	fi
	tpath="$(wslpath $(wslvar -s TMP))/$new_cname.lnk"
	mv "$tpath" "$dpath"
	echo "${info} Create shortcut ${new_cname}.lnk successful"
else
	echo "${error}No input, aborting"
	exit 21
fi
