require 'semver'

module RakeNBake
  class SemverVersioning

    def self.current_version
      unless File.exist? SemVer.file_name
        version = SemVer.new
        version.save SemVer.file_name
      end
      SemVer.find
    end

    def self.inc_major
      v = current_version
      v.major = v.major.to_i + 1
      v.minor = 0
      v.patch = 0
      v.save
    end

    def self.inc_minor
      v = current_version
      v.minor = v.minor.to_i + 1
      v.patch = 0
      v.save
    end

    def self.inc_patch
      v = current_version
      v.patch = v.patch.to_i + 1
      v.save
    end

    def self.prerelease s
      v = current_version
      v.special = s
      v.save
    end

    def self.inc_prerelease s
      inc_major
      v = current_version
      v.special = s
      v.save
    end

    def self.release
      v = current_version
      v.special = ''
      v.save
    end

    def self.update_history_file
      %w[history.rdoc CHANGELOG.md]
        .select { |file| File.exist? file }
        .each do |file|
          add_version_to_top(file)
          `git add #{file}`
        end
    end

    def self.update_version_rb
      version_files = Dir.glob('lib{,/*}/version.rb').uniq
      return unless version_files.size == 1
      version_file = version_files[0]

      version = current_version.to_s.sub(/^v/, '')
      version_string = "VERSION = '#{version}'"
      version_file_content = File.read(version_file).sub(/VERSION = .*$/, version_string)

      File.write(version_file, version_file_content)
      `git add #{version_file}`
    end

    def self.tag
      v = current_version.to_s
      `git add .semver && git commit -m 'Increment version to #{v}' && git tag #{v} -a -m '#{Time.now}'`
      branch = `git symbolic-ref HEAD`[%r[.*/(.*)], 1]
      puts "To push the new tag, use 'git push origin #{branch} --tags'"
    end

    def self.add_version_to_top file
      current_history = File.read file
      File.open file, 'w' do |f|
        f.puts "== #{current_version} (#{Time.now.strftime '%d %B %Y'})"
        f.puts
        f.print current_history
      end
    end

  end
end