module Foreman
  module Parameters
    class Validator
      KEY_DELM = ","

      def initialize(item, options = {})
        @item, @options = item, options
      end

      def validate!
        case @options[:type].to_s
        when "regexp"
          validate_regexp
        when "list", "array"
          validate_list
        else
          return true
        end
      end

      private

      def value
        @item.send(@options[:getter])
      end

      def validate_regexp
        return true if contains_erb?(value) && Setting[:interpolate_erb_in_parameters]

        unless value =~ /#{@options[:validate_with]}/
          add_error(_("is invalid"))
          return false
        end
        true
      end

      def validate_list
        return true if contains_erb?(value) && Setting[:interpolate_erb_in_parameters]
        unless @options[:validate_with].split(KEY_DELM).map(&:strip).include?(value.to_s)
          add_error(_("%{value} is not one of %{rules}") % { :value => value, :rules => @options[:validate_with] })
          return false
        end
        true
      end

      def add_error(message)
        @item.errors.add(@options[:getter], message)
      end

      def contains_erb?(value)
        value =~ /<%.*%>/
      end
    end
  end
end
