#!/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="09"

##########   CAUTION   ###########
## wslupath is a legacy cli for backward compatbility.
## Use it unless it is necessary.

style=1
reg_path=0
set_path=""

help_short="wslupath (-dOr) [-D|-A|-T|-S|-W|-s|-su|-H|-P|...NAME...]\nwslupath (-h|-v|-R)"

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

function general_converter {
	target="$@"

	if [[ $target =~ ^[A-Z]:(\\[^:\\]+)*(\\)?$ ]]; then
		p=$(wslpath -u "${target}")
	elif [[ $target =~ ^$(interop_prefix)[A-Za-z](/[^/]+)*(/)?$ ]]; then
		p=$(wslpath -w "${target}")
	else
		echo "${error} No proper path form detected: $@."
		exit 20
	fi
	echo $p
}

function style_path {
	case $style in
		1)p="$(general_converter $@)";;
		2)p="$@";;
		3)p="$(path_double_dash $@)";;
	esac
	echo $p
}

if [[ $# -eq 0 ]]; then
	echo -e "$help_short"
	exit 20
else
	for args; do
		case $args in
			#styles
			-r|--reg-data)reg_path=1;;
			-O|--original)style=2;;
			-d|--doubledash-dir)style=3;;
			## system location

			-D|--desktop)
			set_path="$(style_path $(wslvar -l 'Desktop'))"
			break;;
			-A|--appdata)
			set_path="$(style_path $(wslvar -s APPDATA))"
			break;;
			-T|--temp)
			set_path="$(style_path $(wslvar -s TMP))"
			break;;
			-S|--sysdir)
			set_path="$(style_path $(wslvar -s windir)\\System32)"
			break;;
			-W|--windir)
			set_path="$(style_path $(wslvar -s windir))"
			break;;
			-s|--start-menu)
			set_path="$(style_path $(wslvar -l 'Start Menu'))"
			break;;
			-su|--startup)
			set_path="$(style_path $(wslvar -l 'Startup'))"
			break;;
			-H|--home)
			set_path="$(style_path $(wslvar HOMEDRIVE)$(wslvar HOMEPATH))"
			break;;
			-P|--program-files)
			set_path="$(style_path $(wslvar -s ProgramFiles))"
			break;;
			-h|--help) help $0 "$help_short"; exit;;
			-v|--version)echo "wslu v$wslu_version; wslupath v$version"; exit;;
			-R|--avail-reg) echo "Available registery input:"
			wslvar -L
			exit;;
			*)
			if [[ "$reg_path" == "1" ]]; then
				set_path="$(style_path $(wslvar -l $args))"
			else
				set_path="$(style_path $args)"
			fi
			break;;
		esac
	done
fi

if [[ "$set_path" == "" ]]; then
	echo "${error}No path input. Aborted."
	exit 21
else
	echo $set_path
fi
