class PushAll
  attr_accessor :commit_message, :path

  def initialize
    @path = `pwd`.chomp
  end

  def run
    puts "Updating gorges gems --->"
    projects = %w{base user gls_pro_2}
    refs = projects.inject({}) do |hash, project|
      puts "Updating #{project}"
      `cd #{ENV['HOME']}/Documents/gorges/rails/#{project} && git add . && git commit -a -m 'updating gemfile' && git pull origin master && git push origin master`
      hash[project] = `cd #{ENV['HOME']}/Documents/gorges/rails/#{project} && git rev-parse HEAD`.chomp
      puts "New ref: #{hash[project]}"
      hash
    end

    me = `whoami`.chomp

    base_gemfile_text = <<EOD
# This file is automatically generated by the bin/update script.
# It was last updated by #{me} at #{Time.now}.

gem 'gorges_rails_base',
    git: 'https://gorges-user:W3lUvG0rg3s@bitbucket.org/gorges/gorges-rails-base.git',
    branch: 'master',
    ref: '#{refs['base']}'

# These gems are used by gorges_rails_base but have to be declared here because of their git dependencies
gem 'rails_sql_views', git: 'https://github.com/yuryromanov/rails_sql_views.git'

EOD

    gls_gemfile_text = <<EOD
gem 'gls_pro_2',
    git: 'https://gorges-user:W3lUvG0rg3s@bitbucket.org/gorges/gls-pro-2.git',
    branch: 'master',
    ref: '#{refs['gls_pro_2']}'
EOD

    user_gemfile_text = <<EOD
gem 'gorges_rails_user',
    git: 'https://gorges-user:W3lUvG0rg3s@bitbucket.org/gorges/gorges-rails-user.git',
    branch: 'master',
    ref: '#{refs['user']}'
EOD

    gemfile_text = <<EOD
#{base_gemfile_text}
#{user_gemfile_text}
#{gls_gemfile_text}
EOD

    puts "Updating the Gemfile --->"
    gemfile = File.join(path, 'config', 'gorges_gems.rb')
    File.open(gemfile, 'w') do |file|
      file.write gemfile_text
    end
    puts "Updated gemfile. Now committing the code."
    Dir.chdir(path) do
      puts 'Bundling...'
      `bundle install`
      puts 'Committing...'
      `git add .`
      `git commit -a -m 'update gorges gems'`
      `git pull origin master`
      `git push origin master`
    end
    puts "Finished."
  end


end

PushAll.new.run