param(
  [array]$puppetAgentVersions = ('1.1.1','1.2.2','1.4.0'),
  [string]$baseUrl = 'https://downloads.puppetlabs.com/windows',
  [string]$fqdn = 'foo.example.com'
)

$PuppetInstallerPath = 'c:\vagrantshared\resources\installers'

# Make sure we have enough privs to install the things.
$currentPrincipal = New-Object Security.Principal.WindowsPrincipal([Security.Principal.WindowsIdentity]::GetCurrent())
if (! ($currentPrincipal.IsInRole([Security.Principal.WindowsBuiltInRole]::Administrator))) {
  Write-Host -ForegroundColor Red "You must run this script as an administrator."
  Exit 1
}

# Create our tmp dir if it's not found
if (!(Test-Path $PuppetInstallerPath)) {
  Write-Host "Creating folder `'$PuppetInstallerPath`'"
  $null = New-Item -Path "$PuppetInstallerPath" -ItemType Directory
}

# Install each puppet version & collect facts.
foreach ($pupAgentVer in $puppetAgentVersions) {
  $agentUrl = "$baseUrl/puppet-agent-$pupAgentVer-x64.msi"
  $agentInstaller = Join-Path $PuppetInstallerPath "puppet-agent-$pupAgentVer-x64.msi"

  write-Host "Downloading `'$agentUrl`' to `'$agentInstaller`'"
  (New-Object Net.WebClient).DownloadFile("$agentUrl", "$agentInstaller")

  #Install the actual agent, and 
  $install_args = @("/qn", "/norestart", "/i", "$agentInstaller", "PUPPET_AGENT_CERTNAME=$fqdn")
  Write-Host "Installing Puppet. running msiexec.exe $install_args"
  $agentProcess = Start-Process -FilePath msiexec.exe -ArgumentList $install_args -Wait -PassThru
  if ($agentProcess.ExitCode -ne 0) {
    Write-Host "Installer failed."
    Exit 1
  }
  Write-Host "Puppet Agent $pupAgentVer successfully installed."

  # Run facter
  $facterBin = "C:\Program Files\Puppet Labs\Puppet\bin\facter.bat"
  $facterVer = (&$facterBin facterversion).Substring(0,3)

  $Os = (&$facterBin operatingsystem).ToLower()
  $Osmaj = (&$facterBin operatingsystemmajrelease).ToLower()
  $Hw = (&$facterBin hardwaremodel).ToLower()

  # Supply a fqdn because vagrant windows only sets the short hostname.  Without this
  # the domain name will fallback to the hypervisor's domain.
  $env:FACTER_fqdn = $fqdn

  $facterArgs = @("-j")
  $facterProcess = Start-Process -FilePath $facterBin -ArgumentList $facterArgs -Wait -PassThru -RedirectStandardOutput "C:\vagrant\$facterVer\$Os-$Osmaj-$Hw.facts"
  if ($facterProcess.ExitCode -ne 0) {
    Write-Host "Facter failed."
    Exit 1
  }
  Write-Host "Facts collected for $Os-$Osmaj-$Hw with facter $facterVer"
}