namespace :load do

task :defaults do
  set :redirect_page_active,        -> { false }
  set :redirect_old_domains,        -> { [] }
  set :redirect_old_ssl_domains,    -> { [] }
  set :redirect_new_domain,         -> { '' }
  set :redirect_new_name,           -> { '' }
  set :redirect_ssl_cert,           -> { '' }
  set :redirect_ssl_key,            -> { '' }
  set :redirect_roles,              -> { :app }
  set :redirect_index_path,         -> { "redirector" }
  set :redirect_index_parent,       -> { "#{ shared_path }" }
  set :redirect_index_template,     -> { :default }
  set :redirect_nginx_template,     -> { :default }
  set :redirect_conf_name,          -> { "redirector_#{fetch(:application)}_#{fetch(:stage)}" }
end

end

namespace :redirect_page do

desc 'upload the redirect page'
task :upload do
  on release_roles fetch(:redirect_roles) do
    within fetch(:redirect_index_parent, shared_path) do
      # create dir if not existing
      execute :mkdir, "-p #{ fetch(:redirect_index_path, 'redirector') }" 
      # upload index.html file
      config_file = fetch(:redirect_index_template, :default)
      if config_file == :default
        magic_template("redirect_page.html", '/tmp/redirect_page.html')
      else
        magic_template(config_file, '/tmp/redirect_page.html')
      end
      execute :sudo, :mv, '/tmp/redirect_page.html', "#{ fetch(:redirect_index_path, 'redirector') }/index.html"
    end
  end
end

desc 'Creates the redirect-site configuration and upload it to the available folder'
task :add => ['nginx:load_vars'] do
  on release_roles fetch(:nginx_roles) do
    within fetch(:sites_available) do
      config_file = fetch(:redirect_nginx_template, :default)
      if config_file == :default
        magic_template("nginx_redirect_page.conf", '/tmp/nginx_redirector.conf')
      else
        magic_template(config_file, '/tmp/nginx_redirector.conf')
      end
      execute :sudo, :mv, '/tmp/nginx_redirector.conf', "#{ fetch(:redirect_conf_name) }"
    end
  end
end

desc 'Enables the redirect-site creating a symbolic link into the enabled folder'
task :enable => ['nginx:load_vars'] do
  on release_roles fetch(:nginx_roles) do
    if test "! [ -h #{fetch(:sites_enabled)}/#{ fetch(:redirect_conf_name) } ]"
      within fetch(:sites_enabled) do
        execute :sudo, :ln, '-nfs', "#{fetch(:sites_available)}/#{ fetch(:redirect_conf_name) }", "#{fetch(:sites_enabled)}/#{ fetch(:redirect_conf_name) }"
      end
    end
  end
end

desc 'Disables the redirect-site removing the symbolic link located in the enabled folder'
task :disable => ['nginx:load_vars'] do
  on release_roles fetch(:nginx_roles) do
    if test "[ -f #{fetch(:sites_enabled)}/#{ fetch(:redirect_conf_name) } ]"
      within fetch(:sites_enabled) do
        execute :sudo, :rm, '-f', "#{ fetch(:redirect_conf_name) }"
      end
    end
  end
end

desc 'Removes the redirect-site removing the configuration file from the available folder'
task :remove => ['nginx:load_vars'] do
  on release_roles fetch(:nginx_roles) do
    if test "[ -f #{fetch(:sites_available)}/#{ fetch(:redirect_conf_name) } ]"
      within fetch(:sites_available) do
        execute :sudo, :rm, "#{ fetch(:redirect_conf_name) }"
      end
    end
  end
end

desc 'upload redirect-page and activate nginx config'
task :upload_and_enable do
  invoke "redirect_page:upload"
  invoke "redirect_page:add"
  invoke "redirect_page:enable"
end

namespace :lets_encrypt do

  desc "Generate MONIT-WebClient LetsEncrypt certificate"
  task :certonly do
    on release_roles fetch(:lets_encrypt_roles) do
      execute :sudo, "#{ fetch(:lets_encrypt_path) }/certbot-auto --non-interactive --agree-tos --allow-subset-of-names --email #{fetch(:lets_encrypt_email)} certonly --webroot -w #{current_path}/public #{ Array(fetch(:redirect_old_ssl_domains)).map{ |d| "-d #{d.gsub(/^\*?\./, "")} -d www.#{d.gsub(/^\*?\./, "")}" }.join(" ") }"
    end
  end

end

end

namespace :deploy do

after :finishing, :include_redirect_page do
  if fetch(:redirect_page_active, false)
    invoke "redirect_page:upload_and_enable"
  end
end

end