#!/usr/bin/env ruby

raise 'You should not run this script from the dev box' if ENV['USER'] == 'vagrant'

require 'bundler'
require 'json'

IMAGE_ROOT   = 'https://cloud-images.ubuntu.com/releases/quantal/release-20130206'
IMAGE_NAME   = 'ubuntu-12.10-server-cloudimg-amd64-root.tar.gz'
VAGRANT_REPO = 'https://raw.github.com/mitchellh/vagrant/master'

def download(source, destination)
  destination = "#{File.dirname __FILE__}/cache/#{destination}"
  return if File.exists?(destination)

  sh "wget #{source} -O #{destination}"
end

def sh(cmd)
  Bundler.with_clean_env do
    puts cmd
    raise 'Errored!' unless system cmd
  end
end

def restore_snapshot!
  sh 'vagrant halt -f'
  conf = JSON.parse File.read('.vagrant')
  id   = conf['active']['default']
  sh "VBoxManage snapshot '#{id}' restore ready-to-rock"
  sh 'vagrant up'
  exit 0
end

def vagrant_ssh(cmd)
  sh "vagrant ssh -c \"#{cmd}\""
end

# Initialize git submodules
sh 'git submodule update --init'

Bundler.with_clean_env do
  # Ensure box has not been created yet
  unless `vagrant status` =~ /not created/
    print 'Vagrant box already created, do you want to [r]ecreate it, restore [s]napshot or [A]bort? '
    answer = gets.chomp
    exit 0 if answer.empty? || answer =~ /^a/i

    case
      when answer =~ /^s/i
        restore_snapshot!
      when answer =~ /^r/i
        sh 'vagrant destroy -f'
      else
        puts 'Invalid option!'
        exit 1
    end
  end
end

# Cache development dependencies
`mkdir -p cache`

# Cache container image between vagrant box destructions
download "#{IMAGE_ROOT}/#{IMAGE_NAME}", IMAGE_NAME

# Start vagrant
sh 'vagrant up'

# Because I'm lazy ;)
vagrant_ssh "echo 'cd /vagrant' >> ~/.bashrc"
vagrant_ssh "alias be='bundle exec' >> ~/.bashrc"

# "be" archive is too slow for me
vagrant_ssh "sudo sed -i -e 's/be.archive/br.archive/g' /etc/apt/sources.list"

# Ensure we have the latest packages around
vagrant_ssh "sudo apt-get update && sudo apt-get upgrade -y"

# Ensure the machine can boot properly after upgrades
sh 'vagrant reload'

# Install dependencies
vagrant_ssh "sudo apt-get install lxc rinetd libffi-dev libffi-ruby ruby1.9.1-dev htop git virtualbox virtualbox-ose-dkms linux-headers-generic linux-headers-3.5.0-17-generic -y && sudo gem install bundler --no-ri --no-rdoc"
vagrant_ssh "sudo dkms install virtualbox/4.1.18"
vagrant_ssh "sudo service virtualbox start"

# Backup rinetd config
vagrant_ssh "cp /etc/rinetd.conf /vagrant/cache/rinetd.conf"

# Make rinetd writable by vagrant user
vagrant_ssh 'sudo chown vagrant:vagrant /etc/rinetd.conf'

# Bundle!
vagrant_ssh 'cd /vagrant && bundle && cd /vagrant/dev && bundle'

# Setup vagrant default ssh key
vagrant_keys_path = '$(cd /vagrant && bundle show vagrant)/keys'
vagrant_ssh "cp #{vagrant_keys_path}/vagrant ~/.ssh/id_rsa && cp #{vagrant_keys_path}/vagrant.pub ~/.ssh/id_rsa.pub && chmod 600 ~/.ssh/id_rsa"

# Setup lxc cache
vagrant_ssh "sudo mkdir -p /var/cache/lxc/cloud-quantal && sudo cp /vagrant/cache/#{IMAGE_NAME} /var/cache/lxc/cloud-quantal/#{IMAGE_NAME}"

# Click
sh 'vagrant halt'
conf = JSON.parse File.read('.vagrant')
id   = conf['active']['default']
sh "VBoxManage snapshot '#{id}' take ready-to-rock"
sh 'vagrant up'