#!/bin/bash

# Màu
RED='\e[31m'; GREEN='\e[32m'; YELLOW='\e[33m'; BLUE='\e[34m'; CYAN='\e[36m'; BOLD='\e[1m'; NC='\e[0m'

# Phải chạy với root
if [ "$EUID" -ne 0 ]; then
    echo -e "${RED}[LỖI]${NC} Vui lòng chạy script với quyền root!"
    exit 1
fi

# Kiểm tra lệnh cần thiết
for cmd in growpart pvresize vgs lvs lvextend resize2fs xfs_growfs lsblk findmnt; do
    if ! command -v $cmd >/dev/null 2>&1; then
        echo -e "${RED}[LỖI]${NC} Thiếu lệnh: ${YELLOW}$cmd${NC} — hãy cài trước!"
        exit 1
    fi
done

echo -e "${CYAN}▶ BƯỚC 1: Tìm Physical Volume đang dùng...${NC}"
PV=$(pvs --noheadings -o pv_name | awk '{$1=$1};1' | head -n1)
if [ -z "$PV" ]; then
    echo -e "${RED}[LỖI]${NC} Không tìm thấy Physical Volume!"
    exit 1
fi
VG=$(pvs --noheadings -o vg_name "$PV" | awk '{$1=$1};1')
echo -e "${GREEN}[OK]${NC} Tìm thấy PV: ${YELLOW}$PV${NC} trong VG: ${YELLOW}$VG${NC}"

# Mở rộng phân vùng
echo -e "${CYAN}▶ BƯỚC 2: Mở rộng partition trên disk...${NC}"
DISK=$(lsblk -no pkname "$PV" | head -n1)
PART_NUM=$(echo "$PV" | grep -o '[0-9]*$')
echo -e "${BLUE}Grow partition ${YELLOW}/dev/$DISK $PART_NUM${NC}"
growpart "/dev/$DISK" "$PART_NUM" || { echo -e "${RED}[LỖI] growpart thất bại${NC}"; exit 1; }

# Resize PV
echo -e "${CYAN}▶ BƯỚC 3: Resize Physical Volume ${YELLOW}$PV${NC}..."
pvresize "$PV" || { echo -e "${RED}[LỖI] pvresize thất bại${NC}"; exit 1; }

# Kiểm tra dung lượng trống
VGFREE=$(vgs --noheadings -o vg_free "$VG" | awk '{$1=$1};1')
echo -e "${GREEN}[OK]${NC} Dung lượng VG ${YELLOW}$VG${NC} hiện còn trống: ${YELLOW}$VGFREE${NC}"

# Hiển thị các Logical Volume
echo -e "\n${CYAN}▶ BƯỚC 4: Chọn Logical Volume để mở rộng${NC}"
lvs --noheadings -o lv_name,vg_name,lv_path | awk '{$1=$1};1'
read -p "$(echo -e "${BOLD}Nhập tên Logical Volume (vd: centos-root): ${NC}")" LV_INPUT
VG_PART=$(echo "$LV_INPUT" | cut -d'-' -f1)
LV_PART=$(echo "$LV_INPUT" | cut -d'-' -f2)
LV_PATH="/dev/${VG_PART}/${LV_PART}"

if [ ! -e "$LV_PATH" ]; then
    echo -e "${RED}[LỖI]${NC} Không tìm thấy Logical Volume tại ${YELLOW}$LV_PATH${NC}"
    exit 1
fi

# Hỏi kích thước
read -p "$(echo -e "${BOLD}Bạn muốn mở rộng thêm bao nhiêu? (vd: 5G, 500M hoặc 100%): ${NC}")" EXTEND_INPUT

if [[ "$EXTEND_INPUT" == "100%" ]]; then
    echo -e "${CYAN}▶ Mở rộng toàn bộ dung lượng còn lại...${NC}"
    lvextend -l +100%FREE "$LV_PATH" || exit 1
else
    echo -e "${CYAN}▶ Mở rộng thêm ${YELLOW}$EXTEND_INPUT${NC}..."
    lvextend -L +$EXTEND_INPUT "$LV_PATH" || exit 1
fi

# Resize filesystem
echo -e "${CYAN}▶ BƯỚC 5: Resize Filesystem...${NC}"
FS_TYPE=$(lsblk -no FSTYPE "$LV_PATH")
MOUNT_POINT=$(findmnt -n -o TARGET "$LV_PATH")

if [ -z "$MOUNT_POINT" ]; then
    echo -e "${RED}[LỖI]${NC} Không tìm thấy mount point cho ${YELLOW}$LV_PATH${NC}"
    exit 1
fi

if [ "$FS_TYPE" == "xfs" ]; then
    echo -e "${BLUE}Filesystem là XFS → xfs_growfs tại ${YELLOW}$MOUNT_POINT${NC}"
    xfs_growfs "$MOUNT_POINT"
elif [[ "$FS_TYPE" == ext* ]]; then
    echo -e "${BLUE}Filesystem là EXT → resize2fs${NC}"
    resize2fs "$LV_PATH"
else
    echo -e "${RED}[LỖI]${NC} Không hỗ trợ filesystem loại: ${YELLOW}$FS_TYPE${NC}"
    exit 1
fi

echo -e "\n${GREEN}✅ Hoàn tất mở rộng Logical Volume thành công!${NC}"

