#!/bin/bash
set -euo pipefail

# ─────────────────────────────────────────────
# Preflight checks
# ─────────────────────────────────────────────
[[ $EUID -eq 0 ]] || { echo "ERROR: Script must be run as root"; exit 1; }
[[ -b /dev/sda ]]  || { echo "ERROR: /dev/sda not found"; exit 1; }

# ─────────────────────────────────────────────
# Install dependencies
# ─────────────────────────────────────────────
apt update -y && apt upgrade -y
apt install -y grub2 wimtools ntfs-3g gdisk

# ─────────────────────────────────────────────
# Disk sizing via lsblk (no disk label required)
# ─────────────────────────────────────────────
disk_size_mb=$(lsblk -b -dn -o SIZE /dev/sda | awk '{print int($1/1024/1024)}')

[[ -n "$disk_size_mb" && "$disk_size_mb" -gt 0 ]] \
    || { echo "ERROR: Could not determine disk size"; exit 1; }

part_size_mb=$((disk_size_mb / 2))
part1_end_mb=$((part_size_mb))
part2_end_mb=$((disk_size_mb - 1))

echo "Disk: ${disk_size_mb}MB | Each partition: ${part_size_mb}MB"

# ─────────────────────────────────────────────
# Wipe and partition the disk
# ─────────────────────────────────────────────
wipefs -a /dev/sda
parted /dev/sda --script -- mklabel gpt
parted /dev/sda --script -- mkpart primary ntfs 1MB "${part1_end_mb}MB"
parted /dev/sda --script -- mkpart primary ntfs "${part1_end_mb}MB" "${part2_end_mb}MB"

# Notify kernel with retries
for i in 1 2 3; do
    partprobe /dev/sda && break
    echo "WARN: partprobe attempt $i failed, retrying in 10s..."
    sleep 10
done

sleep 5

# ─────────────────────────────────────────────
# gdisk hybrid MBR conversion
# Must happen BEFORE formatting so partitions survive
# ─────────────────────────────────────────────
echo -e "r\ng\np\nw\nY\n" | gdisk /dev/sda

# Re-notify kernel after gdisk
for i in 1 2 3; do
    partprobe /dev/sda && break
    echo "WARN: partprobe attempt $i failed, retrying in 10s..."
    sleep 10
done

sleep 5

# Verify partitions exist before formatting
[[ -b /dev/sda1 ]] || { echo "ERROR: /dev/sda1 missing after gdisk"; exit 1; }
[[ -b /dev/sda2 ]] || { echo "ERROR: /dev/sda2 missing after gdisk"; exit 1; }

# ─────────────────────────────────────────────
# Format partitions
# ─────────────────────────────────────────────
mkfs.ntfs -f /dev/sda1 || { echo "ERROR: Failed to format /dev/sda1"; exit 1; }
mkfs.ntfs -f /dev/sda2 || { echo "ERROR: Failed to format /dev/sda2"; exit 1; }
echo "NTFS partitions created"

# ─────────────────────────────────────────────
# Mount partitions
# ─────────────────────────────────────────────
mount /dev/sda1 /mnt || { echo "ERROR: Failed to mount /dev/sda1"; exit 1; }

mkdir -p ~/windisk
mount /dev/sda2 ~/windisk || { echo "ERROR: Failed to mount /dev/sda2"; exit 1; }

# ─────────────────────────────────────────────
# Install GRUB
# ─────────────────────────────────────────────
grub-install --root-directory=/mnt /dev/sda \
    || { echo "ERROR: grub-install failed"; exit 1; }

mkdir -p /mnt/boot/grub
cat <<'EOF' > /mnt/boot/grub/grub.cfg
set timeout=10
set default=0

menuentry "Windows Server 2022 Installer" {
    insmod ntfs
    insmod part_gpt
    search --set=root --file=/bootmgr
    ntldr /bootmgr
    boot
}
EOF

# ─────────────────────────────────────────────
# Download and copy updated Windows Server 2022 ISO
# (includes latest updates + VirtIO drivers)
# Saved to /dev/sda2 to avoid ramdisk space issues
# ─────────────────────────────────────────────
mkdir -p ~/windisk/winfile

wget -O ~/windisk/2022U.iso \
    --user-agent="Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36" \
    https://india.volyte.com/2022U.iso \
    || { echo "ERROR: Failed to download Windows ISO"; exit 1; }

[[ -s ~/windisk/2022U.iso ]] || { echo "ERROR: Windows ISO is empty"; exit 1; }

mount -o loop ~/windisk/2022U.iso ~/windisk/winfile \
    || { echo "ERROR: Failed to mount Windows ISO"; exit 1; }

rsync -avz --progress ~/windisk/winfile/* /mnt/ \
    || { echo "ERROR: rsync of Windows files failed"; exit 1; }

umount ~/windisk/winfile

# ─────────────────────────────────────────────
# Done
# ─────────────────────────────────────────────
sync
echo "Setup complete. Rebooting..."
reboot