#!/usr/bin/env ruby

require 'json'

def puts_c(color, str)
	puts "\x1b[#{color}m#{str}\x1b[0m"
end

class Source
	attr_accessor :path, :v_regex

	def initialize(path, v_regex)
		@path = path
		@v_regex = v_regex
	end
end

class Bumper
	attr_accessor :sources, :bumped, :target_v

	def initialize(sources)
		@sources = sources
	end

	def start

		# get package.json version
		package = JSON.parse File.read 'package.json'
		@target_v = package['version']

		@bumped = false
		@sources.each {|source| bump_source(source)}

		# if bumped, do extra stuff and notify the user
		if @bumped

			# minify `mustache.js` using the Rakefile task
			puts "> minifying `mustache.js`..."
			`rake minify`

			# stage files for commit
			`git add package.json`
			@sources.each {|source| `git add #{source.path}`}
			`git add mustache.min.js`
			`git commit -m ":ship: bump to version #{@target_v}"`

			# notify codemonkey
			puts "staged bumped files and created commit"
			puts_c 32, "successfully bumped version to #{@target_v}!"
			puts_c 33, "don't forget to `npm publish` and `spm publish`!"
		end

		exit 0
	end

	def bump_source(source)
		file_buffer = File.read source.path
		if match = file_buffer.match(source.v_regex)
			file_v = match.captures[0]
			if @target_v != file_v
				did_bump
				puts "> bumping version in file '#{source.path}': #{file_v} -> #{@target_v}..."
				file_buffer[source.v_regex, 1] = @target_v
				File.open(source.path, 'w') { |f| f.write file_buffer }
			end
		else
			puts_c 31, "ERROR: Can't find version in '#{source.path}'"
			exit 1
		end
	end

	def did_bump
		if !@bumped
			puts 'bump detected!'
			if `which uglifyjs`.empty?
				puts_c 31, 'you need uglifyjs installed'
				puts 'run `sudo npm install -g uglify-js`'
				exit 1
			end
		end
		@bumped = true
	end
end

bumper = Bumper.new([
	Source.new('mustache.js', /mustache.version = '([\d\.]*)'/),
	Source.new('mustache.js.nuspec', /<version>([\d\.]*)<\/version>/),
])
bumper.start
