#!/bin/bash
set -euo pipefail

#----------------------------------------------------------
# 用户配置部分
#----------------------------------------------------------
DISKS=("/dev/vdb" "/dev/vdc" "/dev/vdd" "/dev/vde")   # 4块物理磁盘
MOUNT_PATH="/var/lib/docker"                         # 挂载点路径（目录会自动创建）
FS_TYPE="ext4"                                        # 文件系统类型（支持 ext4/xfs，默认 ext4）

VG_NAME="datavg"                                      # 卷组名
LV_NAME="lvdata"                                      # 逻辑卷名

#----------------------------------------------------------
# 核心逻辑（建议非必要不修改）
#----------------------------------------------------------

function check_prerequisites() {
  # 必须 root 权限运行检查
  [[ $EUID -ne 0 ]] && echo -e "\033[31m错误：必须使用 root 权限运行此脚本\033[0m" && exit 1

  # 文件系统类型校验
  if [[ "$FS_TYPE" != "ext4" && "$FS_TYPE" != "xfs" ]]; then
    echo -e "\033[31m错误：不支持的磁盘格式 $FS_TYPE，仅支持 ext4/xfs\033[0m"
    exit 1
  fi

  # 磁盘存在性检查
  for disk in "${DISKS[@]}"; do
    [[ ! -b "$disk" ]] && echo -e "\033[31m错误：磁盘 $disk 不存在\033[0m" && exit 1
  done

  # 检查 VG / LV 是否已存在，避免误操作
  if vgdisplay "$VG_NAME" >/dev/null 2>&1; then
    echo -e "\033[31m错误：卷组 $VG_NAME 已存在，请先检查环境\033[0m"
    exit 1
  fi

  if lvdisplay "/dev/${VG_NAME}/${LV_NAME}" >/dev/null 2>&1; then
    echo -e "\033[31m错误：逻辑卷 /dev/${VG_NAME}/${LV_NAME} 已存在，请先检查环境\033[0m"
    exit 1
  fi
}

function prepare_disks() {
  PARTITIONS=()

  echo -e "\033[34m正在初始化磁盘分区...\033[0m"
  for disk in "${DISKS[@]}"; do
    echo -e "\033[34m处理磁盘: $disk\033[0m"

    parted "$disk" --script mklabel gpt
    parted "$disk" --script mkpart primary 0% 100%
    parted "$disk" --script set 1 lvm on
    partprobe "$disk"

    # 兼容 nvme 和普通 sd/vd 设备命名
    if [[ "$disk" =~ nvme ]]; then
      partition="${disk}p1"
    else
      partition="${disk}1"
    fi

    # 等待分区节点出现
    udevadm settle
    sleep 1

    [[ ! -b "$partition" ]] && echo -e "\033[31m错误：分区 $partition 未识别成功\033[0m" && exit 1

    PARTITIONS+=("$partition")
  done
}

function create_lvm() {
  echo -e "\033[34m正在创建 LVM 结构...\033[0m"

  pvcreate "${PARTITIONS[@]}"
  vgcreate "$VG_NAME" "${PARTITIONS[@]}"
  lvcreate -y -l 100%FREE -n "$LV_NAME" "$VG_NAME"
}

function format_and_mount() {
  local lv_path="/dev/${VG_NAME}/${LV_NAME}"

  echo -e "\033[34m格式化逻辑卷...\033[0m"
  if [[ "$FS_TYPE" == "ext4" ]]; then
    mkfs.ext4 -F "$lv_path"
  else
    mkfs.xfs -f "$lv_path"
  fi

  echo -e "\033[34m设置挂载配置...\033[0m"
  mkdir -p "$MOUNT_PATH"

  UUID=$(blkid -s UUID -o value "$lv_path")
  [[ -z "$UUID" ]] && echo -e "\033[31m错误：未获取到逻辑卷 UUID\033[0m" && exit 1

  # 避免重复写入 fstab
  if ! grep -q "$UUID" /etc/fstab; then
    echo "UUID=$UUID $MOUNT_PATH $FS_TYPE defaults 0 0" >> /etc/fstab
  else
    echo -e "\033[33m提示：/etc/fstab 中已存在该 UUID，跳过写入\033[0m"
  fi

  mount -a
}

function verify_result() {
  echo -e "\n\033[1;36m最终验证结果：\033[0m"

  echo -e "\n\033[1;36m1. 查看块设备和 LVM 结构：\033[0m"
  lsblk -f

  echo -e "\n\033[1;36m2. 查看挂载结果：\033[0m"
  df -hT "$MOUNT_PATH"

  echo -e "\n\033[1;36m3. 查看 VG/LV 信息：\033[0m"
  vgs
  lvs
  pvs
}

#----------------------------------------------------------
# 主执行流程
#----------------------------------------------------------
check_prerequisites
prepare_disks
create_lvm
format_and_mount
verify_result

echo -e "\n\033[32m操作执行完毕，请仔细核查上述输出信息\033[0m"