class StringSettingValidator
  def initialize(opts={})
    @opts = opts
    @regex = Regexp.new(opts[:regex]) if opts[:regex]
    @regex_error = opts[:regex_error] || 'site_settings.errors.regex_mismatch'
  end

  def valid_value?(val)
    return true if !val.present?

    if (@opts[:min] and @opts[:min].to_i > val.length) || (@opts[:max] and @opts[:max].to_i < val.length)
      @length_fail = true
      return false
    end

    if @regex and !(val =~ @regex)
      @regex_fail = true
      return false
    end

    true
  end

  def error_message
    if @regex_fail
      I18n.t(@regex_error)
    elsif @length_fail
      if @opts[:min] && @opts[:max]
        I18n.t('site_settings.errors.invalid_string_min_max', {min: @opts[:min], max: @opts[:max]})
      elsif @opts[:min]
        I18n.t('site_settings.errors.invalid_string_min', {min: @opts[:min]})
      else
        I18n.t('site_settings.errors.invalid_string_max', {max: @opts[:max]})
      end
    else
      I18n.t('site_settings.errors.invalid_string')
    end
  end
end