# add method
# 1) errmsg
# 2) get_val
# 3) to_ext_json
# 4) only_hashfy
# 5) tab_name
module ActiveRecord
  class Base
    #== エラーメッセージ取得
    #
    # 戻り値:: エラーメッセージ
    #-----------------------------------------------------------------#++
    def errmsg
      result = ""
      unless errors.empty?
        result = errors.full_messages.join('<br>')
      end
      return result
    end

    #== 指定項目の値取得
    #_key_:: 指定項目キー
    #
    # 戻り値:: 取得した値
    #-----------------------------------------------------------------#++
    def get_val(key)
      result = eval("self.#{key}")
      return result
    end

    #== 指定項目の値設定
    #_key_:: 指定項目キー
    #_val_:: 値
    #
    # 戻り値:: なし
    #-----------------------------------------------------------------#++
    def set_val(key, val)
      eval("self.#{key} = val")
    end

    #== 指定項目の値取得
    #_key_:: 指定項目キー
    #
    # 戻り値:: 取得した値
    #-----------------------------------------------------------------#++
    def to_ext_json(options = {})
      success = options.delete(:success)
      methods = Array(options.delete(:methods))
      cls = options.delete(:cls)
      unless cls
        cls = self.class
      end
      underscored_class_name = cls.to_s.demodulize.underscore
      
      if success || (success.nil? && valid?)
        data =  only_hashfy
        methods.each do |method|
          if self.respond_to? method
            data[method] = self.send(method)
          end
        end
        result = {}
        data.each_pair do |key, val|
          result["#{underscored_class_name}[#{key}]"] = val
        end
        {:success => true, :data => result}.to_json(options)
      else
        {:success => false, :message => self.errmsg}.to_json(options)
      end
    end

    #== ActiveRecord→ハッシュ変換
    #_adds_:: ハッシュに、項目を追加するための情報（ハッシュキーと値生成メソッド）
    #
    # 戻り値:: ハッシュ
    #-----------------------------------------------------------------#++
    REGEX_ID_CODE = Regexp.new('(.+)(_id|_code)$')
    def only_hashfy(adds = [])
      result = self.attributes
      result.each_pair do |key, val|
        if val.blank?
          next
        end
        if key =~ REGEX_ID_CODE
          tmp_val = val.to_i
          result[key] = tmp_val if tmp_val.to_s == val
        elsif val.class == ActiveSupport::TimeWithZone
          result[key] = val.time
        end
      end
      
      # 引数で指定された情報を元にハッシュにデータを追加
      unless adds.blank?
        adds.each do |add|
          if self.respond_to? add[:method]
            result[add[:name]] = self.send(add[:method])
          end
        end
      end
      return result
    end

    #== 対応テーブル名取得
    #
    # 戻り値:: テーブル名
    #-----------------------------------------------------------------#++
    def table_string
      self.class.to_s.tableize
    end
  end
end
