require 'svn_commands'
require 'version_number'
require 'fileutils'

class DiggModule
  include Comparable
  attr_reader :moduleName, :wcBasePath, :releaseBranch
  def initialize(module_name, wc_base_path, release_branch)
    @moduleName = module_name
    @wcBasePath = wc_base_path
    @releaseBranch = release_branch
  end
  
  def utilDir
    @utilDir ||= begin
      provisionalDir = "#{self.wcBasePath}/build/trunk"
      unless File.exist? provisionalDir
        SvnCommands::Update.new("build/trunk", nil, true, false, self.wcBasePath) # update the current working copy to be sure the dir is there
      end
      provisionalDir
    end
  end
  
  def myCatDir
    "#{self.wcBasePath}/LOLcat/branches/#{self.releaseBranch}"
  end
  
  def myDir
    "#{self.myCatDir}/modules/#{self.moduleName}"
  end
  
  def getVersion
    Dir.chdir(myDir) { |cwd|
      VersionNumber.new(IO.popen(%Q{ #{self.utilDir}/version package.xml }).readlines.first.strip)
    }
  end
  
  def updateVersion
    Dir.chdir(myDir) { |cwd|
      current_version = self.getVersion
      new_version = block_given?() ? (yield current_version) : (current_version.next_after_patchlevel_increment)
      puts IO.popen(%Q{ #{self.utilDir}/setversion package.xml #{new_version} }).readlines
      self.updateManifest("#{myCatDir}/manifest/pear-common",new_version)
    }
  end
  
  def updateManifest(manifest_path,new_version)
    manifest_lines = File.readlines(manifest_path)
    File.open(manifest_path, "w+") { |f|
      manifest_lines.each { |line|
        if line =~ /^pear.digg.internal\/#{self.moduleName}-/
          f.puts("pear.digg.internal/#{self.moduleName}-#{new_version}")
        else
          f.puts(line)
        end
      }
    }
  end
  
  def updateContents
    Dir.chdir(myDir) { |cwd|
      puts IO.popen(%Q{ #{self.utilDir}/update-contents package.xml }).readlines
    }
  end
  
  def updateStability(stability="stable")
    Dir.chdir(myDir) { |cwd|
      puts IO.popen(%Q{ #{self.utilDir}/setstability package.xml #{stability} }).readlines
    }
  end
  
  def buildPearPackage
    Dir.chdir(myDir) { |cwd|
      puts IO.popen(%Q{ pear package }).readlines
    }
    %Q{ #{self.utilDir}/upload #{myDir}/#{self.moduleName}-#{self.getVersion}.tgz }
  end
  
  def cleanupPackageXmlFormatting
    Dir.chdir(myDir) { |cwd|
      FileUtils.copy("package.xml","package.xml.unformatted")
      puts IO.popen(%Q{ XMLLINT_INDENT="    " xmllint --format package.xml.unformatted > package.xml }).readlines
      FileUtils.rm("package.xml.unformatted")
    }
  end
  
  def to_s
    self.moduleName
  end
  
  def <=>(other)
    self.moduleName <=> other.moduleName
  end
  
  def eql?(other)
    self.moduleName == other.moduleName
  end
  
  def hash
    self.moduleName.hash
  end
  
end