require 'fog'
require 'yaml'
require 'digest'
require 'mime/types'

config = YAML.load(File.read(File.join(File.dirname(__FILE__),'aws.yml')))

storage = Fog::Storage.new(config['storage']['credentials'])

directory = storage.directories.get(config['storage']['directory'])

existant = directory.files.inject({}) do |hash, file|
  hash[file.key] = file.etag
  hash
end

updates = []
Dir.chdir 'public' do
  Dir['**/*.*'].each do |f|
    body = File.read f, :open_args => ['rb']
    digest = Digest::MD5.new
    digest.update(body)

    if existant[f] == digest.hexdigest
      puts "skipping #{f}; already exists" if ENV['VERBOSE']
      next
    end
    if existant[f]
      updates << f
    end

    type = MIME::Types.of(f).first
    file = directory.files.new(:key => f, :body => body,  :content_type => type && type.content_type,
                               :content_md5 => digest.base64digest, :expires => 24*3600*7, :acl => 'public-read')
    file.save
  end
end

if config['cdn']
  cdn = Fog::CDN.new(config['cdn']['credentials'])
  
  if updates.any?
    paths = updates.collect {|p| '/' + p}
    cdn.post_invalidation config['cdn']['distribution_id'], paths
    puts 'posted updates'
  end
end