#
#= users 共通コントローラー
# Authors:: Sumiyo Yamamoto
# Copyright:: Copyright (C) OrbusNeich Medical K.K.  2010.
#--
# date        name                   note
# 2010.9.30   Sumiyo Yamamoto        新規作成
#-------------------------------------------------------------------------------
#++
module Comm::BaseMasterController
  class UsersController < Comm::BaseController::PermanentMaster
    include Comm::Module::Controller::UnifiedIF
    #ツリー定義値 ルートノードID
    ROOT_NODE_ID = 0
    #ツリー定義値 RAILS無所属ノードID
    FREE_ROOT_DB = nil
    #ツリー定義値 WEB無所属ノードID
    FREE_ROOT_WEB = 9999

    #== コンストラクタ
    #-----------------------------------------------------------------#++
    def initialize
      @mcls = User
      @search_cls = UserSearch
    end

    #== ユーザツリー表示
    def show_tree
      tree_array = []
      #ルート(親0)を拾ってツリー化
      roots = @mcls.find(:all, :conditions => ["user_id = ?", ROOT_NODE_ID])
      unless roots.length == 0
        insert_node(roots, tree_array, true)
      end
      Rails.logger.debug(tree_array.inspect)
      #無所属(親null)を拾ってツリー化
      frees = @mcls.find(:all, :conditions => "user_id is null")
      #無所属表示の根
      free_dir = {:id => FREE_ROOT_WEB,
                  :text => '未所属',
                  :leaf => false,
                  :iconCls => 'ico-star',
                  :expanded => false,
                  :draggable => false,
                  :children => []}
      unless frees.length == 0
        insert_node(frees, free_dir[:children], false) 
      end
      #2つのツリーを合わせて返す
      tree_array.push(free_dir)
      render :json => tree_array.to_json
    rescue => e
      logger.error(e.message + "\n" + e.backtrace.join("\n"))
      render :json => Comm::Tool::Json.result_json(false, e.message)
    end

    #== ユーザノードツリー生成
    def insert_node(currents, array, force_show)
      currents.each do |c|
        #ノード作成
        node = {:id => c.id,
                :text => [c.disp_name,' [',c.id,']'].join,
                :leaf => false,
                :iconCls => 'ico-user',
                :expanded => true,
                :children => []}
        #さしあたってinvalidのアイコンを変える
        if c.invalid_flag_code == MCODE_FLAG_ON
          node[:iconCls] = 'ico-remove'
        end
        #親として見られていなければ兄弟へ
        if c.children.size == 0
          #有効ユーザまたは強制表示はノード追加
          if (c.invalid_flag_code == MCODE_FLAG_OFF) || force_show
            array.push(node)
          end
          next
        end
        array.push(node)
        insert_node(c.children, node[:children], force_show)
      end
    end

    #==ユーザツリー更新
    def update_tree
      web_hash = JSON.parse(params[:treeJson])

      @mcls.transaction do
        #親ID更新
        users = @mcls.all
        users.each do |u|
          web_val = web_hash[u.id.to_s]
          web_val = FREE_ROOT_DB if web_val == FREE_ROOT_WEB
          u.user_id = web_val
          u.save!
        end
        #PATH更新
        users.each do |u|
          if u.custom_path_flag_code == MCODE_EXIST_FLAG_OFF
            u.refresh_path
          end
        end
      end
      render :json => Comm::Tool::Json.result_json(true, '')
    rescue => e
      logger.error(e.message + "\n" + e.backtrace.join("\n"))
      render :json => Comm::Tool::Json.result_json(false, e.message)
    end
    
    def find_all
      ss = UserSearch.new
      ss.table_alias = {'users' => 'a',
                        'user_positions' => 'a'}
      return ss.search(FLAG_ON, User, [], params)
    end
    
    class UserSearch < Comm::Tool::SqlSearch
      def get_columns_and_tables(tab, join_lists, params, str_vals)
        invalid_vals = (!params || params[:with_invalid]==STR_TRUE) ? '0,1' : '0'
        str_cols = ' * '
        str_tab =  " FROM (SELECT u.*, up.sales_area_id, IFNULL(up.area_cnt,0) AS multi_cnt 
                           FROM master_app_production.users AS u
                           LEFT JOIN ( SELECT user_id,sales_area_id, COUNT(*) AS area_cnt
                                       FROM ( SELECT * FROM master_app_production.user_positions 
                                              WHERE invalid_flag_code=#{MCODE_FLAG_OFF} AND sales_area_id > 0 ORDER BY disp_sort 
                                            ) AS tmp_u GROUP BY user_id
                                     ) AS up ON u.id=up.user_id 
                           WHERE u.invalid_flag_code in (#{invalid_vals})) AS a"
        return str_cols, str_tab, str_vals
      end
    end
    
    # show 関連
    def add_to_extra_table_columns(merge_h, result)
      arrange_result(merge_h, result, UserPosition)
      merge_h['multi_cnt'] = result['multi_cnt']
    end
    
    def get_show_where_clause
      int_id = params[:id].to_i
      case int_id
      when -1
        condition = " (SELECT min(id) FROM master_app_production.users) "
      when -2
        condition = " (SELECT max(id) FROM master_app_production.users) "
      else
        condition = int_id.to_s
      end
      return "WHERE a.id = "+condition
    end
  end
end
