##
 # Copyright © 2016 by David Alger. All rights reserved
 # 
 # Licensed under the Open Software License 3.0 (OSL-3.0)
 # See included LICENSE file for full text of OSL-3.0
 # 
 # http://davidalger.com/contact/
 ##

include Capistrano::Magento2::Helpers

namespace :deploy do
  before 'deploy:check:linked_files', 'magento:deploy:check'

  # If both 'scopes' and 'themes' are available in app/etc/config.php then the build should not require database or
  # cache backend configuration to deploy. Removing the link to app/etc/env.php in this case prevents any possible
  # side effects that may arise from the build running in parallel to the live production release (such as the cache
  # being randomly disabled during the composer install step of the build, something which has been observed). This
  # requires "bin/magento app:config:dump scopes themes i18n" be run to dump theme/store config and the result comitted to repository
  before 'deploy:symlink:linked_files', :detect_scd_config do
    on primary fetch(:magento_deploy_setup_role) do
      unless test %Q[#{SSHKit.config.command_map[:php]} -r '
            $cfg = include "#{release_path}/app/etc/config.php";
            exit((int)(isset($cfg["scopes"]) && isset($cfg["themes"])));
        ']
        info "Removing app/etc/env.php from :linked_dirs for zero-side-effect pipeline deployment."
        remove :linked_files, 'app/etc/env.php'
      end
    end
  end

  before :starting, :confirm_action do
    if fetch(:magento_deploy_confirm).include? fetch(:stage).to_s
      print "\e[0;31m      Are you sure you want to deploy to #{fetch(:stage).to_s}? [y/n] \e[0m"
      proceed = STDIN.gets[0..0] rescue nil
      exit unless proceed == 'y' || proceed == 'Y'
    end
  end

  # Links app/etc/env.php if previously dropped from :linked_dirs in :detect_scd_config
  task 'symlink:link_env_php' do
    on release_roles :all do
      # Normally this would be wrapped in a conditional, but during SCD and/or DI compile Magento frequently writes
      # to cache_types -> compiled_config resulting in an env.php file being present (albeit the wrong one)
      execute :ln, "-fsn #{shared_path}/app/etc/env.php #{release_path}/app/etc/env.php"
    end
  end

  task :updated do
    invoke 'magento:deploy:verify'
    invoke 'magento:composer:install' if fetch(:magento_deploy_composer)
    invoke 'magento:setup:permissions'
    invoke 'magento:setup:selinux'

    if fetch(:magento_deploy_production)
      invoke 'magento:setup:static-content:deploy'
      invoke 'magento:setup:di:compile'
      invoke 'magento:composer:dump-autoload' if fetch(:magento_deploy_composer)
    end

    invoke 'deploy:symlink:link_env_php'

    if fetch(:magento_deploy_production)
      invoke 'magento:deploy:mode:production'
    end

    invoke! 'magento:setup:permissions'
    invoke 'magento:maintenance:check'
    invoke 'magento:maintenance:enable' if fetch(:magento_deploy_maintenance)

    on release_roles :all do
      if test "[ -f #{current_path}/bin/magento ]"
        within current_path do
          execute :magento, 'maintenance:enable' if fetch(:magento_deploy_maintenance)
        end
      end
    end

    if not fetch(:magento_internal_zero_down_flag)
      on cache_hosts do
        within release_path do
          execute :magento, 'cache:flush'
        end
      end
      invoke 'magento:app:config:import'
      invoke 'magento:setup:db:schema:upgrade'
      invoke 'magento:setup:db:data:upgrade'
    end

    on primary fetch(:magento_deploy_setup_role) do
      within release_path do
        _disabled_modules = disabled_modules
        if _disabled_modules.count > 0
          info "\nThe following modules are disabled per app/etc/config.php:\n"
          _disabled_modules.each do |module_name|
            info '- ' + module_name
          end
        end
      end
    end
  end

  task :published do
    invoke 'magento:cache:flush'
    invoke 'magento:cache:varnish:ban'
    invoke 'magento:maintenance:disable' if fetch(:magento_deploy_maintenance)
  end
end
