#= 送り状印刷
module CommLogistics::Modules::PrintTruckingNotes
  #== 送り状印刷インスタンス生成
  def get_notes_generator(params)
    case params[:trucking_id].to_i
    when 5
      ng = YamatoNotes.new
    when 3
      ng = NittsuNotes.new
    else
      raise 'Unknown or Unsupported trucking id:'+params[:trucking_id].to_s
    end
    ng.request = request
    return ng
  end
  
  #= 送り状基底クラス
  class TruckingNotes
    include Comm::Module::DateParams
    include Comm::Const::Print
    require 'fastercsv'
    require 'nkf'
    attr_accessor :request
    
    def initialize
      #csvの要素数
      @csv_element_num ||= 10
      #コメントとして出荷伝票IDをメモするカラム番号
      @comment_column_number ||= 0
      #コメントとして送り状印刷時間をメモするカラム番号
      @time_column_number ||= 1
    end
    
    #== csv出力
    # (トランザクションの中にいれましょう)
    def output_csv(ars)
      csv_str = make_csv_str(ars)
      make_tmp_file(csv_str)
    end
    
    def make_csv_str(ars)
      trucking_cont = Hash.new
      ars.each do |ar|
        #前回日時がはいっていたら一括指定かつ出力済みなので日時更新だけして飛ばす
        if ar.respond_to?(:last_printed_date) && !ar.last_printed_date.blank?
          ar.print_trucking_note_date = ar.last_printed_date
          ar.save!
          next
        end
        #配達先がnilの場合便宜的に0で表現
        delivery_id = ar.delivery_id ? ar.delivery_id : 0
        shipment_customer_id = ar.shipment_customer_id
        if trucking_cont[shipment_customer_id] && trucking_cont[shipment_customer_id][delivery_id]
          #2つめ以降->idを一応記事に追加して日時を更新するだけ
          add_id_to_comment(trucking_cont[shipment_customer_id][delivery_id], ar)
          set_print_time(trucking_cont[shipment_customer_id][delivery_id], ar)
        else
          #新規->データ作成
          trucking_cont[shipment_customer_id] ||= Hash.new
          trucking_cont[shipment_customer_id][delivery_id] = Array.new(@csv_element_num)
          arrange_trucking_note(trucking_cont[shipment_customer_id][delivery_id], ar)
          set_print_time(trucking_cont[shipment_customer_id][delivery_id], ar)
        end
      end
      #Rails.logger.debug('TRUCKING CONTAINER:'+trucking_cont.inspect)
      csv_str = FasterCSV.generate({:force_quotes=>true}) do |csv|
        trucking_cont.values.each do |cust_hash|
          cust_hash.values.each do |csv_array|
            csv << csv_array
          end
        end
      end
      return csv_str
    end
    
    def make_tmp_file(str_utf8)
      @tmp_path = Dir.tmpdir+'/'+@request.session_options[:id].to_s+Time.now.to_i.to_s
      tmp = File.open(@tmp_path,'w')
      tmp.puts(NKF.nkf('-sm0W8x', str_utf8))
      tmp.close
      return true
    end
    
    #== 送り主情報取得
    def get_supplier_info
      if @own_supplier_ci
        return @own_supplier_ci
      end
      sar = Supplier.find(App::Const::SystemCode::OWN_SUPPLIER_ID)
      @own_supplier_ci = CompanyInfo.new(sar)
    end
    
    #== 製品名取得
    def get_product_print_name(ar)
      product_set_id_array=[]
      ar.child_details.each{|detail| product_set_id_array << detail.product_set_id}
      product_set_id_array.uniq!
      product_print_name_array=[]
      product_set_id_array.each do |pid|
        ps = ProductSet.find(pid)
        product_print_name_array << (ps.common_name||' ').strip
      end
      product_print_name_array.uniq!
      return product_print_name_array.join(' ')
    end
    
    def get_file_name
      return 'trucking_notes_'+Time.now.strftime("%y%m%d-%H%M")+'.csv'
    end
    def get_tmp_path
      return @tmp_path
    end
    def get_file_type
      return FILE_TYPE_INFO[2][:ctype]
    end
    def add_id_to_comment(array, ar)
      if array[@comment_column_number]
        array[@comment_column_number] = array[@comment_column_number] + ' ' +ar.id.to_s
      else
        array[@comment_column_number] = ar.id.to_s
      end
    end
    def arrange_trucking_note(array, ar)
      raise "This Method should be overridden."
    end
    def set_print_time(array, ar)
      ar.print_trucking_note_date = array[@time_column_number]
      ar.save!
    end
    def format_date(date)
      if date
        return date.strftime("%Y%m%d")
      end
    end
    def extract_number(str)
      return str.to_s.gsub(/\D/, '') if str
    end
    
    class CompanyInfo
      attr_reader :zip
      attr_reader :address_1
      attr_reader :address_2
      attr_reader :tel
      attr_reader :disp_name
      attr_reader :print_name_1
      attr_reader :print_name_2
      
      def initialize(ar)
        if !ar.respond_to?(:delivery_zip) || 
           (ar.delivery_zip.blank? && ar.delivery_address_1.blank?)
          @zip = (ar.zip||'').strip
          @address_1 = (ar.address_1||'').strip
          @address_2 = (ar.address_2||'').strip
          @tel = (ar.tel||'').strip
        else
          @zip = (ar.delivery_zip||'').strip
          @address_1 = (ar.delivery_address_1||'').strip
          @address_2 = (ar.delivery_address_2||'').strip
          @tel = (ar.delivery_tel||'').strip
        end
        @disp_name = (ar.disp_name||'').strip
        @print_name_1 = (ar.print_name_1||'').strip
        @print_name_2 = (ar.print_name_2||'').strip
      end
      
      def get_combined_print_name
        return @print_name_1 + ' ' + @print_name_2
      end
    end
  end
  
  #=日通
  class NittsuNotes < TruckingNotes
    def initialize
      @csv_element_num = 36
      @comment_column_number = 21
      @time_column_number = 22
      super
    end
    def arrange_trucking_note(array, ar)
      Rails.logger.debug("Nittsu ar:"+ar.inspect)
      #届け先コード 店止めの場合は適当な数字を足しておく
      array[0] = ar.delivery_id ? 1000000000 + ar.delivery_id : ar.customer_id
      #荷受人
      #営業所止め
      if ar.delivery_id
        dar = Delivery.find(ar.delivery_id)
        di = CompanyInfo.new(dar)
        array[1] = extract_number(di.zip)
        array[2] = di.address_1
        array[3] = di.address_2
        array[5] = di.get_combined_print_name
        car = Customer.find(ar.shipment_customer_id)
        ci = CompanyInfo.new(car)
        array[6] = ci.get_combined_print_name
        array[7] = ci.tel
        array[25] = '営業店止め'
      else
        car = Customer.find(ar.shipment_customer_id)
        ci = CompanyInfo.new(car)
        array[1] = extract_number(ci.zip)
        array[2] = ci.address_1
        array[3] = ci.address_2
        array[5] = ci.get_combined_print_name
        array[7] = ci.tel
      end
      #発送日
      array[14] = format_date(ar.target_date)
      #品名
      array[15] = '医療機器'
      #配達指定日
      array[16] = format_date(ar.arrival_date)
      #配達時間
      array[20] = extract_number(ar.request_time) if ar.request_time
      array[@comment_column_number] = (ar.id.to_s||'').strip
      array[@time_column_number] = Time.now.to_s
      #配達店コード
      #array[31] =
      #個数
      array[32] = 1
      #重量
      array[33] = '0.1'
    end
  end
  
  #=ヤマト
  class YamatoNotes < TruckingNotes
    def initialize
      @csv_element_num = 51
      @comment_column_number = 45
      @time_column_number = 46
      super
    end
    
    def arrange_trucking_note(array, ar)
      Rails.logger.debug("Yamato ar:"+ar.inspect)
      #運送依頼番号
      array[0] = ar.id.to_s
      #集荷希望日
      array[2] = format_date(ar.target_date)
      #荷受人
      car = Customer.find(ar.shipment_customer_id)
      ci = CompanyInfo.new(car)
      array[5] = ci.disp_name
      array[6] = ci.tel
      array[7] = extract_number(ci.zip)
      array[8] = ci.address_1
      array[9] = ci.address_2
      array[11] = ci.print_name_1
      array[12] = ci.print_name_2
      #依頼主
      si = get_supplier_info
      array[14] = si.print_name_1
      array[15] = si.tel
      array[16] = extract_number(si.zip)
      array[17] = si.address_1
      array[18] = si.address_2
      array[19] = si.print_name_1
      array[20] = si.print_name_2
      #付帯作業
      array[26] = 'こわれもの'
      #商品名
      array[30] = get_product_print_name(ar)
      #梱包寸法(固定)
      array[33] = '1101'
      #着荷指定日
      array[34] = format_date(ar.arrival_date)
      #着荷指定時刻
      array[35] = extract_number(ar.request_time) if ar.request_time
      #個数
      array[36] = 1
      #重量
      array[39] = '00000000000100'
      #営業所止め
      if ar.delivery_id
        array[42] = 1
        dar = Delivery.find(ar.delivery_id)
        array[43] = (dar.trucking_store_number||'').strip
        array[44] = (dar.disp_name||'').strip
      end
      #記事欄
      array[@comment_column_number] = (ar.id.to_s||'').strip
      array[@time_column_number] = Time.now.to_s
    end
  end
end