require 'config_builder/model'

class PEBuild::ConfigBuilder::Global < ::ConfigBuilder::Model::Base

  # @!attribute [rw] version
  #   @return [String] The version of Puppet Enterprise to install.
  def_model_attribute :version

  # @!attribute [rw] version_file
  #   @return [String] The path to a file relative to {#download_root}. The
  #     contents of this file will be read and used to specify {#version}.
  #   @since 0.9.0
  def_model_attribute :version_file

  # @!attribute [rw] series
  #   @return [String] The release series of PE. Completely optional and
  #     currently has no effect other than being an interpolation token
  #     available for use in {#download_root}.
  #
  #   @since 0.9.0
  def_model_attribute :series

  # @!attribute [rw] suffix
  #   @return [String] The distribution specifix suffix of the Puppet
  #     Enterprise installer to use.
  def_model_attribute :suffix

  # @!attribute [rw] filename
  #   @return [String] The filename of the Puppet Enterprise installer.
  def_model_attribute :filename

  # @!attribute [rw] download_root
  #   @return [String] The URI to the directory containing Puppet Enterprise
  #     installers if the installer is not yet cached. This setting is optional.
  def_model_attribute :download_root

  # @!attribute shared_installer
  #   @return [Boolean] Whether to run PE installation using installers and
  #     answers shared using the `/vagrant` mount. If set to `false`, resources
  #     will be downloaded remotely to the home directory of whichever user
  #     account Vagrant is using. Defaults to `true`.
  #
  #   @since 0.14.0
  def_model_attribute :shared_installer

  def to_proc
    Proc.new do |global_config|
      with_attr(:download_root) { |val| global_config.pe_build.download_root = val }
      with_attr(:version)       { |val| global_config.pe_build.version       = val }
      with_attr(:version_file)  { |val| global_config.pe_build.version_file  = val }
      with_attr(:series)        { |val| global_config.pe_build.series        = val }
      with_attr(:suffix)        { |val| global_config.pe_build.suffix        = val }
      with_attr(:filename)      { |val| global_config.pe_build.filename      = val }
      with_attr(:shared_installer) { |val| global_config.pe_build.shared_installer = val }
    end
  end
end

class ConfigBuilder::Model::Root
  def_model_delegator :pe_build

  def eval_pe_build(root_config)
    if attr(:pe_build)
      p = PEBuild::ConfigBuilder::Global.new_from_hash(attr(:pe_build))
      p.call(root_config)
    end
  end
  private :eval_pe_build
end
