#
#= メニュー権限処理機能群
# Authors:: Kazunori Shimizu
# Copyright:: Copyright (C) OSS
#--
# date        name                   note
# 2010.4.23   Kazunori Shimizu       新規作成
#-------------------------------------------------------------------------------
#++
module Comm
  module Module
    #= メニュー権限処理機能モジュール
    # メニュー権限処理に使えるメソッド群を備える。
    #------------------------------------------------------------------------#++
    module MenuAuth
      #= メニュー権限情報 取得モジュール
      #----------------------------------------------------------------------#++
      module GetAuth 
        def get_
          
        end
      end
      #= メニュー権限情報 編集モジュール
      #----------------------------------------------------------------------#++
      module Edit
        include Comm::Const::MasterCode

        #== ユーザーのロール権限設定
        #_user_:: ユーザー(ActiveRecord)
        #_menus_:: メニュー一覧(ハッシュ配列)
        #_key_:: 権限値を設定するキー
        #
        # 戻り値:: 権限設定済みのメニュー一覧
        #-----------------------------------------------------------------#++
        def edit_user_roles_menu_auth(user = nil, menus = [], key = nil)
          roles = user.roles
          roles.each do |role|
            edit_menu_auth(role, menus, key)
          end
        end

        #== 権限設定
        #_target_:: ユーザー、又はロール(ActiveRecord)
        #_menus_:: メニュー一覧(ハッシュ配列)
        #_key_:: 権限値を設定するキー
        #
        # 戻り値:: 権限設定済みのメニュー一覧
        #-----------------------------------------------------------------#++
        def edit_menu_auth(target = nil, menus = [], key = nil)
          # ターゲットのメニュー権限情報取得
          auth_menus = target.rel_menus
          
          # メニュー一覧に、ターゲットの権限情報付与
          menus.each do |menu|
            idx = auth_menus.search_val(menu['id'], 'menu_id')
            if idx
              val = auth_menus[idx].auth_code
            else
              val = MCODE_AUTH_NON
            end
            
            if menu.key?(key)
              menu[key] |= val
            else
              menu[key] = val
            end
          end
        end

        #== 権限設定(全てNON）
        #_menus_:: メニュー一覧(ハッシュ配列)
        #_key_:: 権限値を設定するキー
        #
        # 戻り値:: 権限設定済みのメニュー一覧
        #-----------------------------------------------------------------#++
        def edit_menu_auth_all_non(menus = [], key = nil)
          menus.each do |menu|
            menu[key] = MCODE_AUTH_NON
          end
        end
      end

      #= 関連ターゲットのメニュー権限更新モジュール
      #----------------------------------------------------------------------#++
      module RelUpdate
        #== メニュー権限更新処理
        #_new_menus_:: メニュー権限情報(ハッシュ配列)
        #
        # 戻り値:: 処理結果(true/false)
        #-----------------------------------------------------------------#++
        def update_menu_auth(new_menus = [])
          result = true
          
          begin
            self.transaction do
              # 旧情報削除
              menus.clear
              
              # 新情報登録
               new_menus.each do |menu|
                 result = create_rel_menu(menu['id'], menu['auth_code'])
                 unless result
                   raise Exception
                 end
              end
            end
          rescue  Exception => e
            result = false
            if errors.empty?
              errors.add_to_base(EMJ0001 + e)
            end
          end
          return result
        end
      end
    end
  end
end
