# encoding: utf-8
module Middleman
  module Presentation
    module Cli
      # This class provides an 'build presentation' command for the middleman CLI.
      class BuildPresentation < BaseGroup
        include Thor::Actions

        desc Middleman::Presentation.t('views.presentation.build.title')

        class_option :add_static_servers, type: :boolean, default: Middleman::Presentation.config.add_static_servers, desc: Middleman::Presentation.t('views.presentation.build.options.add_static_servers')

        def initialize_generator
          enable_debug_mode
        end

        def add_to_source_path
          source_paths << File.expand_path('../../../../templates', __FILE__)
        end

        def cleanup
          # before server.inst to prevent having duplicate files
          remove_dir 'build'
        end

        def make_middleman_environment_available
          @environment = MiddlemanEnvironment.new
        end

        def extract_data
          @images_directory      = @environment.images_directory
          @stylesheets_directory = @environment.stylesheets_directory
          @javascripts_directory = @environment.scripts_directory
          @fonts_directory       = @environment.fonts_directory
          @rackup_config_file    = File.join @environment.build_directory, 'config.ru'
          @readme_file           = File.join @environment.build_directory, 'README.md'

          @title                 = Middleman::Presentation.config.title
          @subtitle              = Middleman::Presentation.config.subtitle
          @author                = Middleman::Presentation.config.author
          @speaker               = Middleman::Presentation.config.speaker
          @date                  = Middleman::Presentation.config.date
          @license_file          = Dir.glob(File.join(@environment.root_path, 'LICENSE.*')).first

          @add_static_servers = options[:add_static_servers]
        end

        def build_presentation
          Middleman::Presentation.logger.info Middleman::Presentation.t(
            'views.presentation.build.headline',
            title: Middleman::Presentation.config.title
          )

          cmd = []
          cmd << 'middleman build'
          cmd << '--verbose' if options[:debug_mode]

          system cmd.join(' ')

          fail Thor::Error, Middleman::Presentation.t('errors.middleman_build_error', result: '') unless $CHILD_STATUS.exitstatus == 0
        end

        def add_rackup_file
          template 'rackup.config.erb', @rackup_config_file
        end

        def add_server_executables
          return unless @add_static_servers

          pattern = File.expand_path('../../../../utils/server/*', __FILE__)
          Dir.glob(pattern).each { |f| FileUtils.cp f, @environment.build_path }
        end

        def add_readme
          template_file = BuildReadmeTemplate.new
          template template_file.file, File.join(@environment.build_directory, "README#{template_file.proposed_extname}"), force: options[:force]
        end

        def add_license
          return if @license_file.blank?

          copy_file @license_file, File.join(@environment.build_directory, File.basename(@license_file))
        end
      end
    end
  end
end