# -*- coding: utf-8 -*-
module CommLogistics::Base::Controller
  #== 携帯コントローラ共通
  class MobileController < Comm::BaseController::Basic
    include CommLogistics::Const::Code
    layout "mobile"


    #== sale の find に関するデフォルト処理
    #-----------------------------------------------------------------#
    def find_sale
      #@arobj = Sale.set(MFIND_V).state(Comm::Const::MasterCode::MCODE_STATUS2_COMP)
      @arobj = Sale
      @conditions = ["invalid_flag_code=#{MCODE_FLAG_OFF}", "state_code= #{Comm::Const::MasterCode::MCODE_STATUS2_COMP}"]
    end

    #== sample の find に関するデフォルト処理
    #-----------------------------------------------------------------#
    def find_sample
      #@arobj = Sample.set(MFIND_V).state(Comm::Const::MasterCode::MCODE_STATUS2_COMP)
      @arobj = Sample
      @conditions = ["invalid_flag_code=#{MCODE_FLAG_OFF}", "state_code= #{Comm::Const::MasterCode::MCODE_STATUS2_COMP}"]
      @sample_flag = true
    end

    #== 表示用定数の定義
    # value: カラム名(DB上)
    # 戻り値:: カラム名(DB上)に対応する表示名とdisp_nameの配列
    #-----------------------------------------------------------------#
    def col_descriptions(value)
      # 表示用定数の定義
      descriptions = {
        :sales_area_id => ['エリア名', 'sales_area_dn'],
        :user_position_id => ['担当者', 'user_position_dn'],
        :warehouse_id => ['納品先', 'warehouse_dn'],
        :operate_date => ['使用日', 'operate_date'],
        :customer_id => ['得意先', 'customer_dn'],
        :product_set_id => ['製品名', 'product_set_dn'],
        :product_category_id => ['カテゴリ', 'product_category_dn'],
        :product_id => ['型番', 'product_dn'],
        :lot_number => ['ロット', 'lot_number']
      }

      if value.class.to_s == "String"
        value = value.to_sym
      end

      if descriptions[value].nil?
        return ''
      else
        return descriptions[value]
      end
    end

    #== select対象カラム決定
    #_select_ 現在の select 対象カラム
    #
    # 戻り値:: 次の select 対象カラム
    #-----------------------------------------------------------------#
    def get_next_select(select)
      sequence = ["sales_area_id",
                  "user_position_id",
                  "warehouse_id",                  
                  "product_set_id",
                 "product_id",
                 "lot_number"]

      unless select.nil? || select == ""
        index = sequence.index(select)
        unless index.nil?
          sequence_sort = sequence[index..-1] + sequence[0..index-1]
          for i in 0..sequence_sort.length-2 do
            if params[sequence_sort[i+1]].nil?
              return sequence_sort[i+1]
            end
          end
        end
      end
      return nil
    end

    #== 日付決定
    # params[:start_target_date] と params[:end_target_date] を今日に設定
    #-----------------------------------------------------------------#
    def check_date_today
      # params[:start_target_date] ||= '2011-4-26' # for test
      params[:start_target_date] ||= Date.today.to_s(:db)
      params[:end_target_date]   = params[:start_target_date]
    end

    #== 日付決定
    # params[:start_target_date] と params[:end_target_date] を今月に設定
    #-----------------------------------------------------------------#
    def check_date_this_month
      # params[:start_target_date] ||= Date.new('2011','3','1').to_s # for test
      params[:start_target_date] = get_first_day_of_month(params[:start_target_date], 0)
      params[:end_target_date]   = get_last_day_of_month(params[:start_target_date], 0)
    end


    #== only_hashfy および add_disp_names を行う
    # result が不正の場合 nil を返す
    #-----------------------------------------------------------------#
    def hashfy_and_add_disp_names(result)
      result = result.only_hashfy()
      unless result.nil?
        if result.length > 0
          result.add_disp_names({:nil_str=>'その他'})
          return result
        else
          return nil
        end
      else
        return nil
      end
    end

    #== 売上本数の合計を求める
    # 売上本数はsum_quantity列とすること
    #-----------------------------------------------------------------#
    def total_quantity(results)
      unless results.nil?
        results.inject(0) {|total, result|  total +  result["sum_quantity"].to_i}
      else
        0
      end
    end


    #== 売上本数の合計を求める
    # 売上本数はsum_quantity列とすること
    #-----------------------------------------------------------------#
    def nil_to_null(result)
      unless result.blank?
        for idx in 0..result.length-1 do 
          result[idx].each do |k,v|
            if v.nil?
              result[idx][k] = 'NULL'
            end
          end
        end
      end
      return result
    end


    #== 日付処理関数
    
    #== 指定の日付だけ進める/遅らせる
    # get_target_date(date, offset)
    #-----------------------------------------------------------------#
    def get_target_date(date, offset=0)
      (Date.parse(date) + offset).to_s
    end

    #== 指定の月だけ進めた/遅らせた月の月初日を求める
    # get_first_day_of_month(date, offset)
    # 遅らせる時はoffsetをマイナスにすること
    # 当月の場合は offset=0 とする
    #-----------------------------------------------------------------#
    def get_first_day_of_month(date, offset)
      (Date.parse(date) >> offset).beginning_of_month.to_s(:db)
    end

    #== 指定の月だけ進めた/遅らせた月の月末日を求める
    # get_last_day_of_month(date, offset)
    # 遅らせる時はoffsetをマイナスにすること
    # 当月の場合は offset=0 とする
    #-----------------------------------------------------------------#
    def get_last_day_of_month(date, offset)
      (Date.parse(date,'%Y-%m-%d') >> offset).end_of_month.to_s(:db)
    end

    #== 日付からタイトルを決定する
    #-----------------------------------------------------------------#
    def date_to_title(sdate, edate)
      s = Date.parse(sdate)
      e = Date.parse(edate)
      if sdate == edate
        return s.month.to_s + '/' + s.day.to_s
      elsif s.year == e.year && s.month == e.month
        return s.year.to_s + '/' + s.month.to_s
      else
        return s.year.to_s + '/' + s.month.to_s + ' 〜 ' + e.year.to_s + '/' + e.month.to_s
      end
    end

    #== params の値に応じて動的に scope を追加する
    # params_to_scopes
    # 戻り値:: 追加されたカラム名(シンボル)の配列 [:warehouse_id, :product_category_id, ...]
    #-----------------------------------------------------------------#
    def params_to_scopes
      targets = [:sales_area_id, :user_position_id, :warehouse_id, :operate_date]
      targets_details = [:product_set_id, :product_category_id, :product_id, :lot_number]
      res = Array.new
      
      # sales 関連カラム
      for target in targets do        
        unless params[target].nil?
          #puts target
          if params[target] == 'NULL'
            #@arobj = @arobj.blank(target.to_s)
            @conditions << "#{target.to_s} IS NULL"
          else
            #@arobj = @arobj.sassign(target.to_s, params[target])
            @conditions << "#{target.to_s}=#{params[target]}"
          end
          res << target
        end
      end
      
      # sale_details 関連カラム
      table_name = @sample_flag ? 'sample_details.' : 'sale_details.'
      for target in targets_details do
        unless params[target].nil?
          if params[target] == 'NULL'
            #@arobj = @arobj.blank(table_name + target.to_s)
            @conditions << "#{table_name + target.to_s} IS NULL"
          else
            #@arobj = @arobj.sassign(table_name + target.to_s, params[target])
            @conditions << "#{table_name + target.to_s}=#{params[target]}"
          end
          res << target
        end
      end

      res
    end

  end
end
