module Capistrano

class FileNotFound < StandardError
end

end

namespace :deploy do

desc 'Choose project to deploy'
task :set_project do

  if fetch(:project).nil? && fetch(:projects)

    # We get all the multi in the directory
    projects = fetch(:projects).sort.to_h

    # If project parameter is set, we don't need to ask for it
    if ENV['project'] && !ENV['project'].nil? && projects.key?(ENV['project'].to_sym)
      set :project_name, ENV['project']
    else

      puts '====================='
      puts 'PROJECT'
      puts '====================='
      projects.each do |project|
        puts project[0].to_s
      end

      begin
        ask(:project_name, nil)
        fetch(:project_name)

      end while fetch(:project_name).nil? ||
        !projects.key?(fetch(:project_name).to_sym)

    end

    set :project, fetch(:project_name)

    if fetch(:use_custom_deploy_to) && fetch(:deploy_to)
      app_folder = fetch(:application).tr('-', '/')
      set :deploy_to, "#{fetch(:deploy_to).to_s}/#{fetch(:project).to_s}/#{app_folder}"
    end

  end

end

desc 'Copy files for the project'
task :copy_files do
  current_project = fetch(:project).to_s

  paths = Array.new
  if current_project
    paths.push(File.path("#{release_path}/#{fetch(:config_dir)}/#{fetch(:stage)}/#{fetch(:projects_dir)}/#{current_project}"))
  end

  if fetch(:use_global_config)
    paths.push(File.path("#{release_path}/#{fetch(:config_dir)}/#{fetch(:stage)}/#{fetch(:global_config_dir)}"))
  end

  on roles(:all) do

    paths.each do |path|
      within path do
        set :linked_files, []
        files = capture :find, '.', '-type', 'f', '|', 'cut', '-b', '3-'

        files = files.split("\n")
        files.each do |file|
          file = Pathname.new file
          execute :mkdir, '-p', release_path.join(file.dirname)
          execute :mv, file, release_path.join(file.dirname)
        end
      end
    end

    within release_path do
      execute :rm, '-Rf', fetch(:config_dir)
    end

  end

end

desc 'Set server group to deploy'
task :set_server_group do

  server_groups = fetch(:server_groups)
  if server_groups

    server_group = fetch(:projects)[fetch(:project).to_sym][:server_group]
    servers = server_groups[server_group.to_sym][:servers]

    servers.each do |ip_addr, data|
      server ip_addr, data
    end

  end
end

after 'deploy:set_project', 'deploy:set_server_group'
before 'deploy:starting', 'deploy:set_project'
after 'deploy:symlink:shared', 'deploy:copy_files'

end

namespace :load do

task :defaults do
  set :use_custom_deploy_to, true
  set :config_dir, 'config'
  set :use_global_config, false
  set :projects_dir, ''
  set :global_config_dir, 'global'
end

end