#!/bin/bash

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

dist_base="https://file.yxxd.top/soga"

# 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 | grep -Eqi "debian"; then
    release="debian"
elif cat /etc/issue | grep -Eqi "ubuntu"; then
    release="ubuntu"
elif cat /etc/issue | 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"
else
    echo -e "${red}当前仅提供 amd64 (x86_64) 安装包，检测到架构: ${arch}${plain}\n" && exit 1
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() {
    cd /usr/local/
    if [[ -e /usr/local/soga/ ]]; then
        rm /usr/local/soga/ -rf
    fi

    echo -e "开始安装 soga 最新版"
    wget --no-check-certificate -O /usr/local/soga.tar.gz "${dist_base}/soga.tar.gz"
    if [[ $? -ne 0 ]]; then
        echo -e "${red}下载 soga 失败，请检查分发站 ${dist_base}/ 是否可访问${plain}"
        exit 1
    fi

    tar zxvf soga.tar.gz
    if [[ $? -ne 0 ]]; then
        rm -f /usr/local/soga.tar.gz
        echo -e "${red}soga 安装包解压失败${plain}"
        exit 1
    fi
    rm soga.tar.gz -f
    cd soga
    chmod +x soga
    last_version="$(./soga -v)"

    mkdir /etc/soga/ -p
    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

    wget --no-check-certificate -O /usr/bin/soga "${dist_base}/soga.sh"
    if [[ $? -ne 0 ]]; then
        echo -e "${red}下载 soga 管理脚本失败，请检查分发站 ${dist_base}/ 是否可访问${plain}"
        exit 1
    fi
    wget --no-check-certificate -O /usr/bin/soga-tool "${dist_base}/soga-tool-amd64"
    if [[ $? -ne 0 ]]; then
        echo -e "${red}下载 soga 配置工具失败，请检查分发站 ${dist_base}/ 是否可访问${plain}"
        exit 1
    fi
    chmod +x /usr/bin/soga /usr/bin/soga-tool

    echo -e "${green}soga v${last_version}${plain} 安装完成，已设置开机自启"
    if [[ ! -f /etc/soga/soga.conf ]]; then
        cp soga.conf /etc/soga/
        echo -e ""
        echo -e "全新安装，请先配置必要的内容"
    else
        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

    echo -e ""
    echo "soga 管理脚本使用方法: "
    echo "------------------------------------------"
    echo "soga                    - 显示管理菜单 (功能更多)"
    echo "soga start              - 启动 soga"
    echo "soga stop               - 停止 soga"
    echo "soga restart            - 重启 soga"
    echo "soga enable             - 设置 soga 开机自启"
    echo "soga disable            - 取消 soga 开机自启"
    echo "soga log                - 查看 soga 日志"
    echo "soga config             - 显示配置文件内容"
    echo "soga config xx=xx yy=yy - 自动设置配置文件"
    echo "soga install            - 安装 soga"
    echo "soga uninstall          - 卸载 soga"
    echo "soga version            - 查看 soga 版本"
    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
}

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

configs=()
for arg in "$@"; do
    if [[ "${arg}" == *"="* ]]; then
        configs+=("${arg}")
    else
        echo -e "${red}不支持的参数: ${arg}${plain}"
        exit 1
    fi
done

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

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
