require 'buildr/packaging/package'
require 'buildr/packaging/archive'

module Buildr

  class PackageRPMTask < ArchiveTask

    def initialize(root, path)
      @temp_working_dir = File.join(Dir.tmpdir(), "buildr.#{$$}")
      @rpm_top_dir = "#{@temp_working_dir}/buildr/rpm_top_dir"
      @rpm_build_root = "#{@temp_working_dir}/buildr/rpm_build_root"
      @target = "noarch"
      super
    end

    def spec=(value)
      @spec = value
    end

    def def target=(value)
      @target = value 
    end
    
  private

    def clean_rpm_env
      rm_rf @temp_working_dir
    end

    def setup_rpm_env
      mkdir_p "#{@rpm_top_dir}/SPECS"
      mkdir_p "#{@rpm_top_dir}/SOURCES"
      mkdir_p "#{@rpm_top_dir}/RPMS/#{@target}"
      mkdir_p "#{@rpm_top_dir}/BUILD"
      mkdir_p @rpm_build_root
    end
    
    def create_from(file_map)
      setup_rpm_env
      file_map.each do |path, content|
        next if content.nil? || File.directory?(content.to_s)
        path = File.join(@rpm_build_root,  path)
        mkdir_p File.dirname(path) unless File.exists?(File.dirname(path))
        puts File.dirname(path)
        cp(content.to_s, path)
      end

      speclocation = "#{@rpm_top_dir}/SPECS/spec"

      File.open(speclocation, "w") do |specfile|
        specfile.puts(@spec)
      end

      sh "rpmbuild -bb #{speclocation} --buildroot #{ @rpm_build_root } --define '_topdir #{ @rpm_top_dir }' --target #{@target}"
      cp(Dir["#{@rpm_top_dir}/RPMS/#{ @target }/*.rpm"][0], name)
      clean_rpm_env
    end
  end

  module PackageAsRPM #:nodoc:

    def package_as_rpm(file_name) 
      PackageRPMTask.define_task(file_name)
    end
  end

  class Project
    include PackageAsRPM
  end
end
  

