# Vagrantfile API/syntax version. Don't touch unless you know what you're doing!
VAGRANTFILE_API_VERSION = "2"

def calc_mem(system_mem_mb)
  mem_available_to_vm = (system_mem_mb * 0.74).floor
  lower_limit_mb = ((8192-1024)*0.74).floor # subtracting 1GB because of integrated graphics cards
  if mem_available_to_vm < lower_limit_mb
    $stderr.puts "Not enough memory left for virtual machine: #{mem_available_to_vm} MB. Required minimum memory for the computer is 8 GB"
    abort
  end
  mem_available_to_vm
end

def get_amount_of_cpus_and_system_ram
  # Give VM (host memory * 0.74) & all but 1 cpu (logical) cores
  host = RbConfig::CONFIG['host_os']

  cpus = nil
  mem = nil

  if host =~ /darwin/
    cpus = `sysctl -n hw.physicalcpu_max`.to_i
    mem = `sysctl -n hw.memsize`.to_i / 1024 / 1024
  elsif host =~ /linux/
    cpus = `lscpu -p | awk -F',' '!/^#/{print $2}'| sort -u | wc -l`.to_i
    mem = `grep 'MemTotal' /proc/meminfo | sed -e 's/MemTotal://' -e 's/ kB//'`.to_i / 1024
  elsif host =~ /mswin|mingw|cygwin/
    cpus = `wmic cpu Get NumberOfCores`.split[1].to_i
    mem = `wmic computersystem Get TotalPhysicalMemory`.split[1].to_i / 1024 / 1024
  end

  if cpus.nil?
    $stderr.puts "Could not determine the amount of cpus"
    abort
  end
  if mem.nil?
    $stderr.puts "Could not determine the amount of system memory"
    abort
  end
  [[cpus - 1, 2].max, calc_mem(mem)]
end

def get_nic_type
  if ENV['NIC']
    return ENV['NIC']
  else
    return 'virtio'
  end
end

def get_random_mac
  return "080027" + Array.new(6){[*"A".."F", *"0".."9"].sample}.join
end

def virtualbox_version()
    vboxmanage = Vagrant::Util::Which.which("VBoxManage") || Vagrant::Util::Which.which("VBoxManage.exe")
    if vboxmanage == nil and File.file?(ENV["VBOX_MSI_INSTALL_PATH"] + "\\VBoxManage.exe")
        vboxmanage = ENV["VBOX_MSI_INSTALL_PATH"] + "\\VBoxManage.exe"
    end
    if vboxmanage != nil
        s = Vagrant::Util::Subprocess.execute(vboxmanage, '--version')
        return s.stdout.strip.split(".").map {|x| x.to_i}.join('.') # discard characters from version string
    else
        return nil
    end
end

cpus, mem = get_amount_of_cpus_and_system_ram()
random_mac = get_random_mac()
Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|
  config.vm.boot_timeout = 300
  config.vm.box = "digabi/ktp-qa"
  config.vm.box_url = "https://s3-eu-west-1.amazonaws.com/static.abitti.fi/usbimg/qa/vagrant/metadata.json"
  config.vm.base_mac = random_mac
  vb_version = virtualbox_version()
  puts "VirtualBox version: #{vb_version}"
  vb_version_is_6_1_or_later = Gem::Version.new(vb_version) >= Gem::Version.new("6.1.0")
  if vb_version_is_6_1_or_later && Vagrant.version?("< 2.2.7")
    puts "ERROR: VAGRANT VERSION TOO OLD! VirtualBox >= 6.1 requires Vagrant >= 2.2.7, please upgrade HashiCorp Vagrant!"
  end
  if vb_version_is_6_1_or_later
    Vagrant.require_version(">= 2.2.7")
  end
  config.vm.provider :virtualbox do |vb|
    vb.name = "SERVER20530 v167"
    vb.gui = true
    vb.customize ["modifyvm", :id, "--ioapic", "on"]
    vb.customize ["modifyvm", :id, "--cpus", cpus]
    vb.customize ["modifyvm", :id, "--memory", mem]
    vb.customize ["modifyvm", :id, "--nictype1", get_nic_type()]
    if vb_version_is_6_1_or_later
      vb.customize ['modifyvm', :id, '--clipboard-mode', 'bidirectional']
    else
      vb.customize ['modifyvm', :id, '--clipboard', 'bidirectional']
    end
    vb.customize ["modifyvm", :id, "--vram", 24]
    vb.customize ["modifyvm", :id, "--description", "digabi/ktp-qa"]
  end

  config.vm.synced_folder '~/ktp-jako', '/media/usb1', id: 'media_usb1'
  config.vm.synced_folder ".", "/vagrant", disabled: true
  if ENV['EXTNIC']
    config.vm.network "public_network", :adapter=>1, bridge: ENV['EXTNIC'], auto_config: false
  else
    config.vm.network "public_network", :adapter=>1, auto_config: false
  end
end
