# Required base libraries
require 'ash/base'

# Bootstrap Capistrano instance
configuration = Capistrano::Configuration.respond_to?(:instance) ?
  Capistrano::Configuration.instance(:must_exist) :
  Capistrano.configuration(:must_exist)

configuration.load do
  # --------------------------------------------
  # Default variables
  # --------------------------------------------
  set :scm_username, "remotesvn"
  
  # --------------------------------------------
  # Task chains
  # --------------------------------------------
  after "deploy:setup", "deploy:setup_local"
  after "deploy:finalize_update", "magento:activate_config"
  after "deploy:symlink", "magento:symlink"
  after "deploy", "magento:purge_cache"

  # --------------------------------------------
  # Overloaded tasks
  # --------------------------------------------
  namespace :deploy do
    desc "Setup local files necessary for deployment"
    task :setup_local do
      # attempt to create files needed for proper deployment
      system("touch htaccess.dist app/etc/local.xml.staging app/etc/local.xml.production")
    end
    
    desc "Setup shared application directories and permissions after initial setup"
    task :setup_shared do
      # remove Capistrano specific directories
      run "rm -Rf #{shared_path}/log"
      run "rm -Rf #{shared_path}/pids"
      run "rm -Rf #{shared_path}/system"

      # create shared directories
      run "mkdir -p #{shared_path}/includes"
      run "mkdir -p #{shared_path}/media"
      run "mkdir -p #{shared_path}/sitemap"
      run "mkdir -p #{shared_path}/var"

      # set correct permissions
      run "chmod 755 #{shared_path}/*"
    end

    desc "[internal] Touches up the released code. This is called by update_code after the basic deploy finishes."
    task :finalize_update, :except => { :no_release => true } do
      # synchronize media directory with shared data
      run "rsync -rltDvzog #{latest_release}/media/ #{shared_path}/media/"
      
      # put ".htaccess" in place
      run "mv #{latest_release}/htaccess.dist #{latest_release}/.htaccess"

      # remove directories that will be shared
      run "rm -Rf #{latest_release}/includes"
      run "rm -Rf #{latest_release}/media"
      run "rm -Rf #{latest_release}/sitemap"
      run "rm -Rf #{latest_release}/var"

      # set the file and directory permissions
      ash.fixperms
    end

    namespace :web do
      desc "Disable the application and show a message screen"
      task :disable, :except => { :no_release => true } do
        run "touch #{current_path}/maintenance.flag"
      end

      desc "Enable the application and remove the message screen"
      task :enable, :except => { :no_release => true } do
        run "rm #{current_path}/maintenance.flag"
      end
    end
  end
  
  # --------------------------------------------
  # Overloaded Ash tasks
  # --------------------------------------------
  namespace :ash do
    desc "Set standard permissions for Ash servers"
    task :fixperms, :except => { :no_release => true } do
      # chmod the files and directories.
      run "find #{latest_release} -type d -exec chmod 755 {} \\;"
      run "find #{latest_release} -type f -exec chmod 644 {} \\;"
    end
  end

  # --------------------------------------------
  # Magento specific tasks
  # --------------------------------------------
  namespace :magento do
    desc "Set appropriate configuration values for the stage"
    task :activate_config, :except => { :no_release => true } do
      run "cp -f #{latest_release}/app/etc/local.xml.#{stage} #{latest_release}/app/etc/local.xml"
    end

    desc "Symlink shared directories"
    task :symlink, :except => { :no_release => true } do
      run "ln -nfs #{shared_path}/includes #{current_release}/includes"
      run "ln -nfs #{shared_path}/media #{current_release}/media"
      run "ln -nfs #{shared_path}/sitemap #{current_release}/sitemap"
      run "ln -nfs #{shared_path}/var #{current_release}/var"
    end

    desc "Purge Magento cache directory"
    task :purge_cache, :except => { :no_release => true } do
      run "rm -Rf #{shared_path}/var/cache/*"
    end

    desc "Watch Magento system log"
    task :watch_logs, :except => { :no_release => true } do      
      run "tail -f #{shared_path}/var/log/system.log" do |channel, stream, data|
        puts  # for an extra line break before the host name
        puts "#{channel[:host]}: #{data}" 
        break if stream == :err    
      end
    end

    desc "Watch Magento exception log"
    task :watch_exceptions, :except => { :no_release => true } do
      run "tail -f #{shared_path}/var/log/exception.log" do |channel, stream, data|
        puts  # for an extra line break before the host name
        puts "#{channel[:host]}: #{data}" 
        break if stream == :err    
      end
    end
  end

  # --------------------------------------------
  # Custom tasks
  # --------------------------------------------

  # update core_config_data; set value = "domain" where scope_id = 0 and path = "web/unsecure/base_url"
end