$LOAD_PATH << File.expand_path(File.dirname(__FILE__))

require 'version'
require 'fileutils'

class Repository

  attr_reader :name
  attr_reader :targets
  attr_reader :clone_command
  attr_reader :bundle_version
  attr_reader :path
  attr_reader :master_branch

  def initialize(repo_root, name, path, variable, bundle_version = nil, master_branch = '3.0.x', targets = 'clean clean-integration test publish-ivy')
    if repo_root.nil?
      abort('Repository Git Root cannot be nil for repository ' + @name)
    end
    @repo_root = repo_root
      
    if name.nil?
      abort('Name cannot be nil')
    end
    @name = name

    if path.nil? || path == ''
      abort('Repository path cannot be nil for repository ' + @name)
    end
    @path = File.expand_path(path)

    @variable = variable

    @bundle_version = bundle_version

    if targets.nil?
      abort('Repository build targets cannot be nil for repository ' + @name)
    end
    @targets = targets

    if master_branch.nil?
      abort('Repository master branch cannot be nil for repository ' + @name)
    end
    @master_branch = master_branch
    
    @clone_command = 'git clone -b ' + @master_branch + " " + @repo_root + @name + '.git ' + @path 
  end

  def checkout(quietly=false)
    if File.exist?(@path)
      puts '  Deleting old checkout at ' + @path
      FileUtils.rm_rf(@path)
    end
    tonull = " > /dev/null 2>&1"
    puts '  Checking out ' + @path
    execute(@clone_command + (quietly ? tonull : ""))
    Dir.chdir(@path)
    execute('git submodule update --init' + (quietly ? tonull : ""))
    if @bundle_version.nil? 
      create_new_bundle_version_from_properties
    end
  end

  def create_release_branch(version, build_stamp, release_type, versions)
    create_branch(@bundle_version)
    update_build_properties(version, build_stamp, release_type)
    update_build_versions(versions)
  end

  def update_versions(versions)
    create_branch(@bundle_version)
    puts '  Updating versions'
    versions.sort.reverse.each do |var_version|
      Version.update(var_version[0], var_version[1], @path, true)
    end
    execute('cd ' + @path + '; git commit --allow-empty -a -m "[RIPPLOR] Updated versions"')
  end

  def build(committerId, log_file)
    puts '  Building:'
    puts '    BUNDLE_VERSION: ' + @bundle_version
    puts '    TARGETS: ' + @targets
    
    execute('ant -f ' + @path + '/build-*/build.xml -Declipse.committerId=' + committerId + ' -Dbundle.version=' + @bundle_version + ' ' + @targets + ' >> ' + log_file)
  end

  def create_tag
    puts '    Creating tag ' + @bundle_version
    Dir.chdir(@path)
    execute('git tag -a -m "[RELEASELOR] ' + @bundle_version +'" ' + @bundle_version)
  end

  def update_master_branch(new_version, versions)
    create_branch(new_version)
    update_build_properties(new_version)
    update_build_versions(versions)
  end

  def versions
    versions = Hash.new
    
    IO.foreach(@path + '/build.versions') do |line|
      if line =~ /([^=]*)=(.*)/
        if !($1.strip[-6..-1] == '-RANGE')
          versions[$1.strip] = $2.strip 
        end
      end
    end
  
    versions[@variable] = @bundle_version
    versions
  end

  def push(new_version=nil)
    new_version = @bundle_version if new_version.nil?
    puts 'Pushing ' + @name
    Dir.chdir(@path)
    execute('git push origin ' + new_version + ':' + @master_branch + ' --tags')
  end
  
  def update_virgo_build(new_version)
    puts '  Updating to Virgo Build version \'' + new_version + '\''
    Dir.chdir(@path + "/virgo-build")
    execute("git pull origin master:master ")
    execute("git fetch --tags")
    execute("git checkout " + new_version)
    Dir.chdir(@path)
    execute('git commit --allow-empty -a -m "[UPDATE BUILDLOR] Updated Virgo Build to \'' + new_version + '\'"')
  end
  
  def fork(branch_name)
    create_branch(branch_name)
  end
  
  def push_fork(branch_name)
    puts 'Pushing ' + @name
    Dir.chdir(@path)
    execute('git push origin ' + branch_name)
  end

########################################################################################################################

  private

  def create_branch(name)
    puts('  Creating branch ' + name + ' -> ' + @master_branch)
    execute('cd ' + @path + '; git checkout -q -b ' + name + ' --track origin/' + @master_branch)
  end
  
  def create_new_bundle_version_from_properties
    version = nil
    IO.foreach(@path + '/build.properties') do |line|
      version = $1.strip if line =~ /^version=(.*)/
    end

    @bundle_version = version + '.D-' + Time.now.utc.strftime("%Y%m%d%H%M%S")
  end

  def update_build_properties(version, build_stamp = nil, release_type = 'integration')
    properties = @path + '/build.properties'
    puts '    Updating properties'
    lines = IO.readlines(properties)
    lines.each do |line|
      if line =~ /^version/
        line.gsub!(/^version.*/, 'version=' + version)
        
        if(!build_stamp.nil?)
          lines.insert(lines.index(line) + 2, 'build.stamp=' + build_stamp + $/)
        end
      elsif line =~ /^release\.type/
        line.gsub!(/^release\.type.*/, 'release.type=' + release_type)
      end
    end
    write_file(properties, lines)
    execute('cd ' + @path + '; git commit --allow-empty -a -m "[RELEASELOR] Updated properties"')
  end

  def update_build_versions(versions)
    puts '    Updating versions'
    versions.sort.reverse.each do |var_version|
      Version.update(var_version[0], var_version[1], @path)
    end
    execute('cd ' + @path + '; git commit --allow-empty -a -m "[RELEASELOR] Updated versions"')
  end

  def execute(command)
    output = `#{command}`
    if $?.to_i != 0
      abort('Execution Failed')
    end
    output
  end

  def write_file(path, lines)
    file = File.new(path, 'w')
    lines.each do |line|
      file.write(line)
    end
    file.close
  end

end