module Util
  module Params

    # コンストラクタ
    def initialize
      # エラーフラグ
      @is_error = false
      # エラーリスト
      @errors = []
    end
  
    # パラメーター取得
    # param[in] name
    # param[in] default
    # param[in] isRequire
    # param[in] params (min_length, max_length, reg)
    def get_param_str name, default = nil, is_require = false, params = {}
  
      val = get_param_val name, default, is_require
  
      return nil if val.nil?
      v = val.to_s
  
      if params.key? :enum
        for e in params[:enum]
          return v if e === v
        end
        push_error "#{name.to_s} == unknone val [#{v.to_s}]"
      end
  
      if params.key?(:min_length) && (v.length < params[:min_length])
        push_error "#{name.to_s} len [#{v.to_s}] < #{params[:min_length].to_s}"
      end
  
      if params.key?(:max_length) && (v.length > params[:max_length])
        push_error "#{name.to_s} len [#{v.to_s}] > #{params[:max_length].to_s}"
      end
  
      if params.key?(:reg) && !(/#{params[:reg]}/ =~ val)
        push_error "#{name.to_s} unmatch /#{params[:reg].to_s}/ =~ [#{v.to_s}]"
      end
  
      v
    end
    #
    def get_param_strs name, default = [], is_require = false
      vals = get_param_val name, default, is_require
  
      return nil if vals.nil?
  
      vals
    end

    # パラメーター取得
    def get_param_int name, default = nil, is_require = false, params = {}
  
      val = get_param_val name, default, is_require
  
      return nil if val.nil?
      return val if val.kind_of? Integer
  
      if /[^\d]/ =~ val
        push_error "#{name.to_s} type [#{val.to_s}] != integer"
      end
  
      v = val.to_i
  
      if params.key? :enum
        for e in params[:enum]
          logger.debug e
          return v if e === v
        end
        push_error "#{name.to_s} == unknone val [#{v.to_s}]"
      end
  
      if params.key?(:min) && (v.length < params[:min])
        push_error "#{name.to_s} val [#{v.to_s}] < #{params[:min].to_s}"
      end
  
      if params.key?(:max) && (v.length > params[:max])
        push_error "#{name.to_s} val [#{v.to_s}] > #{params[:max].to_s}"
      end
      v
    end

    def get_param_ints name, default = [], is_require = false
      vals = get_param_val name, default, is_require
      return nil if vals.nil?
  
      rs = []
  
      vals.each do |v|
  
        if params.key? :enum
          for e in params[:enum]
            next rs << v.to_i if e === v
          end
          push_error "#{name.to_s} == unknone val [#{v.to_s}]"
        end
  
        if params.key?(:min) && (v.length < params[:min])
          push_error "#{name.to_s} val [#{v.to_s}] < #{params[:min].to_s}"
        end
  
        if params.key?(:max) && (v.length > params[:max])
          push_error "#{name.to_s} val [#{v.to_s}] > #{params[:max].to_s}"
        end
  
        rs << v.to_i
      end
  
      rs
    end
  
    def get_param_objects name, default = [], is_require = false
      vals = get_param_val name, default, is_require
      vals.map do |v|
        v.permit!.to_h.deep_symbolize_keys
      end
    end
  
    def get_param_object name, default = {}, is_require = false
      val = get_param_val name, default, is_require
      val.permit!.to_h.deep_symbolize_keys
    end
  
    #
    def get_param_bool name, default = nil, is_require = false
      val = get_param_val name, default, is_require
      return false if val.kind_of? FalseClass
      return true if val.kind_of? TrueClass
      return nil if val.blank?
      return false if val == 'false'
      return true if val == 'true'
      val.to_i > 0
    end
  
    # ファイル受け取り
    def get_file name, is_require = false
  
      f = params[name]
  
      if is_require
  
        if f.nil?
          push_error "#{name.to_s} == nil"
          return nil
        end
        if f.size.blank?
          push_error "#{name.to_s} == nil"
          return nil
        end
      end
  
      return nil if f.nil?
      return nil if f.size.blank?
  
      f
    end
    #
    def has_param? name
      params.include? name
    end
    # エラーがあるか
    def has_param_error?
      @is_error
    end
    # エラーメッセージ入りスト
    def get_error
      @errors.join ', '
    end
  
  protected
  
    # エラー追加
    def push_error message
      @is_error |= true
      @errors.push message
    end
  
    # パラメーター取得
    def get_param_val name, default, is_require
      unless params.include? name
        push_error "#{name.to_s} == nil" if is_require
        return default
      end
      params[name]
    end

  end

end