require 'capistrano'

module Deprec
  DEPREC_TEMPLATES_BASE = File.join(File.dirname(__FILE__), '..', 'recipes', 'templates')

  def render_template_to_file(template_name, destination_file_name, templates_dir = DEPREC_TEMPLATES_BASE)
    template_name += '.conf' if File.extname(template_name) == ''
    
    file = File.join(templates_dir, template_name)
    buffer = render :template => File.read(file)

    temporary_location = "/tmp/#{template_name}"
    put buffer, temporary_location
    sudo "cp #{temporary_location} #{destination_file_name}"
    delete temporary_location
  end
  
  def append_to_file_if_missing(filename, value, options={})
    # XXX sort out single quotes in 'value' - they'l break command!
    # XXX if options[:requires_sudo] and :use_sudo then use sudo
    sudo <<-END
    sh -c '
      grep "#{value}" #{filename} > /dev/null 2>&1 || 
      test ! -f #{filename} ||
      echo "#{value}" >> #{filename}
      '
    END
  end
  
  # create new user account on target system
  def useradd(user)
    send(run_method, "grep '^#{user}:' /etc/passwd || sudo /usr/sbin/useradd -m #{user}")
  end
  
  # create a new group on target system
  def groupadd(group)
    # XXX I don't like specifying the path to groupadd - need to sort out paths before long
    send(run_method, "grep '#{group}:' /etc/group || sudo /usr/sbin/groupadd #{group}")
  end
  
  # add group to the list of groups this user belongs to
  def add_user_to_group(user, group)
    send(run_method, "groups #{user} | grep ' #{group} ' || sudo /usr/sbin/usermod -G #{group} -a #{user}")
  end
  
  # download source package if we don't already have it
  def download_src(src_package, src_dir)
    deprec.groupadd(group)
    sudo "test -d #{src_dir} || sudo mkdir #{src_dir}" 
    sudo "chgrp -R #{group} #{src_dir}"
    sudo "chmod -R g+w #{src_dir}"
    # XXX check if file exists and if we have and MD5 hash or bytecount to compare against
    # XXX if so, compare and decide if we need to download again
    sudo "sh -c 'cd #{src_dir} && test -f #{src_package[:file]} || wget #{src_package[:url]}'"
  end
  
  # unpack src and make it writable by the group
  def unpack_src(src_package, src_dir)
    package_dir = File.join(src_dir, src_package[:dir])
    sudo <<-SUDO
    sh -c '
      cd #{src_dir};
      test -d #{package_dir}.old && rm -fr #{package_dir}.old;
      test -d #{package_dir} && mv #{package_dir} #{package_dir}.old;
      #{src_package[:unpack]}
      chgrp -R #{group} #{package_dir};  
      chmod -R g+w #{package_dir};
    '
    SUDO
  end
  
  # install package from source
  def install_from_src(src_package, src_dir)
    package_dir = File.join(src_dir, src_package[:dir])
    unpack_src(src_package, src_dir)
    sudo <<-SUDO
    sh -c '
      cd #{package_dir};
      #{src_package[:configure]}
      #{src_package[:make]}
      #{src_package[:install]}
      #{src_package[:post_install]}
      '
    SUDO
  end

end

Capistrano.plugin :deprec, Deprec