require 'pathname'

module Taperole
  module Installer
    include Taperole::Helpers::Files
    include Thor::Actions

    protected

    def install_tape
      add_tape_to_gitignore
      mkdir tapefiles_dir
      create_tape_files
      create_roles_dir
      create_inventory_file
      create_ssh_keys_dir
      handle_vagrantfile
    end

    def uninstall_tape
      rm "#{tapefiles_dir}/provision.yml"
      rm "#{tapefiles_dir}/deploy.yml"
      rm "#{tapefiles_dir}/tape_vars.yml"
      rm "#{tapefiles_dir}/rake.yml"
      rm "#{tapefiles_dir}/roles"
      rm "#{tapefiles_dir}/hosts"
      rm "#{tapefiles_dir}/dev_keys"
      rm "#{local_dir}/Vagrantfile"
    end

    private

    def add_tape_to_gitignore
      File.open('.gitignore', 'r+') { |f| f.puts '.tape' unless f.read =~ /^\.tape$/ }
    end

    def create_tape_files
      if fe_app? && !rails_app?
        logger.info '🔎  JS/HTML app detected'.blue
        copy_static_app_examples
      elsif rails_app?
        logger.info '🔎  Rails app detected'.blue
        copy_basic_examples
      end
    end

    def copy_static_app_examples
      %w(provision deploy tape_vars).each do |base_filename|
        copy_example(
          "templates/static_html/#{base_filename}.example.yml",
          "#{tapefiles_dir}/#{base_filename}.yml"
        )
      end
    end

    def copy_basic_examples
      %w(provision deploy tape_vars rake).each do |base_filename|
        copy_example(
          "templates/base/#{base_filename}.example.yml",
          "#{tapefiles_dir}/#{base_filename}.yml"
        )
      end
    end

    def create_roles_dir
      mkdir "#{tapefiles_dir}/roles"
      `touch #{tapefiles_dir}/roles/.keep`
    end

    def create_inventory_file
      copy_example 'templates/base/hosts.example', "#{tapefiles_dir}/hosts"
    end

    def create_ssh_keys_dir
      mkdir "#{tapefiles_dir}/dev_keys"
    end

    def handle_vagrantfile
      if options[:vagrant].nil?
        options[:vagrant] = ask('Are you going to use vagrant? (y/n): ')
      end
      if options[:vagrant]
        copy_example 'Vagrantfile', 'Vagrantfile'
      end
    end
  end
end