namespace :bump do

namespace :version do
  class ProjectVersion
    FILE = File.dirname(__FILE__) + '/../treefell/version.rb'
    PATTERN = /VERSION\s*=\s*['"](\d+)\.(\d+)\.(\d+)['"]/m

    def initialize(file=FILE, pattern=PATTERN)
      @file = file
      @pattern = pattern
    end

    def bump(major:nil, minor:nil, patch:nil)
      version = nil
      contents.sub!(@pattern) do
        _major = major.call($1) if major
        _minor = minor.call($2) if minor
        _patch = patch.call($3) if patch
        version = "#{_major}.#{_minor}.#{_patch}"
        results = %|VERSION = "#{version}"|
      end
      File.write(@file, contents)
      system "bundle"
      system "git add #{ProjectVersion::FILE} && git commit -m 'Bumping version to #{version}'"
      system "git tag v#{version}"
    end

    private

    def contents
      @contents ||= File.read(@file)
    end
  end

  desc "Increments the patch number by 1 for the project"
  task :patch do
    ProjectVersion.new.bump(
      major: ->(major){ major },
      minor: ->(minor){ minor },
      patch: ->(patch){ patch.succ }
    )
  end

  desc "Increments the minor number by 1 for the project"
  task :minor do
    ProjectVersion.new.bump(
      major: ->(major){ major },
      minor: ->(minor){ minor.succ },
      patch: ->(patch){ 0 }
    )
  end

  desc "Increments the major number by 1 for the project"
  task :major do
    ProjectVersion.new.bump(
      major: ->(major){ major.succ },
      minor: ->(minor){ 0 },
      patch: ->(patch){ 0 }
    )
  end

end

end