module Vagrant
  module LXC
    module Action
      # Prepare arguments to be used for lxc-create
      class HandleBoxMetadata
        SUPPORTED_VERSIONS = [2, 3]
        def initialize(app, env)
          @app    = app
          @logger = Log4r::Logger.new("vagrant::lxc::action::handle_box_metadata")
        end

        def call(env)
          @env = env
          @box = @env[:machine].box

          @env[:ui].info I18n.t("vagrant.actions.vm.import.importing",
                                :name => @env[:machine].box.name)

          @logger.debug 'Validating box contents'
          validate_box

          @logger.debug 'Setting box options on environment'
          @env[:lxc_template_opts] = template_opts
          @env[:lxc_template_src]  = template_src

          if template_config_file.exist?
            @env[:lxc_template_config] = template_config_file.to_s
          end

          @app.call env
        end

        def template_src
          @template_src ||= @box.directory.join('lxc-template').to_s
        end

        def template_config_file
          @template_config_file ||= @box.directory.join('lxc.conf')
        end

        def template_opts
          @template_opts ||= @box.metadata.fetch('template-opts', {}).dup.merge!(
            '--tarball'  => rootfs_tarball,
            # TODO: Deprecate this, the rootfs should be ready for vagrant-lxc
            #       SSH access at this point
            '--auth-key' => Vagrant.source_root.join('keys', 'vagrant.pub').expand_path.to_s
          )
        end

        def rootfs_tarball
          @rootfs_tarball ||= @box.directory.join('rootfs.tar.gz').to_s
        end

        def validate_box
          unless SUPPORTED_VERSIONS.include? @box.metadata.fetch('version').to_i
            raise Errors::IncompatibleBox.new name: @box.name,
                                              found: @box.metadata.fetch('version').to_i,
                                              supported: SUPPORTED_VERSIONS.join(' and ')
          end

          unless File.exists?(template_src)
            raise Errors::TemplateFileMissing.new name: @box.name
          end

          unless File.exists?(rootfs_tarball)
            raise Errors::RootFSTarballMissing.new name: @box.name
          end
        end
      end
    end
  end
end