Vagrant.configure("2") do |config|
  config.vagrant.plugins = ["vagrant-qemu", "virtualbox"]

  config.ssh.connect_timeout = 5

  ubuntu_versions = [
    { name: "ubuntu16", box: "bento/ubuntu-16.04", arm_box: nil , amd_arch: "unknown" }, # could not find working ubuntu 16.04 for arm64
    { name: "ubuntu18", box: "bento/ubuntu-18.04", arm_box: "cloud-image/ubuntu-18.04", amd_arch: "unknown" },
    { name: "ubuntu20", box: "bento/ubuntu-20.04", arm_box: "cloud-image/ubuntu-20.04", amd_arch: "amd64" },
    { name: "ubuntu22", box: "bento/ubuntu-22.04", arm_box: "cloud-image/ubuntu-22.04", amd_arch: "amd64" },
    { name: "ubuntu24", box: "bento/ubuntu-24.04", arm_box: "cloud-image/ubuntu-24.04", amd_arch: "amd64" }
  ]

  ubuntu_versions.each do |vm_config|
    # ARM64 version
    if vm_config[:arm_box]
      config.vm.define "#{vm_config[:name]}-arm" do |ubuntu|
        ubuntu.vm.box = vm_config[:arm_box]
        ubuntu.vm.box_architecture = "arm64"
        ubuntu.vm.synced_folder ".", "/vagrant", type: "rsync", rsync__auto: true
        ubuntu.vm.provider "qemu" do |qe|
          qe.memory = "2G"
          qe.smp = 2
          qe.ssh_auto_correct = true
          qe.qemu_dir = "/opt/homebrew/share/qemu"
        end
      end
    end

    # x86_64 version
    config.vm.define "#{vm_config[:name]}-x86" do |ubuntu|
      ubuntu.vm.box = vm_config[:box]
      # Only set box_architecture if it's a valid value (not "unknown")
      if vm_config[:amd_arch] != "unknown"
        ubuntu.vm.box_architecture = vm_config[:amd_arch]
      end
      ubuntu.vm.synced_folder ".", "/vagrant"
      ubuntu.vm.provider "virtualbox" do |vb|
        vb.memory = "1024"
        vb.cpus = 2
        vb.gui = false
        vb.customize ["modifyvm", :id, "--ostype", "Ubuntu_64"]
      end
    end
  end

  centos_versions = [
    { name: "centos6", box: "generic/centos6"},
    { name: "centos7", box: "generic/centos7"},
    { name: "centos8", box: "generic/centos8"},
    { name: "centos-stream-9", box: "bento/centos-stream-9", arm_box: "bento/centos-stream-9" },
    { name: "centos-stream-10", box: nil, arm_box: "bento/centos-stream-10" } # could not find a working centos stream 10 for amd64
  ]

  centos_versions.each do |vm_config|
    # ARM64 version (only for CentOS Stream 9+)
    if vm_config[:arm_box]
      config.vm.define "#{vm_config[:name]}-arm" do |centos|
        centos.vm.box = vm_config[:arm_box]
        centos.vm.box_architecture = "arm64"
        centos.vm.synced_folder ".", "/vagrant"
        centos.vm.provider "virtualbox" do |vb|
          vb.memory = "1024"
          vb.cpus = 2
          vb.gui = false
          vb.customize ["modifyvm", :id, "--ostype", "RedHat_64"]
          vb.customize ["modifyvm", :id, "--ioapic", "on"]
        end
      end
    end

    # x86_64 version
    if vm_config[:box]
      config.vm.define "#{vm_config[:name]}-x86" do |centos|
        centos.vm.box = vm_config[:box]
        centos.vm.box_architecture = "amd64"
        centos.vm.synced_folder ".", "/vagrant"
        centos.vm.provider "virtualbox" do |vb|
          vb.memory = "1024"
          vb.cpus = 2
          vb.gui = false
          vb.customize ["modifyvm", :id, "--ostype", "RedHat_64"]
          vb.customize ["modifyvm", :id, "--ioapic", "on"]
          vb.customize ["modifyvm", :id, "--paravirtprovider", "kvm"]
        end
      end
    end
  end
end
