#!/bin/bash

. parse-args "$@"

disk="/opt/dev/vm/${NAME-default}/disk.qcow2"
vars="/opt/dev/vm/${NAME-default}/OVMF_VARS_4M.fd"
bridge="${BR-bridge0}"
iso="${ISO-}"
firmware="${FIRMWARE-ovmf}"



if [[ -n "${CREATE-}" ]]; then
  mkdir -p "$(dirname "$disk")"
  qemu-img create -f qcow2 "$disk" "$CREATE"
fi

USB_LINE=()
if [[ -n "${USB-}" ]]; then
  USB_LINE+=( -device "usb-host,vendorid=0x${USB%:*},productid=0x${USB#*:}" )
fi

DISK_BOOTINDEX=1
if [[ -n "$iso" ]]; then
  DISK_BOOTINDEX=2
fi

DISK_LINE=(
  -drive if=none,id=disk,file="$disk",format=qcow2,cache=writeback,aio=threads
  -device virtio-blk-pci,drive=disk,bootindex="$DISK_BOOTINDEX"
)

CDROM_LINE=()
if [[ -n "$iso" ]]; then
  CDROM_LINE+=(
    -drive if=none,id=cdrom,file="$iso",media=cdrom,readonly=on
    -device ide-cd,drive=cdrom,bootindex=1
  )
fi

sudo mkdir -p /etc/qemu
if ! sudo grep -qxF "allow $bridge" /etc/qemu/bridge.conf 2>/dev/null; then
  echo "allow $bridge" | sudo tee -a /etc/qemu/bridge.conf >/dev/null
fi

FIRMWARE_LINE=()
case "$firmware" in
  ovmf)
    if [[ ! -e "$vars" ]]; then
      mkdir -p "$(dirname "$vars")"
      cp /usr/share/OVMF/OVMF_VARS_4M.fd "$vars"
    fi
    FIRMWARE_LINE+=(
      -drive if=pflash,format=raw,readonly=on,file=/usr/share/OVMF/OVMF_CODE_4M.fd
      -drive if=pflash,format=raw,file="$vars"
    )
    ;;
  seabios)
    FIRMWARE_LINE+=( -bios /usr/share/seabios/bios-256k.bin )
    ;;
  *)
    FIRMWARE_LINE+=( -bios "$firmware" )
    ;;
esac


sudo qemu-system-x86_64 \
  -enable-kvm \
  -m ${GB-12}G \
  -smp ${CPUS-4} \
  -cpu host \
  -machine q35 \
  "${FIRMWARE_LINE[@]}" \
  "${DISK_LINE[@]}" \
  -device qemu-xhci \
  "${USB_LINE[@]}" \
  "${CDROM_LINE[@]}" \
  -device virtio-net-pci,netdev=net0,rombar=0 \
  -netdev bridge,id=net0,br="$bridge" \
  -display ${DISPLAY_VM-gtk} \
  -serial mon:stdio
