#!/bin/bash
## Author: shizuku
## License: MIT
## 用途: 一键配置 Debian / Ubuntu 中文语言环境与中文字体
## 用法: bash <(curl -sSL https://linux.goose.gs.cn/zh-cn.sh)

## 定义颜色
RED='\033[31m'
GREEN='\033[32m'
YELLOW='\033[33m'
BLUE='\033[34m'
AZURE='\033[36m'
PLAIN='\033[0m'
BOLD='\033[1m'
SUCCESS="\033[1;32m✔${PLAIN}"
ERROR="\033[1;31m✘${PLAIN}"
WARN="\033[1;43m WARN ${PLAIN}"
TIP="\033[1;44m TIP ${PLAIN}"
WORKING="\033[1;36m◉${PLAIN}"

TARGET_LOCALE="zh_CN.UTF-8"
LOCALE_FILE=/etc/default/locale

function output_error() {
    [ "$1" ] && echo -e "\n$ERROR $1\n"
    exit 1
}

function command_exists() {
    command -v "$@" &>/dev/null
}

function permission_judgment() {
    if [ $UID -ne 0 ]; then
        local change_cmd="su root"
        if command_exists sudo; then
            change_cmd="sudo -i"
        fi
        output_error "当前用户非 root，请切换用户后重试：${BLUE}${change_cmd}${PLAIN}"
    fi
}

## 解析命令选项
REBOOT_MODE=""
PURE_MODE="false"
SKIP_FONTS="false"
FORCE_FACTION=""

function handle_command_options() {
    while [ $# -gt 0 ]; do
        case "$1" in
        --reboot)
            REBOOT_MODE="true"
            ;;
        --no-reboot)
            REBOOT_MODE="false"
            ;;
        --skip-fonts)
            SKIP_FONTS="true"
            ;;
        --locale)
            if [ "$2" ]; then
                TARGET_LOCALE="$2"
                shift
            else
                output_error "请在 ${BLUE}--locale${PLAIN} 后指定语言环境，例如 ${BLUE}zh_CN.UTF-8${PLAIN}"
            fi
            ;;
        --faction)
            if [ "$2" ]; then
                case "$2" in
                ubuntu | debian)
                    FORCE_FACTION="$2"
                    shift
                    ;;
                *)
                    output_error "无效的发行版方案：${BLUE}$2${PLAIN}，仅支持 ${BLUE}ubuntu${PLAIN} 或 ${BLUE}debian${PLAIN}"
                    ;;
                esac
            else
                output_error "请在 ${BLUE}--faction${PLAIN} 后指定发行版方案（ubuntu / debian）"
            fi
            ;;
        --pure-mode)
            PURE_MODE="true"
            ;;
        --help)
            echo -e "
${BOLD}shizuku${PLAIN} · 中文环境配置工具 —— 适用于 Debian / Ubuntu

用法： bash <(curl -sSL https://linux.goose.gs.cn/zh-cn.sh) [选项]

选项：
  --locale <名称>   指定语言环境，默认 zh_CN.UTF-8
                    可选 zh_CN.UTF-8 / zh_TW.UTF-8 / zh_HK.UTF-8
  --faction <方案>  强制指定发行版方案（ubuntu / debian），默认自动识别
  --reboot          配置完成后自动重启
  --no-reboot       配置完成后不重启（默认询问）
  --skip-fonts      跳过中文字体安装
  --pure-mode       纯净模式，精简输出
  --help            查看帮助

说明：
  · 自动识别 Debian / Ubuntu 并选用对应的语言包方案
  · Ubuntu 使用 language-pack-zh-hans
  · Debian 使用 locales + locale-gen 生成语言环境
  · 两者都会安装 fonts-noto-cjk 中文字体
"
            exit 0
            ;;
        *)
            output_error "未知选项：${BLUE}$1${PLAIN}，使用 ${BLUE}--help${PLAIN} 查看帮助"
            ;;
        esac
        shift
    done
}

function run_start() {
    clear
    echo -e "  \033[1;35m  ____  _   _ ___ _____ _   _ _  __ _   _ \033[0m"
    echo -e "  \033[1;35m / ___|| | | |_ _|__  /| | | | |/ /| | | |\033[0m"
    echo -e "  \033[1;35m \\___ \\| |_| || |  / / | | | | ' / | | | |\033[0m"
    echo -e "  \033[1;35m  ___) |  _  || | / /_ | |_| | . \\ | |_| |\033[0m"
    echo -e "  \033[1;35m |____/|_| |_|___/____| \\___/|_|\\_\\ \\___/ \033[0m"
    echo -e ''
    echo -e "  \033[1mshizuku\033[0m · GNU/Linux 中文环境配置工具"
    echo -e ''
    echo -e "  运行环境 ${BLUE}${SYSTEM_PRETTY_NAME} ${DEVICE_ARCH}${PLAIN}"
    echo -e "  目标语言 ${BLUE}${TARGET_LOCALE}${PLAIN}"
    echo -e ''
    sleep 1 >/dev/null 2>&1
}

## 收集系统信息
function collect_system_info() {
    [ -s /etc/os-release ] || output_error "无法识别当前操作系统"
    SYSTEM_NAME="$(grep -E '^NAME=' /etc/os-release | cut -d= -f2- | sed "s/[\"']//g")"
    SYSTEM_PRETTY_NAME="$(grep -E '^PRETTY_NAME=' /etc/os-release | cut -d= -f2- | sed "s/[\"']//g")"
    SYSTEM_ID="$(grep -E '^ID=' /etc/os-release | cut -d= -f2- | sed "s/[\"']//g")"
    SYSTEM_VERSION_ID="$(grep -E '^VERSION_ID=' /etc/os-release | cut -d= -f2- | sed "s/[\"']//g")"
    DEVICE_ARCH="$(uname -m)"

    case "${SYSTEM_ID}" in
    ubuntu)
        SYSTEM_FACTION="ubuntu"
        ;;
    debian | raspbian)
        SYSTEM_FACTION="debian"
        ;;
    *)
        # 通过 debian_version 兜底判断
        if [ -s /etc/debian_version ]; then
            SYSTEM_FACTION="debian"
            echo -e "\n$WARN 未识别的发行版 ${BLUE}${SYSTEM_ID}${PLAIN}，按 Debian 系方案处理\n"
        else
            if [ -z "${FORCE_FACTION}" ]; then
                output_error "不支持的操作系统：${BLUE}${SYSTEM_ID}${PLAIN}，本工具仅支持 Debian / Ubuntu 及其衍生版（可用 ${BLUE}--faction${PLAIN} 强制指定方案）"
            fi
        fi
        ;;
    esac

    ## 命令行强制指定优先
    if [ -n "${FORCE_FACTION}" ]; then
        if [ "${SYSTEM_FACTION}" != "${FORCE_FACTION}" ]; then
            echo -e "\n$WARN 已按命令行指定使用 ${BLUE}${FORCE_FACTION}${PLAIN} 方案\n"
        fi
        SYSTEM_FACTION="${FORCE_FACTION}"
    fi
}

## 安装软件包
function install_packages() {
    local -a pkgs=()
    if [[ "${SYSTEM_FACTION}" == "ubuntu" ]]; then
        pkgs=("language-pack-zh-hans")
    else
        pkgs=("locales" "locales-all")
    fi
    [[ "${SKIP_FONTS}" != "true" ]] && pkgs+=("fonts-noto-cjk")

    echo -e "$WORKING 正在更新软件包索引..."
    apt-get update -qq 2>&1 | tail -2
    if [ ${PIPESTATUS[0]} -ne 0 ]; then
        echo -e "$WARN 软件包索引更新失败，尝试继续安装..."
    fi

    echo -e "\n$WORKING 正在安装：${BLUE}${pkgs[*]}${PLAIN}"
    DEBIAN_FRONTEND=noninteractive apt-get install -y "${pkgs[@]}" 2>&1 | tail -5
    if [ ${PIPESTATUS[0]} -ne 0 ]; then
        echo -e "\n$WARN 部分软件包安装失败，尝试逐个安装..."
        local failed=()
        for p in "${pkgs[@]}"; do
            DEBIAN_FRONTEND=noninteractive apt-get install -y "$p" &>/dev/null || failed+=("$p")
        done
        if [ ${#failed[@]} -gt 0 ]; then
            echo -e "$ERROR 以下软件包安装失败：${BLUE}${failed[*]}${PLAIN}"
            echo -e "$TIP 请检查软件源是否可用，可先执行换源脚本："
            echo -e "    bash <(curl -sSL https://linux.goose.gs.cn/main.sh)"
            return 1
        fi
    fi
    return 0
}

## 生成语言环境
function generate_locale() {
    echo -e "\n$WORKING 正在生成语言环境 ${BLUE}${TARGET_LOCALE}${PLAIN}"

    local _loc_re="${TARGET_LOCALE//./\\.}"
    if [[ "${SYSTEM_FACTION}" == "debian" ]]; then
        # Debian：通过 /etc/locale.gen 启用并生成
        if [ -f /etc/locale.gen ]; then
            if grep -qE "^[[:space:]]*#?[[:space:]]*${_loc_re}[[:space:]]+UTF-8" /etc/locale.gen; then
                sed -i -E "s|^[[:space:]]*#[[:space:]]*(${_loc_re}[[:space:]]+UTF-8)|\1|" /etc/locale.gen
            else
                echo "${TARGET_LOCALE} UTF-8" >>/etc/locale.gen
            fi
        else
            echo "${TARGET_LOCALE} UTF-8" >/etc/locale.gen
        fi
        command_exists locale-gen && locale-gen 2>&1 | tail -3
    else
        # Ubuntu：language-pack 已自动生成，兜底确保存在
        if ! locale -a 2>/dev/null | grep -qiE "^${_loc_re}$|^${TARGET_LOCALE%.UTF-8}\.utf8$"; then
            if [ -f /etc/locale.gen ]; then
                grep -qE "^[[:space:]]*#?[[:space:]]*${_loc_re}[[:space:]]+UTF-8" /etc/locale.gen &&
                    sed -i -E "s|^[[:space:]]*#[[:space:]]*(${_loc_re}[[:space:]]+UTF-8)|\1|" /etc/locale.gen ||
                    echo "${TARGET_LOCALE} UTF-8" >>/etc/locale.gen
            fi
            command_exists locale-gen && locale-gen 2>&1 | tail -3
        fi
    fi

    # 写入系统默认语言环境
    mkdir -p "$(dirname "${LOCALE_FILE}")" 2>/dev/null
    if [ -f "${LOCALE_FILE}" ] && grep -q '^LANG=' "${LOCALE_FILE}"; then
        sed -i "s|^LANG=.*|LANG=${TARGET_LOCALE}|" "${LOCALE_FILE}"
    else
        echo "LANG=${TARGET_LOCALE}" >>"${LOCALE_FILE}"
    fi

    # 使用 update-locale 同步（如可用）
    if command_exists update-locale; then
        update-locale LANG="${TARGET_LOCALE}" 2>/dev/null
    fi
}

## 验证结果
function verify_result() {
    echo -e "\n$WORKING 正在验证配置结果...\n"
    local ok="true"

    # 1. 检查 locale 是否已生成（locale -a 输出可能是 zh_CN.utf8 形式）
    local _locale_re="${TARGET_LOCALE//./\\.}"
    local _locale_alt="${TARGET_LOCALE%.UTF-8}.utf8"
    local _locale_alt_re="${_locale_alt//./\\.}"
    if locale -a 2>/dev/null | grep -qiE "^(${_locale_re}|${_locale_alt_re})$"; then
        echo -e "  $SUCCESS 语言环境已生成：${BLUE}${TARGET_LOCALE}${PLAIN}"
    else
        echo -e "  $ERROR 语言环境未生成：${BLUE}${TARGET_LOCALE}${PLAIN}"
        ok="false"
    fi

    # 2. 检查配置文件
    if [ -f "${LOCALE_FILE}" ] && grep -q "^LANG=${TARGET_LOCALE}" "${LOCALE_FILE}"; then
        echo -e "  $SUCCESS 默认语言已写入：${BLUE}${LOCALE_FILE}${PLAIN}"
    else
        echo -e "  $ERROR 默认语言未写入：${BLUE}${LOCALE_FILE}${PLAIN}"
        ok="false"
    fi

    # 3. 检查中文字体
    if [[ "${SKIP_FONTS}" == "true" ]]; then
        echo -e "  ${AZURE}·${PLAIN} 已跳过中文字体检查"
    elif fc-list 2>/dev/null | grep -qiE "noto.*cjk|wqy|source han"; then
        echo -e "  $SUCCESS 中文字体已安装"
    elif dpkg -l 2>/dev/null | grep -qE "^ii\s+fonts-noto-cjk"; then
        echo -e "  $SUCCESS 中文字体包已安装（需重载字体缓存生效）"
    else
        echo -e "  $WARN 未检测到中文字体"
    fi

    [ "${ok}" == "true" ]
}

## 询问重启
function ask_reboot() {
    if [[ "${REBOOT_MODE}" == "true" ]]; then
        echo -e "\n$WORKING 配置完成，3 秒后自动重启...\n"
        sleep 3
        reboot
        return
    fi
    if [[ "${REBOOT_MODE}" == "false" ]]; then
        echo -e "\n$TIP 配置完成，请稍后手动重启系统以完全生效：${BLUE}reboot${PLAIN}\n"
        return
    fi
    if [[ "${PURE_MODE}" == "true" ]]; then
        echo -e "\n$TIP 配置完成，建议重启系统以完全生效：${BLUE}reboot${PLAIN}\n"
        return
    fi

    echo -e "\n$TIP 是否立即重启系统以使配置完全生效？[Y/n] \c"
    local INPUT
    read -r INPUT || INPUT="n"
    [[ -z "${INPUT}" ]] && INPUT="Y"
    case "${INPUT}" in
    [Yy] | [Yy][Ee][Ss])
        echo -e "\n$WORKING 3 秒后重启...\n"
        sleep 3
        reboot
        ;;
    *)
        echo -e "\n$TIP 已跳过重启，请稍后手动执行：${BLUE}reboot${PLAIN}\n"
        ;;
    esac
}

function main() {
    handle_command_options "$@"
    permission_judgment
    collect_system_info
    [[ "${PURE_MODE}" != "true" ]] && run_start

    install_packages || exit 1
    generate_locale
    verify_result
    ask_reboot

    if [[ "${PURE_MODE}" != "true" ]]; then
        echo -e "\n\033[3;1mPowered by \033[35mshizuku\033[0m\n"
    fi
}

main "$@"
