# frozen_string_literal: true

module PdfDocuments
  class CustomerReport < Base
    private

    def generate
      move_down 130
      logo(width: 250, xs: false)
      move_down 40
      heading1 params.report.name

      move_down 20
      @prawn_document.text "#{I18n.l params.report.updated_at.to_date, format: :long}"
      move_down 40
      safe_display(params.report.comment) do 
        rich_text _1
        move_down 30
      end

      @prawn_document.font_size(8) do
        @prawn_document.draw_text("Dokument erstellt am #{Time.current.strftime('%d %B %Y')} um #{Time.current.strftime('%H:%M:%S')}", at: [0, 0])
      end
      @prawn_document.start_new_page
      @pages = {}

      params.report.export[:elements].each.with_index(1) do |(element, success_criteria), element_index|
        new_page(required_space: 200) if element_index > 1
        without_page_break do
          heading2 "#{element_index} #{element.title}"
          @prawn_document.text("<b>Pfad:</b> #{element.page.path}", inline_format: true)
          safe_display(element.screenshot) do 
            image(_1.variant(:thumbnail), height: 160) 
            move_down(15) 
          end
        end
        rich_text element.description
        move_down(10)

        success_criteria.each.with_index(1) do |success_criterion, sc_index|
          @pages[success_criterion.id] = @prawn_document.page_number
          success_criterion_row(success_criterion, [ element_index, sc_index ])
        end
      end

      @prawn_document.start_new_page
      heading1("Anhang: Richtlinien")
      params.report.export[:success_criteria].group_by(&:check).sort_by{ |c, _scs| c.external_number }.each do |check, criteria|
        heading2(check.display_label)
        { 
          external_number: { label: "WCAG Nummer" },
          external_url: { label: "WCAG Link" },
          conformity_level: { label: "Konformität" },
          conformity_notice_de: { label: "Anmerkung Konformität", rich: true },
          priority: { label: "Priorität" },
          criterion_de: { label: "Kriterium/Grundlage", rich: true },
          exemption_details_de: { label: "Ausnahmen", rich: true },
          criterion_details_de: { label: "Verstehen", rich: true },
          example_de: { label: "Beispiel", rich: true },
          annotation_de: { label: "Anmerkung", rich: true }
        }.each do |attribute, options|
          v = check.send(attribute)
          safe_display(v) do 
            text("<b>#{options[:label]}</b>", inline_format: true)
            if options[:rich]
              rich_text(_1)
            else 
              text(_1) 
            end
          end
        end

        if check.links.any?
          text("<b>Links</b>", inline_format: true)
          check.links.group_by(&:link_category).each do |cat, links|
            text(%Q(
              <b>#{cat.name}</b>
              <ul>
                #{links.map{ "<link href=#{_1.url}>#{_1.text}</link>" }.join() }
              </ul>
            ), inline_format: true)
          end
        end

        text("<b>Erfolgskriterien</b>", inline_format: true)
        text criteria.map(&:number).sort.join(", ")
      end
      string = "Seite <page> / <total>"
      # Green page numbers 1 to 7
      options = {
      at: [ @prawn_document.bounds.right - 150, 776 ],
      width: 150,
      align: :right,
      start_count_at: 2,
      page_filter: ->(x) { x > 1 }
      }
      @prawn_document.number_pages string, options

      @prawn_document.repeat(2..) do
        @prawn_document.text_box "<b>#{params.report.name}</b>", at: [ 50, 777 ], inline_format: true, width: 300
        # @prawn_document.text_box "#{I18n.l params.report.updated_at.to_date, format: :long}", at: [ 0, 777 ], inline_format: true, width: 532, align: :right
        @prawn_document.bounding_box([0, 766], width: 532) do
          hr
        end
        @prawn_document.bounding_box([0, 796], width: 200, height: 200) do
          logo
        end
      end
      @prawn_document.repeat(2..) do
        # @prawn_document.bounding_box([ 0, 790 ], width: 200) do
        #   logo
        # end
        # @prawn_document.formatted_text_box([ {
        #   text: "Dieses Dokument wurd am #{Time.current.strftime('%d %B %Y')} um #{Time.current.strftime('%H:%M:%S')} erstellt.",
        #   size: 8,
        #   align: :right
        # } ],
        # at: [ 0, -15 ],
        # width: 200
        # )
        # @prawn_document.text_box "#{I18n.l params.report.updated_at.to_date, format: :long}", at: [ 0, 777 ], inline_format: true, width: 532, align: :right
        @prawn_document.font_size(8) do
          # @prawn_document.draw_text("Dokument erstellt am #{Time.current.strftime('%d %B %Y')} um #{Time.current.strftime('%H:%M:%S')}", at: [ 0, -15 ])
        end
        # @prawn_document.bounding_box([0, 0], width: 532) do
        #   hr
        # end
      end

      x = params
      p = @pages
      @prawn_document.outline.define do
        x.report.export[:elements].each.with_index(1) do |(element, success_criteria), element_index|
          section("#{element_index} #{element.title}") do
            success_criteria.each.with_index(1) do |sc, sc_index|
              page(title: "#{element_index}.#{sc_index} #{sc.title}", destination: p[sc.id])
            end
          end
        end
      end
    end

    private

    def success_criterion_row(success_criterion, index)
      heading3 "#{index.join(".")} #{success_criterion.title}"
      safe_display(success_criterion.test_comment) do
        without_page_break do
          heading4 "Kommentar"
          rich_text success_criterion.test_comment
        end
      end
      safe_display(success_criterion.quick_criterion) do
        without_page_break do
          heading4 "Kriterium"
          rich_text success_criterion.quick_criterion
        end
      end
      safe_display(success_criterion.quick_fail) do
        without_page_break do
          heading4 "Fail"
          rich_text success_criterion.quick_fail
        end
      end
      safe_display(success_criterion.quick_fix) do
        without_page_break do
          heading4 "Fix"
          rich_text success_criterion.quick_fix
        end
      end
      heading4("Protokollnummer")
      text(success_criterion.number)
      heading4("WCAG")
      text("<link href='#{success_criterion.check.external_url}'>#{success_criterion.check.external_number}</link>'", inline_format: true)
      move_down(10)
    end
  end
end
