#!/usr/bin/env bash
set -e

# Colors for prompts
GREEN="\033[1;32m"
YELLOW="\033[1;33m"
NC="\033[0m"

echo -e "${GREEN}=== Arch Linux Interactive Installer ===${NC}"

# --- Prompt user for input ---
read -rp "Enter target disk (e.g. /dev/sda): " DISK
read -rp "Enter hostname: " HOSTNAME
read -rp "Enter username: " USERNAME
read -rsp "Enter password for $USERNAME: " USERPASS
echo
read -rsp "Enter root password: " ROOTPASS
echo

# --- Detect boot type ---
if [[ -d /sys/firmware/efi/efivars ]]; then
    BOOT_TYPE="UEFI"
else
    BOOT_TYPE="BIOS"
fi
echo -e "${YELLOW}Detected boot type: $BOOT_TYPE${NC}"

# --- Detect CPU vendor ---
CPU_VENDOR=$(lscpu | awk -F: '/Vendor ID/ {print $2}' | xargs)
if grep -q hypervisor /proc/cpuinfo; then
    VM=true
    echo -e "${YELLOW}Virtual machine detected - skipping microcode install${NC}"
else
    VM=false
fi

# --- Partition disk ---
echo -e "${YELLOW}Partitioning $DISK...${NC}"
sgdisk --zap-all "$DISK"

if [[ "$BOOT_TYPE" == "UEFI" ]]; then
    # EFI partitioning
    parted -s "$DISK" mklabel gpt
    parted -s "$DISK" mkpart ESP fat32 1MiB 513MiB
    parted -s "$DISK" set 1 esp on
    parted -s "$DISK" mkpart primary ext4 513MiB 100%
    EFI_PART="${DISK}1"
    ROOT_PART="${DISK}2"
else
    # BIOS partitioning
    parted -s "$DISK" mklabel msdos
    parted -s "$DISK" mkpart primary ext4 1MiB 100%
    parted -s "$DISK" set 1 boot on
    ROOT_PART="${DISK}1"
fi

# --- Format partitions ---
echo -e "${YELLOW}Formatting partitions...${NC}"
if [[ "$BOOT_TYPE" == "UEFI" ]]; then
    mkfs.fat -F32 "$EFI_PART"
fi
mkfs.ext4 "$ROOT_PART"

# --- Mount ---
mount "$ROOT_PART" /mnt
mkdir -p /mnt/boot
if [[ "$BOOT_TYPE" == "UEFI" ]]; then
    mkdir -p /mnt/boot/efi
    mount "$EFI_PART" /mnt/boot/efi
fi

# --- Base system install ---
PKGS="base linux linux-firmware nano vim networkmanager"
PKGS+=" xorg xorg-xinit bspwm sxhkd rofi lightdm lightdm-mini-greeter"
PKGS+=" ttf-dejavu" # font
if ! $VM; then
    if [[ "$CPU_VENDOR" == "GenuineIntel" ]]; then
        PKGS+=" intel-ucode"
    elif [[ "$CPU_VENDOR" == "AuthenticAMD" ]]; then
        PKGS+=" amd-ucode"
    fi
fi

# Best Wi-Fi package
PKGS+=" iwd"

echo -e "${YELLOW}Installing base system...${NC}"
pacstrap /mnt $PKGS grub

# --- Fstab ---
genfstab -U /mnt >> /mnt/etc/fstab

# --- Chroot & configure ---
arch-chroot /mnt /bin/bash <<EOF
set -e
echo "$HOSTNAME" > /etc/hostname

# Hosts file
cat <<HOSTS > /etc/hosts
127.0.0.1   localhost
::1         localhost
127.0.1.1   $HOSTNAME.localdomain $HOSTNAME
HOSTS

# Timezone & locale
ln -sf /usr/share/zoneinfo/$(curl -s https://ipapi.co/timezone) /etc/localtime || ln -sf /usr/share/zoneinfo/Australia/Melbourne /etc/localtime
hwclock --systohc
sed -i 's/^#en_US.UTF-8/en_US.UTF-8/' /etc/locale.gen
locale-gen
echo "LANG=en_US.UTF-8" > /etc/locale.conf

# Enable services
systemctl enable NetworkManager
systemctl enable lightdm

# LightDM mini greeter config
mkdir -p /etc/lightdm
cat <<LDMCFG > /etc/lightdm/lightdm.conf
[Seat:*]
greeter-session=lightdm-mini-greeter
user-session=bspwm
LDMCFG

mkdir -p /etc/lightdm
cat <<MINICFG > /etc/lightdm/lightdm-mini-greeter.conf
[greeter]
show-password-label=false
password-hint-enabled=false
MINICFG

# BSPWM & SXHKD config
mkdir -p /home/$USERNAME/.config/{bspwm,sxhkd}
cp /usr/share/doc/bspwm/examples/bspwmrc /home/$USERNAME/.config/bspwm/
cp /usr/share/doc/bspwm/examples/sxhkdrc /home/$USERNAME/.config/sxhkd/
chmod +x /home/$USERNAME/.config/bspwm/bspwmrc

# Create user
useradd -m -G wheel -s /bin/bash "$USERNAME"
echo "$USERNAME:$USERPASS" | chpasswd
echo "root:$ROOTPASS" | chpasswd

# Allow wheel group sudo
sed -i 's/^# %wheel ALL=(ALL) ALL/%wheel ALL=(ALL) ALL/' /etc/sudoers

# Bootloader
if [[ "$BOOT_TYPE" == "UEFI" ]]; then
    pacman --noconfirm -S grub efibootmgr
    grub-install --target=x86_64-efi --efi-directory=/boot/efi --bootloader-id=GRUB
else
    grub-install --target=i386-pc "$DISK"
fi
grub-mkconfig -o /boot/grub/grub.cfg

EOF

echo -e "${GREEN}Installation complete! You can now reboot.${NC}"
