#!/usr/bin/env ruby

require 'docopt'
require 'csv'
require 'fileutils'

DATA_FILE = 'releases.csv'

def release_already_exists?(project, version, data_file)
  data = CSV.read(data_file)
  data.each do |row|
    if row.include?(project) && row.include?(version)
      return true
    end
  end
  return false
end

def add_release(date, project, version, data_file)
  # copy data_file as backup
  FileUtils.cp(data_file, "#{data_file}.bak")
  data = CSV.read(data_file, {:headers => true})
  # Date Project Version Final? Notes
  new_values = [date, project, version, 'y', nil]
  CSV.open(data_file, 'w') do |csv|
    csv << data.headers
    csv << new_values
    data.each do |row|
      csv << row
    end
  end
end

def commit_release_file(file, message)
  `git add #{file}`
  `git commit -m "#{message}"`
  `git push origin HEAD`
end

# Main

# Parse options
DOC =<<DOCOPT
Add a new release to the spreadsheet.

Usage:
#{__FILE__} --date DATE --project PROJECT --version VERSION
DOCOPT

begin
  options = Docopt::docopt(DOC)
rescue Docopt::Exit => e
  puts "ERROR: Option parsing failed."
  puts e.message
  exit 1
end

date      = options['DATE']
project   = options['PROJECT']
version   = options['VERSION']

# Do the thing
if release_already_exists?(project, version, DATA_FILE)
  puts "INFO: #{project} #{version} was already shipped, not adding it again . . ."
else
  puts "INFO: Adding #{project} #{version} to release-metrics . . ."
  add_release(date, project, version, DATA_FILE)
  commit_release_file(DATA_FILE, "(maint) Add #{project} #{version} release")
end
