require "dry/web/roda/generators/abstract_generator"

module Dry
  module Web
    module Roda
      module Generators
        class SubApp < AbstractGenerator
          def populate_templates
            add_lib
            add_system
            add_web
          end

          private

          def destination
            options.fetch(:to) { File.join("apps", target_dir) }
          end

          def umbrella_name
            options.fetch(:umbrella)
          end

          def underscored_umbrella_name
            Inflections.underscored_name(umbrella_name)
          end

          def lib_path
            "lib/#{underscored_umbrella_name}/#{underscored_project_name}"
          end

          def system_lib_path
            "system/#{underscored_umbrella_name}/#{underscored_project_name}"
          end

          def add_lib
            add_template('subapp/view_context.rb.tt', "#{lib_path}/view_context.rb")
            add_template('subapp/view.rb.tt', "#{lib_path}/view.rb")
            add_template('subapp/welcome.rb.tt', "#{lib_path}/views/welcome.rb")
          end

          def add_system
            add_template('subapp/web.rb.tt', "#{system_lib_path}/web.rb")
            add_template('subapp/container.rb.tt', "#{system_lib_path}/container.rb")
            add_template('subapp/import.rb.tt', "#{system_lib_path}/import.rb")
            add_template('subapp/boot.rb.tt', 'system/boot.rb')
          end

          def add_web
            add_template('subapp/example_routes.rb.tt', 'web/routes/example.rb')
            add_template('application.html.slim', 'web/templates/layouts/application.html.slim')
            add_template('welcome.html.slim', 'web/templates/welcome.html.slim')
          end

          def template_scope
            {
              underscored_project_name: underscored_project_name,
              camel_cased_app_name: Inflections.camel_cased_name(target_dir),
              underscored_umbrella_name: underscored_umbrella_name,
              camel_cased_umbrella_name: Inflections.camel_cased_name(umbrella_name),
            }
          end
        end
      end
    end
  end
end
