#!/bin/bash

# set -e

selected_csum_serial=""
selected_mount_mode=""

# 获取指定标签对应的分区设备文件
# 用法: get_partition_by_label <LABEL>
# 示例: get_partition_by_label SYSBOOT
get_partition_by_label() {
    local label="$1"
    local device=""

    # 检查标签是否为空
    if [[ -z "$label" ]]; then
        echo "错误：必须提供分区标签" >&2
        return 1
    fi

    # 通过blkid查找设备
    if device=$(blkid -l -o device -t LABEL="$label" 2>/dev/null); then
        if [[ -n "$device" ]]; then
            echo "$device"
            return 0
        fi
    fi

    # 最终尝试通过/dev/disk/by-label查找
    if [[ -e "/dev/disk/by-label/$label" ]]; then
        readlink -f "/dev/disk/by-label/$label"
        return 0
    fi

    echo "错误：未找到标签为 '$label' 的分区" >&2
    return 1
}

# 交互式目录选择
function select_dir() {
    local dirs=()
    local count=0
    local choice

    # 收集所有子目录
    for d in *; do
        if [[ -d "$d" ]]; then
            dirs+=("$d")
            ((count++)) || true
        fi
    done

    # 如果没有子目录则退出
    if [[ $count -eq 0 ]]; then
        echo "当前环境下没有部署点！"
        return 1
    fi

    # 显示目录列表
    echo "可用部署点："
    for ((i=0; i<count; i++)); do
        printf "%2d) %s\n" $((i+1)) "${dirs[$i]}"
    done
    echo " 0) 退出"

    # 用户选择
    while true; do
        read -p "请选择部署点编号 [0-$count]: " choice
        if [[ "$choice" =~ ^[0-9]+$ ]]; then
            if ((choice >= 0 && choice <= count)); then
                break
            fi
        fi
        echo "无效输入，请输入0到$count之间的数字！"
    done

    # 执行跳转或退出
    if ((choice == 0)); then
        echo "取消选择。"
        return 1
    else
        cd "${dirs[$((choice-1))]}" || {
            echo "无法进入部署点 ${dirs[$((choice-1))]}"
            return 1
        }
        selected_csum_serial="${dirs[$((choice-1))]}"
        echo "已进入部署点: $(pwd)"
    fi
}

function select_mount_mode() {
    echo "请选择挂载模式:"
    echo "1) 用户模式"
    echo "2) 运维模式"
    echo "0) 退出"

    local modes=("user" "maintain")

    while true; do
        read -p "请输入编号 [0-2]: " choice
        if [[ "$choice" =~ ^[0-9]+$ ]]; then
            if ((choice >= 0 && choice <= 2)); then
                break
            fi
        fi
        echo "无效输入，请输入0到2之间的数字！"
    done

    # 执行跳转或退出
    if ((choice == 0)); then
        echo "取消选择。"
        return 1
    else
        # case $choice in
        #     1) maintain_mode_mount ;;
        #     2) user_mode_mount ;;
        #     *) echo "无效选择！" ;;
        # esac
        selected_mount_mode="${modes[$((choice-1))]}"
        echo "已选择挂载模式: ${selected_mount_mode}"
    fi
}


# 示例调用
# echo "ESP分区:     $(get_partition_by_label ESP || echo '未找到')"
# echo "SYSBOOT分区: $(get_partition_by_label SYSBOOT || echo '未找到')"
# echo "SYSROOT分区: $(get_partition_by_label SYSROOT || echo '未找到')"
# echo "DATA分区:    $(get_partition_by_label DATA || echo '未找到')"


# 获取各分区名称
partition_esp=$(get_partition_by_label ESP)
partition_sysboot=$(get_partition_by_label SYSBOOT)
partition_sysroot=$(get_partition_by_label SYSROOT)
partition_data=$(get_partition_by_label DATA)

echo "ESP分区:     $(if [ -n "$partition_esp" ]; then echo "$partition_esp"; else echo "未找到"; fi)"
echo "SYSBOOT分区: $(if [ -n "$partition_sysboot" ]; then echo "$partition_sysboot"; else echo "未找到"; fi)"
echo "SYSROOT分区: $(if [ -n "$partition_sysroot" ]; then echo "$partition_sysroot"; else echo "未找到"; fi)"
echo "DATA分区:    $(if [ -n "$partition_data" ]; then echo "$partition_data"; else echo "未找到"; fi)"

# 不可变系统挂载
if [ ! -d "/target" ]; then
    mkdir /target
fi

if [ ! -d "/data" ]; then
    mkdir /data
fi

mount $partition_sysroot /target
mount $partition_data /data

# 选择部署点和挂载模式
cd /target/ostree/deploy/kylin/deploy
select_dir
select_mount_mode

mount --bind /target sysroot
mount --bind /data/root root
mount --bind /data/home home
mkdir -p run/dbus
mount --bind /run/dbus run/dbus

if [ "$selected_csum_serial" == "*.0" ]; then
    mount $partition_sysboot boot
    if [ -n "$partition_esp" ]; then
        mount $partition_esp boot/efi
    fi
fi

export deploy_serial="$selected_csum_serial"
export mount_mode="$selected_mount_mode"

chroot . /bin/bash << 'EOF'
mount -t proc proc /proc
mount -t sysfs sys /sys
mount -t devtmpfs devtmpfs /dev
mount -t devpts devpts /dev/pts

if [ ! -d "/var/lib" ]; then
    mkdir -p /var/lib
fi

OSTREE_OVL=/ostree/pkgs/ovl-${deploy_serial}
rootmnt=/ostree/deploy/kylin/deploy/${deploy_serial}
# echo $OSTREE_OVL
# echo $rootmnt

##运维模式挂载
maintain_mode_mount()
{
    mount -t overlay overlay -o lowerdir=${OSTREE_OVL}/etc-ovl/etc-upper:${OSTREE_OVL}/etc-ovl/etc-lower:${rootmnt}/etc,upperdir=${OSTREE_OVL}/etc-ovl/etc-tmpupper,workdir=${OSTREE_OVL}/etc-ovl/etc-work ${rootmnt}/etc

    mount -t overlay overlay -o lowerdir=${OSTREE_OVL}/usr-ovl/usr-lower:${rootmnt}/usr,upperdir=${OSTREE_OVL}/usr-ovl/usr-tmpupper,workdir=${OSTREE_OVL}/usr-ovl/usr-work ${rootmnt}/usr

    mount -t overlay overlay -o lowerdir=${OSTREE_OVL}/var-ovl/var-upper/lib:${OSTREE_OVL}/var-ovl/var-lower/lib:${rootmnt}/var/lib,upperdir=${OSTREE_OVL}/var-ovl/var-tmpupper/lib,workdir=${OSTREE_OVL}/var-ovl/var-work/lib ${rootmnt}/var/lib

}

##用户模式挂载
user_mode_mount()
{
    mount -t overlay overlay -o lowerdir=${OSTREE_OVL}/etc-ovl/etc-lower:${rootmnt}/etc,upperdir=${OSTREE_OVL}/etc-ovl/etc-upper,workdir=${OSTREE_OVL}/etc-ovl/etc-work ${rootmnt}/etc

    mount -t overlay overlay -o lowerdir=${OSTREE_OVL}/usr-ovl/usr-lower:${rootmnt}/usr,workdir=${OSTREE_OVL}/usr-ovl/usr-work ${rootmnt}/usr

    mount -t overlay overlay -o lowerdir=${OSTREE_OVL}/var-ovl/var-lower/lib:${rootmnt}/var/lib,upperdir=${OSTREE_OVL}/var-ovl/var-upper/lib,workdir=${OSTREE_OVL}/var-ovl/var-work/lib ${rootmnt}/var/lib

}

if [ "$mount_mode" == "maintain" ]; then
    maintain_mode_mount
elif [ "$mount_mode" == "user" ]; then
    user_mode_mount
else
    echo "无效的挂载模式: ${mount_mode}"
fi
EOF

chroot .

cd /

umount -R /target
umount -R /data
