Vagrant.configure("2") do |config|
  # Disable default synced folder
  config.vm.synced_folder ".", "/vagrant", disabled: true

  # DMZ - Traefik Reverse Proxy
  config.vm.define "dmz" do |dmz|
    dmz.vm.box = "debian/bookworm64"
    dmz.vm.hostname = "dmz"
    dmz.vm.network "private_network", ip: "192.168.56.10"
    dmz.vm.network "forwarded_port", guest: 80, host: 8080
    dmz.vm.network "forwarded_port", guest: 443, host: 8443

    # Libvirt provider - much better performance than virtualbox
    dmz.vm.provider "libvirt" do |lv|
      lv.memory = 2048
      lv.cpus = 2
    end

    # Provision dependencies
    dmz.vm.provision "shell", inline: <<-SHELL
      # Update system
      apt-get update
      apt-get install -y sudo python3 ca-certificates curl gnupg
    SHELL
  end

  # Backend - Container Host
  config.vm.define "backend" do |backend|
    backend.vm.box = "debian/bookworm64"
    backend.vm.hostname = "backend"
    backend.vm.network "private_network", ip: "192.168.56.11"

    # Libvirt provider - much better performance than virtualbox
    backend.vm.provider "libvirt" do |lv|
      lv.memory = 4096
      lv.cpus = 4
    end

    # Provision dependencies
    backend.vm.provision "shell", inline: <<-SHELL
      # Update system
      apt-get update
      apt-get install -y sudo python3 ca-certificates curl gnupg
    SHELL
  end

  # Backend2 - Second smaller Container Host for testing
  config.vm.define "backend2" do |backend2|
    backend2.vm.box = "debian/bookworm64"
    backend2.vm.hostname = "backend2"
    backend2.vm.network "private_network", ip: "192.168.56.12"

    backend2.vm.provider "libvirt" do |lv|
      lv.memory = 1024
      lv.cpus = 1
    end

    # Provision dependencies
    backend2.vm.provision "shell", inline: <<-SHELL
      # Update system
      apt-get update
      apt-get install -y sudo python3 ca-certificates curl gnupg
    SHELL

    # Provision all VMs with Ansible after the last VM is up
    backend2.vm.provision "ansible" do |ansible|
      ansible.limit = "all"
      ansible.playbook = "playbooks/site.yml"
      ansible.inventory_path = "inventories/vagrant"
      ansible.verbose = "v"
    end
  end
end
