#!/bin/bash
# ============================================================
# i-KVM 初始化设置脚本 (ikvm)
# 功能: 安装 i-kvm deb 包 / 修改主机名 / 配置网络
# 用法: ./ikvm.sh
# ============================================================

set -euo pipefail

# ============================================================
# 颜色 & 常量
# ============================================================
readonly RED='\033[0;31m'
readonly GREEN='\033[0;32m'
readonly YELLOW='\033[1;33m'
readonly BLUE='\033[0;34m'
readonly CYAN='\033[0;36m'
readonly NC='\033[0m'

readonly DEB_VERSION="0.2.3"
readonly DEB_BASE_URL="http://s.6p7p.com/my/i-kvm"
readonly NEW_HOSTNAME="ikvm"
readonly NM_DIR="/etc/NetworkManager/system-connections"

SUDO=""

# ============================================================
# 工具函数
# ============================================================

say()  { echo -e "$1$2${NC}"; }
ok()   { say "${GREEN}"  "[✓] $1"; }
err()  { say "${RED}"    "[✗] $1"; }
info() { say "${BLUE}"   "[i] $1"; }
warn() { say "${YELLOW}" "[!] $1"; }

banner() {
    echo -e "${CYAN}"
    echo "============================================"
    echo "       i-KVM 初始化设置工具"
    echo "============================================"
    echo -e "${NC}"
}

separator() {
    echo -e "${CYAN}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━${NC}"
}

# ============================================================
# 环境检测
# ============================================================

check_root() {
    if [ "$(id -u)" -ne 0 ]; then
        if command -v sudo &>/dev/null; then
            SUDO="sudo"
        else
            err "需要 root 权限，且系统中未找到 sudo。请以 root 用户运行。"
            exit 1
        fi
    fi
}

# 检测当前物理网卡名称
detect_iface() {
    local iface
    iface=$(ip route show default 2>/dev/null | awk '{print $5; exit}')
    if [ -z "$iface" ]; then
        iface=$(ip link show up 2>/dev/null | awk -F': ' '/^[0-9]+: / && $2!="lo" {print $2; exit}')
    fi
    echo "$iface"
}

# 检测 CPU 架构 → 归一化为 armhf | arm64 | amd64
detect_arch() {
    local arch
    arch=$(uname -m)
    case "$arch" in
        aarch64)              echo "arm64" ;;
        armv7l|armv6l|arm*)   echo "armhf" ;;
        *)                    echo "amd64" ;;
    esac
}

# ============================================================
# 功能 1: 安装 i-kvm deb 包及依赖
# ============================================================

update_apt() {
    separator
    info "正在更新 apt 源 …"
    $SUDO apt update
    ok "apt 源更新完成"
}

install_deb() {
    separator

    info "正在安装 nbd-client …"
    $SUDO apt install -y nbd-client
    ok "nbd-client 安装完成"

    local arch deb_url deb_file
    arch=$(detect_arch)
    deb_url="${DEB_BASE_URL}/i-kvm_${DEB_VERSION}_${arch}.deb"
    deb_file="/tmp/i-kvm_${DEB_VERSION}_${arch}.deb"

    info "检测到架构: ${arch}"
    info "正在下载 i-kvm 安装包 …"
    info "下载地址: ${deb_url}"

    if command -v curl &>/dev/null; then
        curl -fsSL -o "$deb_file" "$deb_url"
    elif command -v wget &>/dev/null; then
        wget -q -O "$deb_file" "$deb_url"
    else
        err "系统中未找到 curl 或 wget，请先安装其中一个。"
        return 1
    fi

    if [ ! -f "$deb_file" ]; then
        err "下载失败"
        return 1
    fi
    ok "下载完成: ${deb_file}"

    info "正在安装 i-kvm deb 包 …"
    $SUDO apt install -y "$deb_file"
    ok "deb 包安装完成"

    info "正在修复依赖关系 …"
    $SUDO apt-get install -f -y
    ok "依赖修复完成"

    # 清理安装包
    rm -f "$deb_file"
}

# ============================================================
# 功能 2: 修改主机名
# ============================================================

change_hostname() {
    separator
    local old_hostname
    old_hostname=$(hostname)

    info "当前主机名: ${old_hostname}"
    info "目标主机名: ${NEW_HOSTNAME}"

    if [ "$old_hostname" = "$NEW_HOSTNAME" ]; then
        ok "主机名已是 ${NEW_HOSTNAME}，无需修改"
        return 0
    fi

    $SUDO hostnamectl set-hostname "$NEW_HOSTNAME"

    # 同步替换 /etc/hosts 中所有旧主机名（127.0.1.1 行 + IPv6 ::1 行等）
    $SUDO sed -i "s/${old_hostname}/${NEW_HOSTNAME}/g" /etc/hosts

    ok "主机名已修改为: ${NEW_HOSTNAME}"
}

# ============================================================
# 功能 3: 配置 NetworkManager 网络连接
# ============================================================

setup_nm_connection() {
    separator
    info "正在配置 NetworkManager 网络连接 …"

    local iface
    iface=$(detect_iface)
    if [ -z "$iface" ]; then
        err "无法检测到网络接口"
        return 1
    fi
    info "检测到物理网卡: ${iface}"

    # 创建新连接
    info "正在创建 NetworkManager 连接 …"
    $SUDO nmcli connection add \
        type ethernet \
        ifname "${iface}" \
        con-name "${iface}" \
        ipv4.method auto \
        ipv4.addresses 10.10.4.4/24 \
        ipv4.dns "223.5.5.5 8.8.8.8" \
        ipv4.ignore-auto-dns yes \
        ipv6.method auto

    # nmcli 可能生成带 UUID 的文件名，重命名为 ${iface}.nmconnection
    local target="${NM_DIR}/${iface}.nmconnection"
    local generated
    generated=$($SUDO ls -t "${NM_DIR}"/*.nmconnection 2>/dev/null | head -1)

    if [ -n "$generated" ] && [ "$generated" != "$target" ]; then
        $SUDO mv "$generated" "$target"
        info "配置文件已重命名: $(basename "$generated") → ${iface}.nmconnection"
    fi

    # 设置权限 600 及 root 归属
    $SUDO chmod 600 "$target"
    $SUDO chown root:root "$target"
    ok "NetworkManager 连接配置完成 → ${target}"
}


# ============================================================
# 主入口
# ============================================================

main() {
    banner
    check_root

    echo ""
    info "即将执行以下操作:"
    echo "  1. 更新 apt 源并安装 i-kvm deb 包及依赖 (nbd-client)"
    echo "  2. 修改主机名为: ${NEW_HOSTNAME}"
    echo "  3. 配置 NetworkManager 网络连接 (DHCP + 静态IP + DNS)"
    echo ""

    read -r -p "确认执行? [y/N]: " confirm
    case "$confirm" in
        y|Y|yes|YES)
            ;;
        *)
            echo "已取消。"
            exit 0
            ;;
    esac

    update_apt
    install_deb
    change_hostname
    setup_nm_connection

    echo ""
    separator
    ok "i-KVM 初始化设置全部完成！"
    separator
    echo ""

    # 重启确认
    read -r -p "是否立即重启系统? [y/N]: " reboot_confirm
    case "$reboot_confirm" in
        y|Y)
            info "系统将在 3 秒后重启 …"
            sleep 3
            $SUDO reboot
            ;;
        *)
            warn "请稍后手动重启系统以使更改生效: sudo reboot"
            ;;
    esac
}

main "$@"
