#!/bin/bash

# ==============================================================================
# Jiasion Server Installation Script for Ubuntu 22.04 LTS
# Version: 2.3 (Timezone & Cleanup Edition)
# ==============================================================================

# --- 日志自动记录 ---
LOG_FILE="$(pwd)/jiasion_install_$(date +%Y%m%d_%H%M%S).log"
echo ">>> [系统] 正在初始化日志记录..."
echo ">>> [系统] 完整日志将保存至: $LOG_FILE"
exec > >(tee -a "$LOG_FILE") 2>&1

# 全局参数
type=$1
version=$2
UBUNTU_CODENAME=$(lsb_release -rs)
CURRENT_MIRROR=""

# 颜色定义
GREEN='\033[0;32m'
RED='\033[0;31m'
YELLOW='\033[1;33m'
NC='\033[0m'

# --- 辅助函数 ---

log_info() { echo -e "${GREEN}[INFO] $1${NC}"; }
log_warn() { echo -e "${YELLOW}[WARN] $1${NC}"; }
log_error() { echo -e "${RED}[ERROR] $1${NC}"; }

ensure_success() {
    if [ $? -ne 0 ]; then
        log_error "$1"
        exit 1
    fi
}

# --- 功能模块 ---

# 1. Netplan DNS 修复
fix_dns_netplan() {
    log_info "正在通过 Netplan 永久修复 DNS (注入 114.114.114.114/223.5.5.5)..."
    local netplan_file=$(ls /etc/netplan/*.yaml 2>/dev/null | head -n 1)
    
    if [ -z "$netplan_file" ]; then
        log_warn "未找到 Netplan 配置文件，退回使用 resolv.conf 临时修复..."
        fix_dns_legacy
        return
    fi
    
    log_info "发现网卡配置文件: $netplan_file"
    cp "$netplan_file" "${netplan_file}.bak_$(date +%s)"
    
    if ! python3 -c "import yaml" 2>/dev/null; then
         log_warn "缺少 python3-yaml，尝试安装..."
         apt-get update -y >/dev/null 2>&1 && apt-get install -y python3-yaml >/dev/null 2>&1
    fi

    python3 -c "
import sys, os
try: import yaml
except ImportError: sys.exit(1)

file_path = '$netplan_file'
try:
    with open(file_path, 'r') as f:
        data = yaml.safe_load(f) or {}

    patched = False
    if 'network' in data and 'ethernets' in data['network']:
        for eth_name, eth_conf in data['network']['ethernets'].items():
            if not eth_conf: eth_conf = {}
            if 'nameservers' not in eth_conf:
                eth_conf['nameservers'] = {}
            if eth_conf['nameservers'].get('addresses') is None:
                eth_conf['nameservers']['addresses'] = []

            current_dns = eth_conf['nameservers']['addresses']
            for dns in ['223.5.5.5', '114.114.114.114']:
                if dns not in current_dns:
                    current_dns.insert(0, dns)
                    patched = True
            
            if patched:
                data['network']['ethernets'][eth_name] = eth_conf
                break
    
    if patched:
        with open(file_path, 'w') as f:
            yaml.dump(data, f, default_flow_style=False)
    else:
        sys.exit(2) 
except Exception: sys.exit(1)
"
    local ret=$?
    if [ $ret -eq 0 ]; then
        netplan apply
        sleep 5
        log_info "Netplan 配置应用完成。"
    elif [ $ret -eq 2 ]; then
        log_info "Netplan DNS 已配置，无需修改。"
    else
        fix_dns_legacy 
    fi
}

fix_dns_legacy() {
    log_warn "临时 DNS 修复 (/etc/resolv.conf)..."
    rm -f /etc/resolv.conf
    cat > /etc/resolv.conf <<EOF
nameserver 114.114.114.114
nameserver 223.5.5.5
EOF
}

check_network() {
    log_info "检查网络连通性..."
    local network_ok=false
    local test_domains=("mirrors.aliyun.com" "www.baidu.com" "archive.ubuntu.com")
    
    for domain in "${test_domains[@]}"; do
        if ping -c 1 -W 2 "$domain" &> /dev/null; then
            log_info "连接 $domain 成功。"
            network_ok=true
            break
        fi
    done
    
    if [ "$network_ok" = false ]; then
        log_warn "网络检测失败，尝试修复 DNS..."
        fix_dns_netplan
        if ping -c 1 -W 3 "114.114.114.114" &> /dev/null; then
             # IP通了看域名
             if ! ping -c 1 -W 3 "www.baidu.com" &> /dev/null; then
                 log_error "域名解析仍失败，请检查防火墙。"
             fi
        else
             log_error "物理网络不可达 (Ping IP 失败)。"
        fi
    fi
}

select_mirror() {
    log_info "寻找最佳镜像源..."
    local mirrors=(
        "阿里云|http://mirrors.aliyun.com/ubuntu/"
        "清华大学|http://mirrors.tuna.tsinghua.edu.cn/ubuntu/"
        "腾讯云|http://mirrors.cloud.tencent.com/ubuntu/"
        "官方源|http://archive.ubuntu.com/ubuntu/"
    )
    for item in "${mirrors[@]}"; do
        local name=${item%%|*}
        local url=${item##*|}
        if curl -I -m 3 -s -o /dev/null "$url"; then
            log_info ">>> 选中源: $name"
            CURRENT_MIRROR="$url"
            return 0
        fi
    done
    
    log_warn "所有源不可达，尝试修复DNS后重连阿里云..."
    fix_dns_netplan
    if curl -I -m 5 -s -o /dev/null "http://mirrors.aliyun.com/ubuntu/"; then
        CURRENT_MIRROR="http://mirrors.aliyun.com/ubuntu/"
    else
        log_error "无法连接任何软件源。"
        exit 1
    fi
}

# 2. 时区配置模块 (新增)
configure_timezone() {
    log_info "配置时区 (目标: Asia/Shanghai)..."
    local TARGET_TZ="Asia/Shanghai"
    
    is_tz_correct() {
        if date +%z | grep -q "+0800"; then return 0; fi
        return 1
    }
    
    if is_tz_correct; then
        log_info "时区已正确 (+0800)。"
        return
    fi

    # 方案 1: timedatectl
    log_info ">>> 方案 1: timedatectl..."
    if command -v timedatectl >/dev/null; then
        timedatectl set-timezone "$TARGET_TZ" || true
    fi
    if is_tz_correct; then log_info "方案 1 成功！"; return; fi
    
    # 方案 2: 软链接
    log_info ">>> 方案 2: 修改 /etc/localtime 软链接..."
    rm -f /etc/localtime
    ln -s "/usr/share/zoneinfo/$TARGET_TZ" /etc/localtime
    echo "$TARGET_TZ" > /etc/timezone
    export TZ="$TARGET_TZ"
    if is_tz_correct; then log_info "方案 2 成功！"; return; fi
    
    # 方案 3: 强制复制
    log_info ">>> 方案 3: 强制复制文件..."
    rm -f /etc/localtime
    cp "/usr/share/zoneinfo/$TARGET_TZ" /etc/localtime
    if is_tz_correct; then log_info "方案 3 成功！"; return; fi
    
    # 最终方案: 手动
    log_warn "自动时区配置失败！启动手动配置..."
    log_warn "请选择: Asia -> Shanghai"
    echo "按回车键继续..."
    read -r
    sudo dpkg-reconfigure tzdata
    
    if is_tz_correct; then
        log_info "手动配置成功！"
    else
        log_error "时区配置仍然失败。"
    fi
}

# --- 安装步骤 ---

config_apt_preferences() {
    mkdir -p /etc/apt/preferences.d/
    cat > /etc/apt/preferences.d/99optimize-jammy <<EOF
Package: *
Pin: release n=jammy
Pin-Priority: 1001

Package: *
Pin: release n=focal
Pin-Priority: 400
EOF
}

setup_sources_list() {
    [ -z "$CURRENT_MIRROR" ] && select_mirror
    local mirror_url="$CURRENT_MIRROR"
    
    log_info "生成 sources.list ($mirror_url)..."
    [ ! -f /etc/apt/sources.list.bak_orig ] && cp /etc/apt/sources.list /etc/apt/sources.list.bak_orig
    
    cat > /etc/apt/sources.list <<EOF
# Jamie (22.04)
deb ${mirror_url} jammy main restricted universe multiverse
deb-src ${mirror_url} jammy main restricted universe multiverse
deb ${mirror_url} jammy-security main restricted universe multiverse
deb-src ${mirror_url} jammy-security main restricted universe multiverse
deb ${mirror_url} jammy-updates main restricted universe multiverse
deb-src ${mirror_url} jammy-updates main restricted universe multiverse
deb ${mirror_url} jammy-backports main restricted universe multiverse
deb-src ${mirror_url} jammy-backports main restricted universe multiverse

# Focal (20.04) Compatible
deb ${mirror_url} focal main restricted universe multiverse
deb ${mirror_url} focal-updates main restricted universe multiverse
deb ${mirror_url} focal-backports main restricted universe multiverse
deb http://security.ubuntu.com/ubuntu/ focal-security main restricted universe multiverse
EOF

    # MongoDB
    rm -f /etc/apt/sources.list.d/mongodb-*.list
    local key_ok=false
    if curl -fsSL https://pgp.mongodb.com/server-4.4.asc | sudo apt-key add - 2>/dev/null; then key_ok=true;
    elif sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 656408E390CFB1B5 2>/dev/null; then key_ok=true; fi
    
    if [ "$key_ok" = true ]; then
        echo "deb [ arch=amd64,arm64 ] https://repo.mongodb.org/apt/ubuntu focal/mongodb-org/4.4 multiverse" > /etc/apt/sources.list.d/mongodb-org-4.4.list
    else
        echo "deb [trusted=yes] https://repo.mongodb.org/apt/ubuntu focal/mongodb-org/4.4 multiverse" > /etc/apt/sources.list.d/mongodb-org-4.4.list
    fi

    # Jiasion
    rm -rf jiasion.gpg-key*
    wget -T 10 -t 2 http://139.155.232.120/jiasion.gpg-key.asc && sudo apt-key add jiasion.gpg-key.asc
    echo "deb [trusted=yes] http://139.155.232.120/mirror ./ " > /etc/apt/sources.list.d/jiasion.list
    echo 'Acquire { https::Verify-Peer false }' > /etc/apt/apt.conf.d/99verify-peer.conf
}

install_libssl() {
    local url_a="http://download.jiasion.cn/mirror/libssl1.1_1.1.1-1ubuntu2.1~18.04.23_amd64.deb"
    local url_b="http://archive.ubuntu.com/ubuntu/pool/main/o/openssl/libssl1.1_1.1.1f-1ubuntu2_amd64.deb"
    
    if wget -T 15 -c "$url_a" -O libssl1.1.deb; then log_info "libssl 下载成功 (主源)";
    elif wget -T 20 -c "$url_b" -O libssl1.1.deb; then log_info "libssl 下载成功 (备用源)";
    else log_error "libssl 下载失败"; return 1; fi
    sudo dpkg -i libssl1.1.deb
}

install_dependencies() {
    log_info "更新缓存..."
    if ! apt-get update -y; then log_error "APT Update 失败，中止安装。"; exit 1; fi

    dpkg --configure -a
    apt-get install -f -y

    local deps="ca-certificates mosquitto ffmpeg gstreamer1.0-plugins-base gstreamer1.0-plugins-good gstreamer1.0-plugins-bad gstreamer1.0-libav gstreamer1.0-tools gstreamer1.0-x gstreamer1.0-alsa gstreamer1.0-gl gstreamer1.0-gtk3 gstreamer1.0-qt5 gstreamer1.0-pulseaudio python3-pip python3-websockify ntp pkg-config libopus-dev libopusfile-dev"
    if ! apt-get install -y $deps; then
        log_warn "依赖安装重试..."
        apt-get install --fix-missing -y
        apt-get install -y $deps
        ensure_success "依赖安装失败"
    fi
}

# --- 主流程 ---

run_install() {
    if [ "$UBUNTU_CODENAME" != "22.04" ]; then log_error "仅支持 Ubuntu 22.04"; exit 1; fi

    check_network
    config_apt_preferences
    setup_sources_list
    install_libssl || exit 1
    install_dependencies
    
    # 时区配置 (新功能)
    configure_timezone

    log_info "安装 jsserver..."
    local pkg_name="jsserver"
    [ ! -z "$version" ] && pkg_name="jsserver=${version}"
    apt-get -y install "$pkg_name"
    ensure_success "jsserver 安装失败"
    
    log_info "启动 mongod..."
    systemctl enable mongod.service
    systemctl start mongod
    
    # 移除了 jsthrdserver 的重启代码
    
    log_info '--------------------------------'
    log_info '   佳石服务器部署完成！SUCCESS   '
    log_info '--------------------------------'
}

run_reinstall() {
    log_info "卸载旧版服务..."
    # 移除了 jsthrdserver 的 stop 命令
    apt-get remove -y jsserver
    run_install
}

case "$type" in
    "install") run_install ;;
    "reinstall") run_reinstall ;;
    *) echo "Usage: $0 {install|reinstall} [version]"; exit 1 ;;
esac
