#
#= Log処理用モジュール
# Authors:: Sumiyo Yamamoto
# Copyright:: Copyright (C) OrbusNeich Medical K.K.  2010.
#--
# date        name                   note
# 2010.10.24  Sumiyo Yamamoto        新規作成
#-------------------------------------------------------------------------------
#++
module Comm::Module::Model
  #= Log処理用モジュール
  #------------------------------------------------------------------------#++
  module Logging
  protected
    #== 登録時ログ
    #-----------------------------------------------------------------#++
    def log_create
      log_init
      
      # log登録
      create_log(Comm::Const::MasterCode::MCODE_DML_INSERT)
    end

    #== 更新時ログ
    #-----------------------------------------------------------------#++
    def log_update
      log_init
      
      # log登録
      log_id = create_log(Comm::Const::MasterCode::MCODE_DML_UPDATE)
      
      # log_details登録
      create_log_detail(log_id, Comm::Const::MasterCode::MCODE_DML_UPDATE, self)
      
      log_id
    end

    #== 更新時ログ：details
    #-----------------------------------------------------------------#++
    def log_detail_create(log_id = nil, detail = nil)
      # log_details登録
      create_log_detail(log_id, Comm::Const::MasterCode::MCODE_DML_INSERT, detail)
    end

    def log_detail_update(log_id = nil, detail = nil)
      # log_details登録
      create_log_detail(log_id, Comm::Const::MasterCode::MCODE_DML_UPDATE, detail)
    end

    def log_detail_destroy(log_id = nil, detail = nil)
      # log_details登録
      create_log_detail(log_id, Comm::Const::MasterCode::MCODE_DML_DELETE, detail)
    end

    #== 削除時ログ
    #-----------------------------------------------------------------#++
    def log_destroy
      log_init
      
      # log登録
      create_log(Comm::Const::MasterCode::MCODE_DML_DELETE)
    end

    #== 初期化処理
    #-----------------------------------------------------------------#++
    def log_init
      unless @tab_jname
        @tab_jname = {}
      end
      
      unless @col_jname
        @col_jname = {}
      end
    end

    #== logsレコード作成処理
    #-----------------------------------------------------------------#++
    def create_log(dml = nil)
      table_name = self.class.name.tableize
      
      log = Log.new
      log.user_id = @session[:user_id]
      log.table_name    = table_name
      log.j_table_name    = get_tab_jname(table_name)
      log.record_id     = id
      log.dml_type_code = dml
      ret = log.save
      if ret
        result = log.id
      else
        result = nil
        errors.add_to_base(EMJ0009 + EMD0001)
      end
      
      result
    end

    #== log_detailsレコード作成処理
    #-----------------------------------------------------------------#++
    def exec_create_log_detail(p = {})
      log_detail = LogDetail.new
      log_detail.update_attributes(p)
      ret = log_detail.save
      if ret
        result = log_detail.id
      else
        result = nil
        errors.add_to_base(EMJ0009 + EMD0001 + '(detail)')
      end
      result
    end

    def create_log_detail(log_id = nil, dml = nil, target = nil)
      log_init
      table_name = target.class.name.tableize
      p = {}
      p[:log_id]        = log_id
      p[:table_name]    = table_name
      p[:j_table_name]  = get_tab_jname(table_name)
      p[:record_id]     = target.id
      p[:dml_type_code] = dml
      
      case dml
      when Comm::Const::MasterCode::MCODE_DML_INSERT
        result = exec_create_log_detail(p)
      when Comm::Const::MasterCode::MCODE_DML_UPDATE
        cols = target.changes
        cols.each_pair do |col, val|
          p[:column_name] = col
          p[:j_column_name] = get_col_jname(table_name, col)
          p[:old_value]   = val[0]
          p[:new_value]   = val[1]
          result = exec_create_log_detail(p)
          unless result
            break
          end
        end
      when Comm::Const::MasterCode::MCODE_DML_DELETE
        cols = get_cols(target)
        cols.each do |col|
          p[:column_name] = col
          p[:j_column_name] = get_col_jname(table_name, col)
          p[:old_value]   = eval("target.#{col}")
          result = exec_create_log_detail(p)
          unless result
            break
          end
        end
      end
      
      result
    end

    #== テーブル日本語名取得
    #-----------------------------------------------------------------#++
    def get_tab_jname(tab)
      unless @tab_jname[tab]
        tmp = Comm::Tool::Jname.get_table_japanese_name(tab)
        @tab_jname[tab] = tmp
      end
      
      @tab_jname[tab]
    end

    #== カラム日本語名取得
    #-----------------------------------------------------------------#++
    def get_col_jname(tab = nil, col = nil)
      unless @col_jname[tab]
        tmp = Comm::Tool::Jname.get_column_japanese_name(tab)
        @col_jname[tab] = tmp
      end
      @col_jname[tab][col]
    end

    #== カラム取得
    #-----------------------------------------------------------------#++
    def get_cols(target = nil)
      #column_namesの結果を直接いじるとcolumn_namesの中でキャッシュされて、with_detailsのcolsをとるときにバグってしまう。
      results = target.class.column_names.reject{|key| ['id','rev_number','created_at','updated_at','deleted_at'].include? key }
      #results = target.class.column_names
      #results.delete('id')
      #results.delete('rev_number')
      #results.delete('created_at')
      #results.delete('updated_at')
      #results.delete('deleted_at')
      
      results
    end
  end
end
