module CommLogistics::Modules::ErrorStore
  include CommLogistics::Const::Code
  include CommLogistics::Const::Error
  
  # 異常な項目名を貯めて,まとめてエラーメッセージを発生させるためのもの
  #
  # 手順
  #  1. 普通にエラーチェックする
  #  2. エラー発見時、add_**_msgを呼んで異常アリ項目名をためる
  #  3. 1,2を、まとめてエラー通知してあげたい部分について繰り返す
  #  4. 最後にraise_exception_with_any_errorをよぶ -> 異常があれば例外を発生
  #
  INDEX_ILLEAGAL = 0
  INDEX_MISMATCH = 1
  INDEX_LACK = 2
  
  MSG_TAIL = {INDEX_ILLEAGAL => 'の値が異常です。',
              INDEX_MISMATCH => 'の組み合わせが不整合です。',
              INDEX_LACK =>'を指定してください。'}
  
  # 異常値
  def add_illegal_msg(column_name, value, table_name, additional_info=nil)
    add_msg_by_column(INDEX_ILLEAGAL, column_name, value, table_name, additional_info)
  end
  
  # 組み合わせ異常
  def add_mismatch_msg(column_name1, value1, column_name2, value2, table_name, additional_info=nil)
    add_msg_by_column(INDEX_MISMATCH, column_name1, value1, table_name)
    add_msg_by_column(INDEX_MISMATCH, column_name2, value2, table_name, additional_info, 'と')
  end
  
  # 指定なし
  def add_lack_msg(column_name, table_name, additional_info=nil)
    add_msg_by_column(INDEX_LACK, column_name, nil, table_name, additional_info)
  end
  
  # 最後にエラー発見時に例外を発生させるための
  def raise_exception_with_any_error
    msg = ''
    MSG_TAIL.each do |k, v|
      msg += finalize_msg(k, v)
      msg += '<br>' unless msg.blank?
    end
    @msg.clear if @msg
    unless msg.blank?
      raise UserOperationError, msg
    end
  end
  
  def add_msg_by_column(index, column_name, value, table_name, additional_info=nil, chain_symbol=', ')
    emsg = Comm::Tool::Jname.get_column_japanese_name(table_name, column_name)
    emsg += "[#{value}]" if value
    emsg += " (#{additional_info})" if additional_info
    @msg ||= {}
    @msg[index] ||= ''
    if chain_symbol && !@msg[index].blank?
      @msg[index] += chain_symbol
    end
    @msg[index] += emsg
  end
  
  def finalize_msg(index, tail_msg)
    if @msg.blank? || @msg[index].blank?
      return ''
    end
    return @msg[index] + tail_msg
  end
end
