Vagrant.configure('2') do |config|

  # Default: $env:DEV = "false" ; $env:LOCATION = "remote"
  # DEV: $env:DEV = "true" ; $env:LOCATION = "local" ; vagrant up

  # ---------- Hyper-V ----------
  config.vm.define 'hyper-v_vm' do |hv_vm|
    hv_vm.vm.box      = 'generic/debian12'
    hv_vm.vm.hostname = 'WiFiChallengeLab'

    hv_vm.vm.provider 'hyperv' do |hv|
      hv.vmname    = 'WiFiChallenge Lab v2.3'
      hv.maxmemory = 4096
      hv.memory    = 4096
      hv.cpus      = 4
    end

    hv_vm.vm.provision 'shell',
      inline: <<-SHELL,
        set -e
        apt-get update -y
        DEBIAN_FRONTEND=noninteractive apt-get full-upgrade -y
      SHELL
      privileged: true,
      run: 'once'

    hv_vm.vm.provision 'reload', name: 'Reboot after update kernel'

    hv_vm.vm.provision 'shell',
      path: './install.sh',
      args: [ENV['DEV'], ENV['LOCATION']],
      privileged: true
  end

  # ---------- VirtualBox ----------
  config.vm.define 'virtualbox_vm' do |vb_vm|
    vb_vm.vm.box      = 'generic/debian12'
    vb_vm.vm.hostname = 'WiFiChallengeLab'

    vb_vm.vm.provider 'virtualbox' do |vb|
      vb.memory = 4096
      vb.cpus   = 4
      vb.name   = 'WiFiChallenge Lab v2.3'
      vb.customize ["modifyvm", :id, "--graphicscontroller", "vmsvga"]
      vb.check_guest_additions = false
      vb.functional_vboxsf = false
    end

    # Try to locate the GA ISO on the host and upload it to the guest
    host_ga_iso =
      if RUBY_PLATFORM =~ /mswin|mingw|cygwin/
        'C:/Program Files/Oracle/VirtualBox/VBoxGuestAdditions.iso'
      elsif RUBY_PLATFORM =~ /darwin/
        '/Applications/VirtualBox.app/Contents/MacOS/VBoxGuestAdditions.iso'
      else
        File.exist?('/usr/share/virtualbox/VBoxGuestAdditions.iso') ?
          '/usr/share/virtualbox/VBoxGuestAdditions.iso' :
          '/usr/lib/virtualbox/additions/VBoxGuestAdditions.iso'
      end

    vb_vm.vm.provision 'file',
      source: host_ga_iso,
      destination: '/tmp/VBoxGuestAdditions.iso',
      run: 'always'


    config.vm.boot_timeout = 600

    # 1) Upgrade kernel and headers
    vb_vm.vm.provision 'shell',
      inline: <<-SHELL,
        set -e
        export DEBIAN_FRONTEND=noninteractive
        apt-get update -y
        apt-get full-upgrade -y
      SHELL
      privileged: true,
      run: 'once'

    # Reboot after kernel upgrade
    vb_vm.vm.provision 'reload', name: 'Reboot after kernel upgrade'

    # 2) Install Guest Additions from the uploaded ISO
    vb_vm.vm.provision 'shell',
    inline: <<-'SHELL'
      set -e
      mkdir -p /mnt/vbga

      # Sanity checks
      if [ ! -s /tmp/VBoxGuestAdditions.iso ]; then
        echo "Guest Additions ISO missing or empty at /tmp/VBoxGuestAdditions.iso"
        ls -l /tmp || true
        exit 1
      fi
      file /tmp/VBoxGuestAdditions.iso || true

      # Make sure loop support is available
      apt-get update -y
      apt-get install -y kmod util-linux
      modprobe loop || true
      modprobe isofs || true

      # Create a loop device for the ISO
      losetup -fP /tmp/VBoxGuestAdditions.iso
      LOOPDEV="$(losetup -j /tmp/VBoxGuestAdditions.iso | awk -F: '{print $1}')"
      if [ -z "$LOOPDEV" ]; then
        echo "Could not attach loop device"
        losetup -a || true
        exit 1
      fi

      # Mount the ISO read-only as iso9660
      mount -t iso9660 -o ro "$LOOPDEV" /mnt/vbga || {
        echo "Mount failed. Dumping loop devices"
        losetup -a || true
        exit 1
      }

      if [ ! -x /mnt/vbga/VBoxLinuxAdditions.run ]; then
        echo "VBoxLinuxAdditions.run not found on ISO"
        umount /mnt/vbga
        losetup -d "$LOOPDEV"
        exit 1
      fi

      # Run installer. It may return nonzero when X11 parts are skipped on servers
      sh /mnt/vbga/VBoxLinuxAdditions.run --nox11 || true

      umount /mnt/vbga || true
      losetup -d "$LOOPDEV" || true

      # Build for all installed kernels and reload
      /sbin/rcvboxadd quicksetup all || true
      /sbin/rcvboxadd reload || true
    SHELL

    # Final reboot so the running modules match the newly built ones
    vb_vm.vm.provision 'reload', name: 'Reboot after GA install'

    vb_vm.vm.provision 'shell',
      path: './install.sh',
      env: {
        'DEV' => (ENV['DEV'] || 'false'),
        'LOCATION' => (ENV['LOCATION'] || 'remote')
      },
      privileged: true
  end

  # ---------- VMware ----------
  config.vm.define 'vmware_vm' do |vmw_vm|
    vmw_vm.vm.box      = 'generic/debian12'
    vmw_vm.vm.hostname = 'WiFiChallengeLab'

    vmw_vm.vm.provider 'vmware_desktop' do |v|
      v.linked_clone         = false
      v.clone_directory      = 'E:/VMWare'
      v.force_vmware_license = 'workstation'
      v.gui                  = true
      v.vmx['displayName']   = 'WiFiChallenge Lab v2.3'
      v.memory               = 4096
      v.cpus                 = 4
    end

    vmw_vm.vm.provision 'shell',
      inline: <<-SHELL,
        set -e
        apt-get update -y
        DEBIAN_FRONTEND=noninteractive apt-get full-upgrade -y
      SHELL
      privileged: true,
      run: 'once'

    vmw_vm.vm.provision 'reload', name: 'Reboot after update kernel'

    vmw_vm.vm.provision 'shell',
      path: './install.sh',
      env: {
        'DEV' => (ENV['DEV'] || 'false'),
        'LOCATION' => (ENV['LOCATION'] || 'remote')
      },
      privileged: true
  end

end
