class PurchasesController < CommLogistics::Base::Controller::SuperiorStock
  include Comm::Module::Controller::Logging
  include CommLogistics::Modules::Print::Controller
  include CommLogistics::Modules::Controller::ShowFilter
  include CommLogistics::Modules::Controller::ExtIndexFilter
  
  def initialize
    @mcls = Purchase
    @pdf_cls = PurchasePdfOut
  end
  
  # 仕入PDF出力基底クラス
  # 識別票・記録票で共用
  class PurchasePdfBase < PdfBase
    #空override
    def make_all_pages_by_parent(ar, pdata, details, page)
      true
    end
  end
  
  # 識別票PDFアクション
  def print_lot_sheet(need_time_record=true)
    print_sheet(PurchaseLotOut)
  end
  # 識別票PDFクラス
  class PurchaseLotOut < PurchasePdfBase
    def initialize(params, mcls=nil)
      @print_rec_num_per_sheet = 1
      @pdf_detail_name = 'detail'
      @update_time_column_symbol = :print_lot_date
      @format_columns = []
      @pdf_basename = 'purchase_lot'
      super
    end
    
    def make_filename
      return @pdf_basename
    end
    
    def set_details_to_pages(ar, pdata, details, detail_name, page)
      main_hash = add_disp_name_to_hash(ar.only_hashfy)
      
      seq, page_sum, accumulate_pages = 0, 0, 0
      @print_rec_num_index ||=  @print_rec_num_per_sheet - 1
      page_org = page
      
      details.each do |d|
        pdata[page] ||= main_hash.dup
        pdata[page][detail_name] ||= {}
        pdata[page][detail_name][seq] = add_disp_name_to_hash(d.only_hashfy)
        page_sum += d['quantity']
        if seq == @print_rec_num_index
          #子レコード数で改ページ
          pdata[page]['page_num'] = page - page_org + 1
          pdata[page]['page_sum'] = page_sum
          accumulate_pages += page_sum
          pdata[page]['accumulate_pages'] = accumulate_pages
          page_sum = 0
          seq = 0
          page += 1
        else
          seq += 1
        end
      end
      
      #子レコード数が半端な場合、改ページの処理
      unless seq == 0
        pdata[page]['page_num'] = page - page_org + 1
        pdata[page]['page_sum'] = page_sum
        accumulate_pages += page_sum
        pdata[page]['accumulate_pages'] = accumulate_pages
        page += 1
      end
      return page
    end
  end
  
  # 記録表PDFクラス
  class PurchasePdfOut < PurchasePdfBase
    def initialize(params, mcls=nil)
      @print_rec_num_per_sheet = 10
      @pdf_detail_name = 'detail'
      @update_time_column_symbol = :print_check_date
      @format_columns = []
      super
    end
    
    def set_details_to_pages(ar, pdata, details, detail_name, page)
      main_hash = add_disp_name_to_hash(ar.only_hashfy)
      #有効期限延長入庫
#      if ar.sign_type_code == MCODE_SIGN_TYPE_BLACK && 
#         ar.purchase_type_code == MCODE_PURCHASE_TYPE_EXTEND
#         is_output_ubd_label = true
#      end
      if ar.purchase_type_code == MCODE_PURCHASE_TYPE_EXTEND_LOAD
         is_output_ubd_label = true
      end
      
      seq, page_sum, accumulate_pages = 0, 0, 0
      @print_rec_num_index ||=  @print_rec_num_per_sheet - 1
      page_org = page
      
      details.each do |d|
        pdata[page] ||= main_hash.dup
        pdata[page][detail_name] ||= {}
        pdata[page][detail_name][seq] = add_disp_name_to_hash(d.only_hashfy)
        page_sum += d['quantity']
        
        # UBDシール（有効期限延長入庫 or 最大有効期限未満）
        if is_output_ubd_label
          add_to_ubd_sheet(main_hash, d)
        else
          par = get_product(d['product_id'])
          Rails.logger.debug('validity_period:'+d['validity_period'].inspect)
          Rails.logger.debug('max_validity_period:'+par.max_validity_period.inspect)
          if d['validity_period'] != par.max_validity_period
            add_to_ubd_sheet(main_hash, d)
          end
        end
        
        if seq == @print_rec_num_index
          #子レコード数で改ページ
          pdata[page]['page_num'] = page - page_org + 1
          pdata[page]['page_sum'] = page_sum
          accumulate_pages += page_sum
          pdata[page]['accumulate_pages'] = accumulate_pages
          page_sum = 0
          seq = 0
          page += 1
        else
          seq += 1
        end
      end
      
      #子レコード数が半端な場合、改ページの処理
      unless seq == 0
        pdata[page]['page_num'] = page - page_org + 1
        pdata[page]['page_sum'] = page_sum
        accumulate_pages += page_sum
        pdata[page]['accumulate_pages'] = accumulate_pages
        page += 1
      end
      
      # 最後の封印シールシートのためにtarget_dateでまとめたデータを登録
      register_master_container_by_date(ar, accumulate_pages)
      finalize_ubd_sheet if defined?(@ubd_pdata)
      return page
    end
    
    def add_to_ubd_sheet(main_hash, detail)
      unless defined?(@ubd_pdata)
        Rails.logger.debug('initialize @ubd_pdata')
        @ubd_pdata = {}
        page, seq, page_sum, accumulate_pages = 0,0,0,0
        @u_page_org = 0
      else
        page, seq, page_sum, accumulate_pages = @u_page, @u_seq, @u_page_sum, @u_accumulate_pages
      end
      
      @ubd_pdata[page] ||= main_hash.dup
      @ubd_pdata[page][@pdf_detail_name] ||= {}
      @ubd_pdata[page][@pdf_detail_name][seq] = add_disp_name_to_hash(detail.only_hashfy)
      page_sum += detail['quantity']
      
      if seq == @print_rec_num_index
        #子レコード数での改ページ
        @ubd_pdata[page]['page_num'] = page - @u_page_org + 1
        @ubd_pdata[page]['page_sum'] = page_sum
        accumulate_pages += page_sum
        @ubd_pdata[page]['accumulate_pages'] = accumulate_pages
        page_sum = 0
        seq = 0
        page += 1
      else
        seq += 1
      end
      @u_page, @u_seq, @u_page_sum, @u_accumulate_pages = page, seq, page_sum, accumulate_pages
      Rails.logger.debug(['add_to_ubd_sheet', @u_page, @u_seq, @u_page_sum, @u_accumulate_pages].join(' / '))
    end
    
    def finalize_ubd_sheet
      if @u_page_org == @u_page && @u_seq == 0
        return
      end
      unless @u_seq == 0
        @ubd_pdata[@u_page]['page_num'] = @u_page - @u_page_org + 1
        @ubd_pdata[@u_page]['page_sum'] = @u_page_sum
        @u_accumulate_pages += @u_page_sum
        @ubd_pdata[@u_page]['accumulate_pages'] = @u_accumulate_pages
        @u_page += 1
      end
      @u_seq, @u_page_sum, @u_accumulate_pages = 0, 0, 0
      @u_page_org = @u_page
    end
    
    def get_product(id)
      @product_ar_hash ||= {}
      id=id.to_i
      unless @product_ar_hash.include?(id)
        par = Product.find(id)
        Rails.logger.debug("find product:"+par.inspect)
        @product_ar_hash[id] = par
      end
      return @product_ar_hash[id]
    end
    
    def arrange_to_array(pdata)
      data_array = []
      pdata.each do |key, val|
        data_array[key] = val.merge({:page_info => {:basename => 'purchase_legal_label'}})
      end
      len = data_array.length
      pdata.each do |key, val|
        data_array[len + key] = val.merge({:page_info => {:basename => 'purchase_attach_doc'}})
      end
      len = data_array.length
      if defined?(@ubd_pdata)
        @ubd_pdata.each do |key, val|
          data_array[len + key] = val.merge({:page_info => {:basename => 'purchase_ubd_label'}})
        end
      end
      
#      # 封印シールシート
#      len = data_array.length
#      cnt, page, page_sum, accumulate_pages = 0, 0, 0, 0
#      keys = @mcontainer.keys.sort
#      keys.each do |key|
#        index = len + page
#        ids = @mcontainer[key][:masters].sort
#        data_array[index] ||= {}
#        data_array[index][@pdf_detail_name] ||= {}
#        data_array[index][@pdf_detail_name][cnt] ||= {}
#        data_array[index][@pdf_detail_name][cnt]['ids'] = ids.join(',')
#        data_array[index][@pdf_detail_name][cnt]['input_date'] = key
#        data_array[index][@pdf_detail_name][cnt]['quantity'] = @mcontainer[key][:quantity]
#        page_sum += @mcontainer[key][:quantity]
#        if cnt == @print_rec_num_index
#          data_array[index]['page_num'] = page + 1
#          data_array[index]['page_sum'] = page_sum
#          accumulate_pages += page_sum
#          data_array[index]['accumulate_pages'] = accumulate_pages
#          data_array[index].update({:page_info => {:basename => 'purchase_seal'}})
#          cnt = 0
#          page_sum = 0
#          page += 1
#        else
#          cnt += 1
#        end
#      end
#      unless cnt == 0
#        index = len + page
#        data_array[index]['page_num'] = page + 1
#        data_array[index]['page_sum'] = page_sum
#        accumulate_pages += page_sum
#        data_array[index]['accumulate_pages'] = accumulate_pages
#        data_array[index].update({:page_info => {:basename => 'purchase_seal'}})
#      end
      return data_array
    end
    
#    def register_master_container_by_target_date(ar, quantity)
#      target_date = ar.target_date
#      @mcontainer ||= {}
#      if @mcontainer[target_date]
#        @mcontainer[target_date][:masters] << ar.id
#        @mcontainer[target_date][:quantity] += quantity
#      else
#        @mcontainer[target_date] ||= {}
#        @mcontainer[target_date][:masters] = [ar.id]
#        @mcontainer[target_date][:quantity] = quantity
#      end
#    end
    #キーがtarget_dateからinput_dateにかわりました
    def register_master_container_by_date(ar, quantity)
      key_date = ar.input_date
      @mcontainer ||= {}
      if @mcontainer[key_date]
        @mcontainer[key_date][:masters] << ar.id
        @mcontainer[key_date][:quantity] += quantity
      else
        @mcontainer[key_date] ||= {}
        @mcontainer[key_date][:masters] = [ar.id]
        @mcontainer[key_date][:quantity] = quantity
      end
    end
  end
  #売上と仕入の場合は、comp_product_infoで得られたstock_flag_codeをみて、非在庫管理製品を除いたstock_total_quantityを求める。
  def set_product_params
    super
    @mcls.set_stock_total_quantity(@table_params, @details)
  end
end