# -*- mode: ruby -*-
# vi: set ft=ruby :

Vagrant.configure("2") do |config|
  provider_name = ENV.fetch("VAGRANT_DEFAULT_PROVIDER", "virtualbox")
  use_cloud_image = %w[libvirt kvm].include?(provider_name)

  # VirtualBox: Bento-style box (stable, like bento/ubuntu-24.04). Libvirt: cloud-image only.
  config.ssh.insert_key = false if use_cloud_image

  vm_settings = {
    box: use_cloud_image ? "cloud-image/ubuntu-26.04" : "konstruktoid/ubuntu-26.04",
    box_version: use_cloud_image ? nil : "0.0.2",
    memory: 2048,
    cpus: 4,
    machines: [
      { name: "vagrant-pihole-01", mac: "52:54:00:56:00:06",
        ip_virtualbox: "192.168.56.4", ip_libvirt: "192.168.121.4" },
      { name: "vagrant-pihole-02", mac: "52:54:00:56:00:07",
        ip_virtualbox: "192.168.56.5", ip_libvirt: "192.168.121.5" }
    ]
  }

  if Vagrant.has_plugin?("vagrant-vbguest")
    config.vbguest.auto_update = false
  end

  vm_settings[:machines].each do |machine|
    config.vm.define machine[:name] do |node|
      node.vm.hostname         = machine[:name]
      node.vm.box              = vm_settings[:box]
      node.vm.box_version      = vm_settings[:box_version] if vm_settings[:box_version]
      node.vm.box_check_update = false

      node.vm.provider "virtualbox" do |v, o|
        v.memory = vm_settings[:memory]
        v.cpus   = vm_settings[:cpus]
        o.vm.network "private_network",
                     ip: machine[:ip_virtualbox],
                     netmask: "255.255.255.0",
                     auto_config: true
        v.customize ["modifyvm", :id, "--macaddress2", machine[:mac].delete(":")]
        v.customize ["modifyvm", :id, "--graphicscontroller", "vboxsvga"]
        v.customize ["modifyvm", :id, "--accelerate-3d", "off"]
        v.customize ["modifyvm", :id, "--vram", "32"]
        v.customize ["modifyvm", :id, "--nic1", "nat"]
        v.customize ["modifyvm", :id, "--cableconnected1", "on"]
        v.customize ["modifyvm", :id, "--nictype1", "82540EM"]
      end

      if Vagrant.has_plugin?("vagrant-libvirt")
        node.vm.provider "libvirt" do |l, o|
          l.memory = vm_settings[:memory]
          l.cpus   = vm_settings[:cpus]
          l.driver = "kvm"
          o.vm.network "private_network",
                       ip: machine[:ip_libvirt],
                       netmask: "255.255.255.0",
                       auto_config: true,
                       libvirt__network_name: "vagrant-56",
                       libvirt__mac: machine[:mac],
                       libvirt__mgmt_network: "none"
        end
      end

      node.vm.provision "shell",
                        inline: "date | tee /etc/vagrant_provisioned_at && ip -4 addr show || true",
                        privileged: true

      node.trigger.after :destroy do |trigger|
        trigger.info = "Removing known_hosts entry for #{machine[:name]}"
        trigger.on_error = :continue
        trigger.run = { inline: "ssh-keygen -R #{machine[:name]}" }
      end
    end
  end
end
