#
#= コントローラー共通
# Authors:: Sumiyo Yamamoto
# Copyright:: Copyright (C) OrbusNeich Medical K.K.  2010.
#--
# date        name                   note
# 2010.2.19   Sumiyo Yamamoto        新規作成
#-------------------------------------------------------------------------------
#++
module Comm
  module BaseController
    #= 基本コントローラークラス
    # 対応モデルを持つコントローラーが継承する、ベースとなるコントローラー。
    #------------------------------------------------------------------------#++
    class General < ApplicationController
      include Comm::Module::Params
      include Comm::Const::Print
      include Comm::Module::Print
      include Comm::Module::OutputXls

      before_filter :get_table_name
      before_filter :get_table_params, :only => [:create, :update]

      #== 一覧表示
      #-----------------------------------------------------------------#++
      def index
        @ars = find_all
        respond_to do |format|
          format.html
        end
      end

      #== 登録画面
      #-----------------------------------------------------------------#++
      def new
        @ar = @mcls.new
        respond_to do |format|
          format.html # new.html.erb
        end
      end

      #== 更新画面
      #-----------------------------------------------------------------#++
      def edit
        @ar = find_one
      end

      #== 一覧表示
      #-----------------------------------------------------------------#++
      def ext_index
        hrs = find_all
        @multiple_id_cols ||= {}
#        opt = {:disp=>{:multiple_id_cols => @multiple_id_cols}}
#        unless params[:disp_keys].blank?
#          opt[:disp][:disp_keys]=params[:disp_keys]
#        end
        opt = HashWithIndifferentAccess.new
        opt[:disp] = {:multiple_id_cols => @multiple_id_cols, :disp_keys => {}, :disp_add_keys=>{}}
        #===============disp_keyの設定ここから
        #jsから送られてくる場合もあるので、そちらを最優先する。
        if !params[:disp_keys].blank? && params[:disp_keys].is_a?(Hash)
          params[:disp_keys].each do |key, hash_value|
            opt[:disp][:disp_keys][key]=hash_value
          end
        end
        #===============disp_keyの設定ここまで
        #jsから送られてくる場合もあるので、そちらを最優先する。
        if !params[:disp_add_keys].blank? && params[:disp_add_keys].is_a?(Hash)
          params[:disp_add_keys].each do |key, hash_value|
            opt[:disp][:disp_add_keys][key]=hash_value.values
          end
        end
        respond_to do |format|
          format.ext_json{
            cnt = count_all
            render :json => (params[:no_dn]==STR_TRUE ? hrs.only_hashfy : hrs.ext_hashfy(opt)).to_ext_json(@table_name, cnt)
          }
          format.xls{
            resp = output_xls(hrs.ext_hashfy(opt), params)
            resp[:file_name] = @table_name + resp[:file_name]
            render :json => resp.to_json
          }
        end
      end

      #== 一件表示
      #-----------------------------------------------------------------#++
      def show
        @ar = find_one
        if @ar.blank?
          respond_to do |format|
            format.ext_json{
              render :json => Comm::Tool::Json.result_json(false, EMD0003), :status => :not_found
            }
          end
        else
          respond_to do |format|
            format.ext_json{
              render :json => @ar.to_ext_json
            }
          end
        end
        #respond_to do |format|
        #  format.ext_json{
        #    render :json => @ar.to_ext_json
        #  }
        #end
      end

      #== 登録
      #-----------------------------------------------------------------#++
      def create
        ar = @mcls.new
        result = ar.create_mng(@table_params, params[:master_rev])
        render :json => Comm::Tool::Json.result_json(result, ar.errmsg, get_respons(ar))
      end

      #== 更新
      #-----------------------------------------------------------------#++
      def update
        ar = find_one
        result = ar.update_mng(@table_params, params[:master_rev])
        render :json => Comm::Tool::Json.result_json(result, ar.errmsg, get_respons(ar))
      end

      #== 削除
      #-----------------------------------------------------------------#++
      def destroy
        ar = find_one
        result = ar.destroy_mng
        render :json => Comm::Tool::Json.result_json(result, ar.errmsg, get_respons(ar))
      end

    protected
      def get_table_name
        @table_name = @mcls.to_s.tableize
      end

      def get_table_params
        key = @table_name.singularize
        @table_params = params[key]
      end

      def count_all
        return Comm::Tool::SqlSearch.new.count(@mcls)
      end

      def find_all
        ss = get_sql_search
        return ss.search(FLAG_ON, @mcls, @join_mcls, params)
      end
      
      def get_sql_search
        return Comm::Tool::SqlSearch.new
      end
      
      def find_one
        return @mcls.find(get_params_id)
      end

      def get_params_id
        result = params[:id].to_i
        if result == -1
          result = :first
        elsif result == -2
          result = :last
        end
        return result
      end
      
      def get_respons(ar)
        res = {}
        if ar.master_rev
          res.update(ar.master_rev)
        end
        return res
      end
    end
  end
end
