#
#= 仮想ID汎用機能群
# Authors:: Sumiyo Yamamoto
# Copyright:: Copyright (C) OrbusNeich Medical K.K.  2010.
#--
# date        name                   note
# 2010.2.26   Sumiyo Yamamoto        新規作成
#-------------------------------------------------------------------------------
#++
module Comm
  module Tool
    #= 仮想ID汎用機能クラス
    # 汎用的に使えるメソッド群を備える。
    #------------------------------------------------------------------------#++
    class VirtualId
      extend Comm::Const::VirtualId
    end

    class << VirtualId
      #== 仮想IDに対応する情報取得
      #_vid_:: 仮想ID
      #
      # 戻り値:: 仮想IDに対応する情報
      #-----------------------------------------------------------------#++
      def get_virtual_info_by_id(vid = nil)
        target_info_idx = 0
        
        VID_CLS_INFO.each_with_index do |info, idx|
          if vid >= info[:offset]
            target_info_idx = idx
            break
          end
        end
        
        return VID_CLS_INFO[target_info_idx]
      end

      #== データタイプに対応する情報取得
      #_type_:: データタイプ
      #
      # 戻り値:: データタイプに対応する情報
      #-----------------------------------------------------------------#++
      def get_virtual_info_by_type(type = nil)
        idx = VID_CLS_INFO.search_val(type, :type)
        
        unless idx
          idx = 0
        end
        
        return VID_CLS_INFO[idx]
      end

      #== データタイプに対応する仮想ID取得
      #_id_:: ID値
      #_type_:: データタイプ
      #
      # 戻り値:: 仮想ID
      #-----------------------------------------------------------------#++
      def get_virtual_offset(type = nil)
        info = get_virtual_info_by_type(type)
        return info[:offset]
      end

      #== 仮想IDに対応するレコード取得
      #_vid_:: 仮想ID
      #
      # 戻り値:: ActiveRecord
      #-----------------------------------------------------------------#++
      def find_by_virtual_id(vid = nil)
        info  = get_virtual_info_by_id(vid)
        
        id = (vid - info[:offset])
        result = info[:cls].find(id)
        
        return result
      end

      #== 仮想IDが示す対象に所属するユーザーID取得
      # 対象は部署、ユーザーのみ対応
      #_vid:: 仮想ID
      #_mode_:: 部署範囲モード（全部署/営業部署）
      #
      # 戻り値:: ユーザーID配列
      #-----------------------------------------------------------------#++
      def get_user_ids_by_virtual_id(vid = nil, mode = nil)
        results = []
        
        info = get_virtual_info_by_id(vid)
        id = (vid - info[:offset])
        
        case info[:type]
        # 全部
        when VID_ALL
          results = User.set(MFIND_V).all.extract('id')
        # グローバルエリア
        when VID_GAREA
          # 部署ID取得
          scope = Section.set(MFIND_V).sassign('global_area_id', id)
          if mode == VID_MODE_SALES
            scope = scope.sales
          end
          ids = scope.all.extract('id')
          # 部署毎の所属ユーザーID取得
          ids.each do |section_id|
            results += get_user_ids_by_section_id(section_id)
          end
          
        # 部署
        when VID_SECTION
          results = get_user_ids_by_section_id(id)
        # ユーザーポジション
        when VID_USER
          results = [id]
        end
        
        return results
      end

    protected
      def get_user_ids_by_section_id(id = nil)
        return Section.find(id).user_positions.extract('user_id').uniq
      end
    end
  end
end
