class GroupOrderInvoicePdf < RenderPdf
  def filename
    ordergroup_name = @options[:ordergroup].name || "OrderGroup"
    "#{ordergroup_name}_" + I18n.t('documents.group_order_invoice_pdf.filename', :number => @options[:invoice_number]) + '.pdf'
  end

  def title
    I18n.t('documents.group_order_invoice_pdf.title', :supplier => @options[:supplier])
  end

  def body
    contact = FoodsoftConfig[:contact].symbolize_keys
    ordergroup = @options[:ordergroup]

    # From paragraph
    bounding_box [margin_box.right - 200, margin_box.top - 20], width: 200 do
      text I18n.t('documents.group_order_invoice_pdf.invoicer')
      move_down 7
      text FoodsoftConfig[:name], size: fontsize(9), align: :left
      move_down 5
      text contact[:street], size: fontsize(9), align: :left
      move_down 5
      text "#{contact[:zip_code]} #{contact[:city]}", size: fontsize(9), align: :left
      move_down 5
      if contact[:phone].present?
        text "#{Supplier.human_attribute_name :phone}: #{contact[:phone]}", size: fontsize(9), align: :left
        move_down 5
      end
      text "#{Supplier.human_attribute_name :email}: #{contact[:email]}", size: fontsize(9), align: :left if contact[:email].present?
      move_down 5
      text I18n.t('documents.group_order_invoice_pdf.tax_number', :number => @options[:tax_number]), size: fontsize(9), align: :left
    end

    # Receiving Ordergroup
    bounding_box [margin_box.left, margin_box.top - 20], width: 200 do
      text I18n.t('documents.group_order_invoice_pdf.invoicee')
      move_down 7
      text I18n.t('documents.group_order_invoice_pdf.ordergroup.name', ordergroup: ordergroup.name.to_s), size: fontsize(9)
      move_down 5
      if ordergroup.contact_address.present?
        text I18n.t('documents.group_order_invoice_pdf.ordergroup.contact_address', contact_address: ordergroup.contact_address.to_s), size: fontsize(9)
        move_down 5
      end
      if ordergroup.contact_phone.present?
        text I18n.t('documents.group_order_invoice_pdf.ordergroup.contact_phone', contact_phone: ordergroup.contact_phone.to_s), size: fontsize(9)
        move_down 5
      end
      if ordergroup.customer_number.present?
        text I18n.t('documents.group_order_invoice_pdf.ordergroup.customer_number', customer_number: ordergroup.customer_number.to_s), size: fontsize(9)
        move_down 5
      end
    end

    # invoice Date and nnvoice number
    bounding_box [margin_box.right - 200, margin_box.top - 150], width: 200 do
      text I18n.t('documents.group_order_invoice_pdf.invoice_date', invoice_date: @options[:invoice_date].strftime(I18n.t('date.formats.default'))), align: :left
      move_down 5
      text I18n.t('documents.group_order_invoice_pdf.invoice_number', invoice_number: @options[:invoice_number]), align: :left
    end

    move_down 15

    # kind of the "body" of the invoice
    text I18n.t('documents.group_order_invoice_pdf.payment_method', payment_method: @options[:payment_method])
    move_down 15
    text I18n.t('documents.group_order_invoice_pdf.table_headline')
    move_down 5

    #------------- Table Data -----------------------

    @group_order = GroupOrder.find(@options[:group_order].id)

    if FoodsoftConfig[:group_order_invoices][:vat_exempt]
      body_for_vat_exempt
    else
      body_with_vat
    end
  end

  def body_for_vat_exempt
    total_gross = 0
    data = [I18n.t('documents.group_order_invoice_pdf.vat_exempt_rows')]
    move_down 10
    group_order_articles = GroupOrderArticle.where(group_order_id: @group_order.id)
    separate_deposits = FoodsoftConfig[:group_order_invoices]&.[](:separate_deposits)
    group_order_articles.each do |goa|
      # if no unit is received, nothing is to be charged
      next if goa.result.to_i == 0

      goa_total_price = separate_deposits ? goa.total_price_without_deposit : goa.total_price
      data << [goa.order_article.article.name,
               goa.result.to_i,
               number_to_currency(goa.order_article.price.fc_price_without_deposit),
               number_to_currency(goa_total_price)]
      total_gross += goa_total_price
      next unless separate_deposits && goa.order_article.price.deposit > 0.0

      goa_total_deposit = goa.result * goa.order_article.price.fc_deposit_price
      data << ["zzgl. Pfand",
               goa.result.to_i,
               number_to_currency(goa.order_article.article.fc_deposit_price),
               number_to_currency(goa_total_deposit)]
      total_gross += goa_total_deposit
    end

    table data, cell_style: { size: fontsize(8), overflow: :shrink_to_fit } do |table|
      table.header = true
      table.position = :center
      table.cells.border_width = 1
      table.cells.border_color = '666666'

      table.row(0).column(0..4).width = 80
      table.row(0).border_bottom_width = 2
      table.columns(1).align = :right
      table.columns(1..6).align = :right
    end

    move_down 5
    sum = []
    sum << [nil, nil, I18n.t('documents.group_order_invoice_pdf.sum_to_pay_gross'), number_to_currency(total_gross)]
    # table for sum
    table sum, cell_style: { size: fontsize(8), overflow: :shrink_to_fit } do |table|
      table.header = true
      table.position = :center
      table.cells.border_width = 1
      table.cells.border_color = '666666'
      table.row(0).columns(2..4).style(align: :bottom)
      table.row(0).border_bottom_width = 2
      table.row(0..-1).columns(0..1).border_width = 0

      table.rows(0..-1).columns(0..4).width = 80
      table.row(0).column(-1).style(font_style: :bold)
      table.row(0).column(-2).style(font_style: :bold)
      table.row(0).column(-1).size = fontsize(10)
      table.row(0).column(-2).size = fontsize(10)

      table.columns(1).align = :right
      table.columns(1..6).align = :right
    end

    move_down 25
    text I18n.t('documents.group_order_invoice_pdf.small_business_regulation')
    move_down 10
  end

  def body_with_vat
    separate_deposits = FoodsoftConfig[:group_order_invoices]&.[](:separate_deposits)
    total_gross = 0
    total_net = 0
    # Articles

    tax_hash_net = Hash.new(0) # for summing up article net prices grouped into vat percentage
    tax_hash_gross = Hash.new(0) # same here with gross prices

    if separate_deposits
      total_deposit = 0
      total_deposit_gross = 0

      tax_hash_deposit_gross = Hash.new(0) # for summing up deposit gross prices grouped into vat percentage
      tax_hash_deposit_net = Hash.new(0) # same here with gross prices
    end

    marge = FoodsoftConfig[:price_markup]

    # data table looks different when price_markup > 0
    data = if marge == 0
             [I18n.t('documents.group_order_invoice_pdf.no_price_markup_rows')]
           else
             [I18n.t('documents.group_order_invoice_pdf.price_markup_rows', marge: marge)]
           end
    goa_tax_hash = GroupOrderArticle.where(group_order_id: @group_order.id).find_each.group_by { |oat| oat.order_article.price.tax }
    goa_tax_hash.each do |tax, group_order_articles|
      group_order_articles.each do |goa|
        # if no unit is received, nothing is to be charged
        next if goa.result.to_i == 0

        order_article = goa.order_article
        goa_total_net = goa.result * order_article.price.price

        goa_total_gross = separate_deposits ? goa.total_price_without_deposit : goa.total_price

        data << [order_article.article.name,
                 goa.result.to_i,
                 number_to_currency(order_article.price.price),
                 number_to_currency(goa_total_net),
                 tax.to_s + '%',
                 number_to_currency(goa_total_gross)]

        if separate_deposits && order_article.price.deposit > 0.0
          goa_deposit = goa.result * order_article.price.net_deposit_price
          goa_total_deposit = goa.result * order_article.price.fc_deposit_price

          data << ["zzgl. Pfand",
                   goa.result.to_i,
                   number_to_currency(order_article.price.net_deposit_price),
                   number_to_currency(goa_deposit),
                   tax.to_s + '%',
                   number_to_currency(goa_total_deposit)]

          total_deposit += goa_deposit
          total_deposit_gross += goa_total_deposit

          tax_hash_deposit_net[tax.to_i] += goa_deposit
          tax_hash_deposit_gross[tax.to_i] += goa_total_deposit
        end

        tax_hash_net[tax.to_i] += goa_total_net
        tax_hash_gross[tax.to_i] += goa_total_gross

        total_net += goa_total_net
        total_gross += goa_total_gross
      end
    end

    # Two separate tables for sum and individual data
    # article information + data
    table data, cell_style: { size: fontsize(8), overflow: :shrink_to_fit } do |table|
      table.header = true
      table.position = :center
      table.cells.border_width = 1
      table.cells.border_color = '666666'
      table.row(0).columns(0..6).style(background_color: 'cccccc', font_style: :bold)
      table.rows(0..-1).columns(0..6).width = 80
      table.row(0).border_bottom_width = 2
      table.columns(1).align = :right
      table.columns(1..6).align = :right
    end

    sum = [[nil, nil, nil, "Netto", "MwSt", "Brutto"]]
    [7, 19].each do |key|
      sum << [nil, nil, "Produkte mit #{key}%", number_to_currency(tax_hash_net[key]), number_to_currency(tax_hash_gross[key] - tax_hash_net[key]), number_to_currency(tax_hash_gross[key])]
      sum << [nil, nil, "Pfand mit #{key}%", number_to_currency(tax_hash_deposit_net[key]), number_to_currency(tax_hash_deposit_gross[key] - tax_hash_deposit_net[key]), number_to_currency(tax_hash_deposit_gross[key])] if separate_deposits
    end

    total_deposit_gross ||= 0
    sum << [nil, nil, nil, nil, I18n.t('documents.group_order_invoice_pdf.sum_to_pay_gross'), number_to_currency(total_gross + total_deposit_gross)]

    move_down 10
    table sum, cell_style: { size: fontsize(8), overflow: :shrink_to_fit } do |table|
      table.header = true
      table.position = :center
      table.cells.border_width = 1
      table.cells.border_color = '666666'
      table.row(0).columns(2..6).style(align: :bottom)
      table.row(0).border_bottom_width = 2
      table.row(0..-1).columns(0..1).border_width = 0

      table.rows(0..-1).columns(0..6).width = 80
      table.row(-1).column(-1).style(font_style: :bold)
      table.row(-1).column(-2).style(font_style: :bold)
      table.row(-1).column(-1).size = fontsize(10)
      table.row(-1).column(-2).size = fontsize(10)

      table.columns(1).align = :right
      table.columns(1..6).align = :right
    end

    if FoodsoftConfig[:group_order_invoices][:vat_exempt]
      move_down 15
      text I18n.t('documents.group_order_invoice_pdf.small_business_regulation')
    end
    move_down 10
  end
end