#!/usr/bin/zsh

export PATH=/usr/sbin:$PATH
# 让apt包管理器处于非交互模式运行
export DEBIAN_FRONTEND=noninteractive
# 加载系统配置
source /etc/os-release

# 脚本在执行过程中遇到任何非零返回码的命令时立即退出
# set -e

###############################################################################
# 全局变量                                                                    #
###############################################################################

typeset -a 通用_包列表=('wget' 'curl' 'git' 'vim' 'sudo')
typeset -a 架构_包列表=()
typeset -a 系统_包列表=()
readonly CPU_架构="$(uname -m)"
readonly 系统_类型="$(uname -s)"
readonly 系统_版本="$(uname -r)"
# ID_LIKE不为空,则输出ID_LIKE的值,否则输出ID的值
readonly 系统_发行版=$( ([ -n "${ID_LIKE}" ] && echo "${ID_LIKE}") || ([ -n "${ID}" ] && echo "${ID}"))
readonly 系统_发行版_名称=$(echo "${NAME}")

# 龙架构区分新旧世界的标志位
世界_类型="新世界"

###############################################################################
# 函数/方法                                                                   #
###############################################################################

# 调用包管理器批量安装
批量安装(){
	typeset -a 包列表=($@)
	输出 2 "计划安装列表: ${包列表}"
	for 包 in "${包列表[@]}";do
		输出 2 "正在安装 -> ${包} <-"
		色彩_灰色
		包管_安装 ${包}
		色彩_清除
	done
}

检查_架构() {
	case ${CPU_架构} in
	*x86_64*)
		主机_架构="amd64"
		;;
	*loong*)
		主机_架构="龙"
        ;;
    *)
        输出 1 "暂不支持${色彩[3]} ${CPU_架构} ${色彩重置}架构"
        exit 1
        ;;
    esac
    输出 2 "检测到${色彩[1]} ${主机_架构} ${色彩重置}架构"
}

检查_发行版() {
	未知=0
	case ${系统_发行版} in
    	*arch*) ;;
    	*Loongnix*) ;;
		*aosc*) ;;
		*openwrt*)
        	输出 1 "暂不支持openwrt"
        	exit 1
		;;
    	*)
		未知=1
		;;
    	esac
	输出 2 "检测到 ${系统_发行版_名称} (${系统_发行版}) 系统"
	if [[ ${未知} == 1 ]]; then
		if ! 是否 "此发行版尚未验证, 是否尝试继续安装"; then 
                	输出 1 "已退出安装"
                	exit 1
		fi
	fi
}

配置检测(){
	输出 2 "主机信息检测模块启动"
	检查_架构
	检查_发行版
	输出 0 "主机信息检测完毕"
}

优化_常用命令_vim(){
	输出 2 "启动vim优化, 安装代码检查和树状目录插件, 并优化配置(具体配置可以查看 $HOME/.vimrc 文件)"
	vim_配置路径=$HOME/.vim/pack/xunmi
	typeset -a vim_包列表=('vim-airline')
	批量安装 ${vim_包列表[@]} && 输出 0 "vim依赖包安装完毕"
	色彩_灰色
	rm -vrf ${vim_配置路径}
	mkdir -vp ${vim_配置路径}/{opt,start}
	# 树状目录
	git clone --depth 1 https://gitcode.com/mirrors/scrooloose/nerdtree.git ${vim_配置路径}/start/树状目录
	# 代码检查工具
	git clone --depth 1 https://gitcode.com/mirrors/dense-analysis/ale.git ${vim_配置路径}/start/代码检查工具
	cp -v ${目录_根}/配置/vimrc $HOME/.vimrc
	色彩_清除
	输出 0 "vim优化完成"
}

优化_常用命令_ls(){
	输出 2 "启动ls优化, lsd是rust编写的兼容ls的目录查看工具, 其丰富的配色和图标可有效增加目录的可读性"
	色彩_灰色
	if ! 包管_安装 "lsd"; then
		是否  "在系统源中未发现lsd, 是否使用cargo安装(需要rust语言, 如系统没有则会自动安装)" || return 201
		# todo: 需要判断龙芯旧世界, 旧世界安装的cargo版本过低, 需要从官网下载安装
		if ! 包管_安装 "cargo"; then
			输出 3 "ls优化失败, 未找到cargo, 请手动安装rust语言及其cargo包管理器后重试"
			return 202
		fi
		cargo install "lsd"
	fi
	sudo ln -vs $HOME/.cargo/bin/lsd /usr/bin/lsd
	色彩_清除
	if 是否 "将lsd使用别名的方式替代ls"; then
		别名='alias ls="lsd"' 
		grep -q "${别名}" "$HOME/.zshrc" || echo ${别名} >> $HOME/.zshrc
	fi
	输出 0 "ls优化完成"
}

优化_常用命令(){
	typeset -A 列表=(
		["vim"]="添加常用配置项(允许复制 添加行号 显式当前行等), 常用插件(目录 语法检测)"
		["ls"]="使用lsd替代老旧的ls, 需要rust的cargo"
       	["top"]="使用xmtop替代老旧的top"
       	["cat"]="使用bat替代cat"
       	["sed"]="使用学习成本较低的sd替代sed"
	)
	输出 2 "正在优化 ${(k)列表} 命令"
	# 遍历关联数组
	for 键 值 in ${(kv)列表}; do
		if 是否 "是否启动 '${键}' 命令优化 -> ${值} <- "; then
			优化_常用命令_${键}
		else
			输出 3 "已取消 ${键} 的优化"
		fi
	done
}

选配(){
    if 是否 "将Zsh设置为默认命令行"; then
        chsh -s /usr/bin/zsh
        输出 0 "已将zsh设置为默认命令行,此设置主要适用于ssh和tty,如终端不生效则需要在可视化设置中手动配置启动时加载 '/usr/bin/zsh' "
    else
        输出 2 "如需将zsh设置为默认命令行请执行: 'chsh -s /usr/bin/zsh' "
    fi
}


###############################################################################
# 主函数(main)                                                                  #
###############################################################################

echo "
*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
* 欢迎使用 言灵 配置脚本      *
*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
"
目录_根=$PWD
# 判断当前执行的位置 如果不再项目路径中就去寻找路径
if [ ! -f "公共/函数.zsh" ]; then
	source $HOME/.config/xunmi/*
	目录_根=${寻觅}/x
fi
echo "执行目录: ${目录_根}"

# 先检查相关
[[ ${言灵_函数} == 1 ]] || . ${目录_根}/公共/函数.zsh || exit 2 && 输出 0 "公共函数模块初始化完成"
[[ ${言灵_包管} == 1 ]] || . ${目录_根}/公共/包管.zsh || exit 3 && 输出 0 "包管理器模块初始化完成"

# 配置检测

#[[ ${#通用_包列表} -ne 0 ]] && 批量安装 ${通用_包列表[@]} && 输出 0 "通用包安装完毕"
#[[ ${#架构_包列表} -ne 0 ]] && 批量安装 ${架构_包列表[@]} && 输出 0 "架构专用包安装完毕"
#[[ ${#系统_包列表} -ne 0 ]] && 批量安装 ${系统_包列表[@]} && 输出 0 "系统发行版专用包安装完毕"

优化_常用命令_ls
# 配置_开发环境

#选配