#!/bin/bash

red='\033[0;31m'
green='\033[0;32m'
yellow='\033[0;33m'
plain='\033[0m'

cur_dir=$(pwd)

# check root
[[ $EUID -ne 0 ]] && echo -e "${red}错误：${plain} 必须使用root用户运行此脚本！\n" && exit 1

# check os
if [[ -f /etc/redhat-release ]]; then
    release="centos"
elif cat /etc/issue 2>/dev/null | grep -Eqi "debian"; then
    release="debian"
elif cat /etc/issue 2>/dev/null | grep -Eqi "ubuntu"; then
    release="ubuntu"
elif cat /etc/issue 2>/dev/null | grep -Eqi "centos|red hat|redhat"; then
    release="centos"
elif cat /proc/version | grep -Eqi "debian"; then
    release="debian"
elif cat /proc/version | grep -Eqi "ubuntu"; then
    release="ubuntu"
elif cat /proc/version | grep -Eqi "centos|red hat|redhat"; then
    release="centos"
else
    echo -e "${red}未检测到系统版本，请联系脚本作者！${plain}\n"
    exit 1
fi

arch=$(arch)

if [[ $arch == "x86_64" || $arch == "x64" || $arch == "amd64" ]]; then
    arch="amd64"
elif [[ $arch == "aarch64" || $arch == "arm64" ]]; then
    arch="arm64"
else
    arch="amd64"
    echo -e "${red}检测架构失败，使用默认架构: ${arch}${plain}"
fi

echo "架构: ${arch}"

if [ "$(getconf WORD_BIT)" != '32' ] && [ "$(getconf LONG_BIT)" != '64' ]; then
    echo "本软件不支持 32 位系统(x86)，请使用 64 位系统(x86_64)，如果检测有误，请联系作者"
    exit 2
fi


function is_cmd_exist() {
    local cmd="$1"

    if [ -z "$cmd" ]; then
        return 1
    fi

    which "$cmd" > /dev/null 2>&1

    if [ $? -eq 0 ]; then
        return 0
    fi

    return 2
}


install_base() {
    if [[ x"${release}" == x"centos" ]]; then
        yum install epel-release -y
        yum install wget curl tar crontabs socat tzdata -y
    else
        apt install wget curl tar cron socat tzdata -y
    fi
}


# 0: running
# 1: not running
# 2: not installed
check_status() {
    if [[ ! -f /etc/systemd/system/soga.service ]]; then
        return 2
    fi

    temp=$(systemctl status soga | grep Active | awk '{print $3}' | cut -d "(" -f2 | cut -d ")" -f1)

    if [[ x"${temp}" == x"running" ]]; then
        return 0
    else
        return 1
    fi
}


install_acme() {
    curl https://get.acme.sh | sh
    /root/.acme.sh/acme.sh --set-default-ca --server letsencrypt
}


install_soga() {

    # 删除旧的程序目录
    # 注意：不会删除 /etc/soga
    if [[ -e /usr/local/soga/ ]]; then
        rm /usr/local/soga/ -rf
    fi

    # 删除当前目录之前解压出来的 soga 目录
    rm soga/ -rf

    # 检查安装包
    if [[ ! -f "soga-linux-${arch}.tar.gz" ]]; then
        echo -e "${red}未找到 soga-linux-${arch}.tar.gz${plain}"
        echo -e "${yellow}请确认安装包和 install.sh 位于同一个目录${plain}"
        exit 1
    fi

    # 解压
    tar zxvf "soga-linux-${arch}.tar.gz"

    if [[ $? -ne 0 ]]; then
        echo -e "${red}解压 soga-linux-${arch}.tar.gz 失败${plain}"
        exit 1
    fi

    # 检查解压目录
    if [[ ! -d soga ]]; then
        echo -e "${red}解压后未找到 soga 目录${plain}"
        exit 1
    fi

    # 安装主程序
    mv soga /usr/local/

    cd /usr/local/soga/ || {
        echo -e "${red}无法进入 /usr/local/soga/${plain}"
        exit 1
    }

    chmod +x soga

    # 创建配置目录
    # 已存在时不会删除里面的文件
    mkdir /etc/soga/ -p

    # 安装 systemd
    rm /etc/systemd/system/soga.service -f
    rm /etc/systemd/system/soga@.service -f

    cp -f soga.service /etc/systemd/system/
    cp -f soga@.service /etc/systemd/system/

    systemctl daemon-reload
    systemctl stop soga
    systemctl enable soga

    echo -e "${green}soga 离线版安装完成，已设置开机自启${plain}"


    # ======================================================
    # soga.conf
    #
    # 如果不存在：
    # 从 down.kantv88.com 下载自定义配置
    #
    # 如果已经存在：
    # 原样保留，不覆盖
    # ======================================================

    if [[ ! -f /etc/soga/soga.conf ]]; then

        echo -e "${green}正在下载自定义 soga.conf...${plain}"

        wget --no-check-certificate \
            -O /etc/soga/soga.conf.tmp \
            https://down.kantv88.com/soga.conf

        if [[ $? -ne 0 || ! -s /etc/soga/soga.conf.tmp ]]; then
            echo -e "${red}下载自定义 soga.conf 失败${plain}"

            rm -f /etc/soga/soga.conf.tmp

            exit 1
        fi

        mv /etc/soga/soga.conf.tmp /etc/soga/soga.conf

        echo -e "${green}已安装自定义 soga.conf${plain}"
        echo -e ""
        echo -e "全新安装，请先配置必要的内容"

    else

        echo -e "${yellow}检测到已有 soga.conf，保留原配置，不进行覆盖${plain}"

        systemctl start soga

        sleep 2

        check_status

        echo -e ""

        if [[ $? == 0 ]]; then
            echo -e "${green}soga 重启成功${plain}"
        else
            echo -e "${red}soga 可能启动失败，请稍后使用 soga log 查看日志信息${plain}"
        fi

    fi


    # ======================================================
    # 其他配置文件
    #
    # 已存在则保留
    # 不存在才从安装包复制
    # ======================================================

    if [[ ! -f /etc/soga/blockList ]]; then
        cp blockList /etc/soga/
    fi

    if [[ ! -f /etc/soga/whiteList ]]; then
        cp whiteList /etc/soga/
    fi

    if [[ ! -f /etc/soga/dns.yml ]]; then
        cp dns.yml /etc/soga/
    fi

    if [[ ! -f /etc/soga/routes.toml ]]; then
        cp routes.toml /etc/soga/
    fi


    # ======================================================
    # 下载 soga 管理脚本
    # ======================================================

    wget --no-check-certificate \
        -O /usr/bin/soga \
        "https://github.com/vaxilu/soga-cmd/releases/latest/download/soga-cmd-linux-${arch}"

    if [[ $? -ne 0 ]]; then
        echo -e "${red}下载 soga 管理脚本失败，请确保你的服务器能够下载 Github 的文件${plain}"
        exit 1
    fi

    chmod +x /usr/bin/soga


    echo -e ""
    echo "soga 管理脚本使用方法: "
    echo "----------------------------------------------------------"
    echo "soga                              - 显示管理菜单 (功能更多)"
    echo "soga list                         - 列出已有的实例及状态"
    echo "soga new <name> [k1=v1 ...]       - 新建实例"
    echo "soga remove <name> [name...]      - 移除实例"
    echo "soga rename <old_name> <new_name> - 重命名实例"
    echo "soga start [name]                 - 启动实例"
    echo "soga stop [name]                  - 停止实例"
    echo "soga restart [name]               - 重启实例"
    echo "soga enable [name]                - 设置实例开机自启"
    echo "soga disable [name]               - 取消实例开机自启"
    echo "soga log [name]                   - 查看实例日志(默认 1000 行)"
    echo "soga log [name] -f                - 持续输出实例日志"
    echo "soga config [name]                - 查看实例配置文件"
    echo "soga config [name] k1=v1 k2=v2    - 修改或新增配置"
    echo "soga update [version]             - 安装/更新 soga"
    echo "soga uninstall                    - 完全卸载 soga"
    echo "soga self-update                  - 更新管理脚本"
    echo "soga version                      - 查看版本"
    echo "----------------------------------------------------------"
}


apply_configs() {

    local conf_file="/etc/soga/soga.conf"

    if [[ ! -f ${conf_file} ]]; then
        echo -e "${red}配置文件 ${conf_file} 不存在，跳过配置写入${plain}"
        return
    fi

    for kv in "$@"; do

        local key="${kv%%=*}"
        local value="${kv#*=}"

        if [[ -z "${key}" || "${key}" == "${kv}" ]]; then
            echo -e "${yellow}忽略无效配置参数: ${kv}${plain}"
            continue
        fi

        local esc_value

        esc_value=$(printf '%s\n' "${value}" | sed -e 's/[\/&|]/\\&/g')

        if grep -Eq "^[[:space:]]*${key}[[:space:]]*=" "${conf_file}"; then

            sed -i -E \
                "s|^[[:space:]]*${key}[[:space:]]*=.*|${key}=${esc_value}|" \
                "${conf_file}"

            echo -e "${green}已更新配置: ${key}=${value}${plain}"

        else

            echo "${key}=${value}" >> "${conf_file}"

            echo -e "${green}已添加配置: ${key}=${value}${plain}"

        fi

    done
}


# ==========================================================
# 检查 systemctl
# ==========================================================

is_cmd_exist "systemctl"

if [[ $? != 0 ]]; then
    echo "systemctl 命令不存在，请使用较新版本的系统，例如 Ubuntu 18+、Debian 9+"
    exit 1
fi


# ==========================================================
# 处理命令行参数
# ==========================================================

version=""
configs=()

for arg in "$@"; do

    if [[ "${arg}" == *"="* ]]; then

        configs+=("${arg}")

    elif [[ -z "${version}" ]]; then

        version="${arg}"

    fi

done


# ==========================================================
# 开始安装
# ==========================================================

echo -e "${green}开始安装${plain}"

install_base

install_acme

install_soga "${version}"


# ==========================================================
# 如果传入 key=value，则自动修改 soga.conf
# ==========================================================

if [[ ${#configs[@]} -gt 0 ]]; then

    echo -e "${green}开始写入配置${plain}"

    apply_configs "${configs[@]}"

    systemctl restart soga

    sleep 2

    check_status

    if [[ $? == 0 ]]; then
        echo -e "${green}soga 重启成功${plain}"
    else
        echo -e "${red}soga 可能启动失败，请稍后使用 soga log 查看日志信息${plain}"
    fi

fi