#!/bin/bash

# Global variables
XS_SERVICE_API="https://get.0512.host/"
XS_VERSION="3.0.9"
XS_FILE_NAME="xs-cli-${XS_VERSION}.zip"

if [ -z "$XS_DIR" ]; then
	XS_DIR="$HOME/.xs"
	XS_DIR_RAW='$HOME/.xs'
else
	XS_DIR_RAW="$XS_DIR"
fi

# Local variables
xs_tmp_folder="${XS_DIR}/tmp/"
xs_zip_file="${xs_tmp_folder}/${XS_FILE_NAME}"
xs_zip_base_folder="${xs_tmp_folder}/xs-cli-${XS_VERSION}"
xs_ext_folder="${XS_DIR}/ext"
xs_etc_folder="${XS_DIR}/etc"
xs_var_folder="${XS_DIR}/var"
xs_archives_folder="${XS_DIR}/archives"
xs_config_file="${xs_etc_folder}/config"
xs_bash_profile="${HOME}/.bash_profile"
xs_profile="${HOME}/.profile"
xs_bashrc="${HOME}/.bashrc"
xs_zshrc="${ZDOTDIR:-${HOME}}/.zshrc"

xs_init_snippet=$(
	cat << EOF
#THIS MUST BE AT THE END OF THE FILE FOR XS TO WORK!!!
export XS_DIR="$XS_DIR_RAW"
[[ -s "${XS_DIR_RAW}/bin/xs-init.sh" ]] && source "${XS_DIR_RAW}/bin/xs-init.sh"
EOF
)

# OS specific support (must be 'true' or 'false').
cygwin=false
darwin=false
solaris=false
freebsd=false
linux=false
case "$(uname)" in
CYGWIN*) cygwin=true ;;
Darwin*) darwin=true ;;
SunOS*) solaris=true ;;
Linux*) linux=true ;;
FreeBSD*) freebsd=true ;;
esac

# infer platform
function infer_platform() {
	local kernel
	local machine

	kernel="$(uname -s)"
	machine="$(uname -m)"

	case $kernel in
	Linux)
		case $machine in
		i686) echo "LinuxX32" ;;
		x86_64) echo "LinuxX64" ;;
		armv6l) echo "LinuxARM32HF" ;;
		armv7l) echo "LinuxARM32HF" ;;
		armv8l) echo "LinuxARM32HF" ;;
		aarch64) echo "LinuxARM64" ;;
		*) echo "LinuxX64" ;;
		esac
		;;
	Darwin)
		case $machine in
		x86_64) echo "DarwinX64" ;;
		arm64)
			if [[ "$xs_rosetta2_compatible" == 'true' ]]; then
				echo "DarwinX64"
			else
				echo "DarwinARM64"
			fi
			;;
		*) echo "DarwinX64" ;;
		esac
		;;
	*) echo "$kernel" ;;
	esac
}

XS_PLATFORM="$(infer_platform | tr '[:upper:]' '[:lower:]')"

echo ''
echo '▒██   ██▒  ██████   ██████     ▄████▄   ██▓     ██▓   ▄▄▄█████▓ ▒█████   ▒█████   ██▓      ██████ '
echo '▒▒ █ █ ▒░▒██    ▒ ▒██    ▒    ▒██▀ ▀█  ▓██▒    ▓██▒   ▓  ██▒ ▓▒▒██▒  ██▒▒██▒  ██▒▓██▒    ▒██    ▒ '
echo '░░  █   ░░ ▓██▄   ░ ▓██▄      ▒▓█    ▄ ▒██░    ▒██▒   ▒ ▓██░ ▒░▒██░  ██▒▒██░  ██▒▒██░    ░ ▓██▄   '
echo ' ░ █ █ ▒   ▒   ██▒  ▒   ██▒   ▒▓▓▄ ▄██▒▒██░    ░██░   ░ ▓██▓ ░ ▒██   ██░▒██   ██░▒██░      ▒   ██▒'
echo '▒██▒ ▒██▒▒██████▒▒▒██████▒▒   ▒ ▓███▀ ░░██████▒░██░     ▒██▒ ░ ░ ████▓▒░░ ████▓▒░░██████▒▒██████▒▒'
echo '▒▒ ░ ░▓ ░▒ ▒▓▒ ▒ ░▒ ▒▓▒ ▒ ░   ░ ░▒ ▒  ░░ ▒░▓  ░░▓       ▒ ░░   ░ ▒░▒░▒░ ░ ▒░▒░▒░ ░ ▒░▓  ░▒ ▒▓▒ ▒ ░'
echo '░░   ░▒ ░░ ░▒  ░ ░░ ░▒  ░ ░     ░  ▒   ░ ░ ▒  ░ ▒ ░       ░      ░ ▒ ▒░   ░ ▒ ▒░ ░ ░ ▒  ░░ ░▒  ░ ░'
echo ' ░    ░  ░  ░  ░  ░  ░  ░     ░          ░ ░    ▒ ░     ░      ░ ░ ░ ▒  ░ ░ ░ ▒    ░ ░   ░  ░  ░  '
echo ' ░    ░        ░        ░     ░ ░          ░  ░ ░                  ░ ░      ░ ░      ░  ░      ░  '
echo '                              ░                                                                   '
echo '                                                                 '
echo ''
echo '本工具初衷为降低开发者在 Shell 中某些技术使用的门槛。请勿违规使用，否则不定期停用相关功能！'
echo '                                                                                    现在尝试安装 ...'
echo ''
echo '                                                                                   tonycody@qq.com'
echo ''

# Sanity checks

echo "正在查找已经安装的 XS'S Tools ..."
if [ -d "$XS_DIR" ]; then
	echo "找到已安装的 XS'S CLI Tools。"
	echo ""
	echo "======================================================================================================"
	echo " 您已经安装了 XS'S CLI Tools。"
	echo " XS'S Tools 安装在："
	echo ""
	echo "    ${XS_DIR}"
	echo ""
	echo " 如果您需要升级，请考虑运行以下程序。"
	echo ""
	echo "    $ xs update force"
	echo ""
	echo "======================================================================================================"
	echo ""
	exit 0
fi

echo "正在查找 unzip..."
if ! command -v unzip > /dev/null; then
	if command -v yum > /dev/null; then
		yum -y install unzip
	elif command -v apt > /dev/null; then
		apt-get update
		apt-get -y install unzip
	elif command -v apk > /dev/null; then
		apk add unzip
	else
		echo "没有找到。"
		echo "======================================================================================================"
		echo " 请使用包管理器在系统上安装 unzip。"
		echo ""
		echo " 安装 unzip 后重新执行安装命令。"
		echo "======================================================================================================"
		echo ""
		exit 1
	fi
fi

echo "正在查找 zip..."
if ! command -v zip > /dev/null; then
	if command -v yum > /dev/null; then
		yum -y install zip
	elif command -v apt > /dev/null; then
		apt-get update
		apt-get -y install zip
	elif command -v apk > /dev/null; then
		apk add zip
	else
		echo "没有找到。"
		echo "======================================================================================================"
		echo " 请使用包管理器在系统上安装 zip。"
		echo ""
		echo " 安装 zip 后重新执行安装命令。"
		echo "======================================================================================================"
		echo ""
		exit 1
	fi
fi

echo "正在查找 curl..."
if ! command -v curl > /dev/null; then
	if command -v yum > /dev/null; then
		yum -y install curl
	elif command -v apt > /dev/null; then
		apt-get update
		apt-get -y install curl
	elif command -v apk > /dev/null; then
		apk add curl
	else
		echo "没有找到。"
		echo ""
		echo "======================================================================================================"
		echo " 请使用包管理器在系统上安装 curl。"
		echo ""
		echo " 安装 curl 后重新执行安装命令。"
		echo "======================================================================================================"
		echo ""
		exit 1
	fi
fi

echo "正在查找 git..."
if ! command -v git > /dev/null; then
	if command -v yum > /dev/null; then
		yum -y install git
	elif command -v apt > /dev/null; then
		apt-get update
		apt-get -y install git
	elif command -v apk > /dev/null; then
		apk add git
	else
		echo "没有找到。"
		echo ""
		echo "======================================================================================================"
		echo " 请使用包管理器在系统上安装 git。"
		echo ""
		echo " 安装 git 后重新执行安装命令。"
		echo "======================================================================================================"
		echo ""
		exit 1
	fi
fi

if [[ "$solaris" == true ]]; then
	echo "正在查找 gsed..."
	if [ -z $(which gsed) ]; then
		echo "没有找到。"
		echo ""
		echo "======================================================================================================"
		echo " 请在您的 solaris 系统上安装 gsed。"
		echo ""
		echo " XS'S tools 广泛使用 gsed。"
		echo ""
		echo " 安装 gsed 后重新执行安装命令。"
		echo "======================================================================================================"
		echo ""
		exit 1
	fi
else
	echo "正在查找 sed..."
	if [ -z $(command -v sed) ]; then
		echo "没有找到。"
		echo ""
		echo "======================================================================================================"
		echo " 请使用包管理器在系统上安装 sed。"
		echo ""
		echo " 安装 sed 后重新执行安装命令。"
		echo "======================================================================================================"
		echo ""
		exit 1
	fi
fi

echo "正在安装 XS'S tools 脚本 ..."

# Create directory structure

echo "正在创建基础目录 ..."
mkdir -p "$xs_tmp_folder"
mkdir -p "$xs_ext_folder"
mkdir -p "$xs_etc_folder"
mkdir -p "$xs_var_folder"
mkdir -p "$xs_archives_folder"

function infer_download_platform() {
	if [[ "$darwin" == true ]]; then
		echo "$XS_PLATFORM"
	else
		echo "linuxx64"
	fi
}

echo "正在下载压缩包 ..."
curl --insecure --location --progress-bar "${XS_SERVICE_API}/download/xs-cli-${XS_VERSION}.zip" > "$xs_zip_file"

ARCHIVE_OK=$(unzip -qt "$xs_zip_file" | grep 'No errors detected in compressed data')
if [[ -z "$ARCHIVE_OK" ]]; then
	echo "下载的压缩文件损坏。你连网了吗?"
	rm -rf "$XS_DIR"
	exit 1
fi

echo "提取脚本压缩包 ..."
if [[ "$cygwin" == 'true' ]]; then
	echo "Cygwin detected - normalizing paths for unzip..."
	xs_tmp_folder=$(cygpath -w "$xs_tmp_folder")
	xs_zip_file=$(cygpath -w "$xs_zip_file")
	xs_zip_base_folder=$(cygpath -w "$xs_zip_base_folder")
fi
unzip -qo "$xs_zip_file" -d "$xs_zip_base_folder"

echo "正在安装脚本 ..."
mv "${xs_zip_base_folder}/"* "$XS_DIR"
rm -rf "$xs_zip_base_folder"
rm -rf "$xs_zip_file"

echo "启动配置文件 ..."
touch "$xs_config_file"
echo "xs_auto_answer=false" >> "$xs_config_file"
if [ -z "$ZSH_VERSION" -a -z "$BASH_VERSION" ]; then
	echo "xs_auto_complete=false" >> "$xs_config_file"
else
	echo "xs_auto_complete=true" >> "$xs_config_file"
fi
echo "xs_auto_env=false" >> "$xs_config_file"
echo "xs_beta_channel=false" >> "$xs_config_file"
echo "xs_checksum_enable=true" >> "$xs_config_file"
echo "xs_colour_enable=true" >> "$xs_config_file"
echo "xs_curl_connect_timeout=7" >> "$xs_config_file"
echo "xs_curl_max_time=10" >> "$xs_config_file"
echo "xs_debug_mode=false" >> "$xs_config_file"
echo "xs_insecure_ssl=true" >> "$xs_config_file"
echo "xs_rosetta2_compatible=false" >> "$xs_config_file"
echo "xs_selfupdate_enable=true" >> "$xs_config_file"

echo "设置版本为 $XS_VERSION ..."
echo "$XS_VERSION" > "${XS_DIR}/var/version"

if [[ $darwin == true ]]; then
	touch "$xs_bash_profile"
	echo "尝试更新 OSX 上的登录 bash 配置文件..."
	if [[ -z $(grep 'xs-init.sh' "$xs_bash_profile") ]]; then
		echo -e "\n$xs_init_snippet" >> "$xs_bash_profile"
		echo "添加 XS'S CLI Tools 配置到 $xs_bash_profile"
	fi
else
	echo "尝试在常规 UNIX 上更新交互式 bash 配置文件 ..."
	touch "${xs_bashrc}"
	if [[ -z $(grep 'xs-init.sh' "$xs_bashrc") ]]; then
		echo -e "\n$xs_init_snippet" >> "$xs_bashrc"
		echo "添加 XS'S CLI Tools 配置到 $xs_bashrc"
	fi
fi

echo "尝试更新zsh配置文件 ..."
touch "$xs_zshrc"
if [[ -z $(grep 'xs-init.sh' "$xs_zshrc") ]]; then
	echo -e "\n$xs_init_snippet" >> "$xs_zshrc"
	echo "添加 XS'S CLI Tools 配置到 ${xs_zshrc}"
fi

source "${XS_DIR}/bin/xs-init.sh"

echo -e "\n\n\n全部完成！\n\n"

echo "请打开一个新的终端，或在现有的命令行窗口执行以下命令："
echo ""
echo "    source ${XS_DIR}/bin/xs-init.sh"
echo ""
echo "执行以下命令获取使用帮助："
echo ""
echo "    xs help"
echo ""
echo "玩得开心！！！"
