# frozen_string_literal: true

module PdfDocuments
  class Base
    attr_reader :params, :font

    def initialize(prawn_document, **params)
      @prawn_document = prawn_document
      @prawn_document.markup_options = markup_options
      # @prawn_document.font_families.update('Lexend' => {
      #                                        normal: 'vendor/assets/fonts/Lexend-Light.ttf',
      #                                        bold: 'vendor/assets/fonts/Lexend-Bold.ttf',
      #                                        exta_bold: 'vendor/assets/fonts/Lexend-ExtraBold.ttf',
      #                                        italic: 'vendor/assets/fonts/Lexend-Regular.ttf'
      #                                      })
      @font = "Helvetica"
      @prawn_document.font @font, size: 12
      @params = OpenStruct.new(params)
    end

    def create
      generate
      @prawn_document
    end

    private

    def generate
      raise NotImplementedError
    end

    def heading1(text)
      @prawn_document.markup "<h1>#{text}</h1>"
    end

    def heading2(text)
      @prawn_document.markup "<h2>#{text}</h2>"
    end

    def heading3(text)
      @prawn_document.markup "<h3>#{text}</h3>"
    end

    def heading4(text)
      @prawn_document.markup "<h4>#{text}</h4>"
    end

    def text(text, **args)
      @prawn_document.text text, markup_options[:text].merge(args)
    end

    def rich_text(text)
      @prawn_document.markup prepare_rich_text(text)
    end

    def hr
      @prawn_document.markup "<hr>"
    end

    def markup_options
      {
        text: { size: 12, margin_bottom: 5 },
        heading1: { style: :bold, size: 26, margin_bottom: 5, margin_top: 0 },
        heading2: { style: :bold, size: 17, margin_bottom: 5, margin_top: 5 },
        heading3: { style: :bold, size: 13, margin_bottom: 5, margin_top: 5 },
        heading4: { style: :bold, size: 12, margin_bottom: 5, margin_top: 5 },
        heading5: { style: :bold, size: 12, margin_bottom: 5, margin_top: 5 },
        heading6: { style: :thin, size: 12, margin_bottom: 5, margin_top: 5 }
      }
    end

    def logo(width: 24, xs: true)
      @prawn_document.image "app/assets/images/logo-apfelschule#{ xs ? "_xs" : "" }.png", width:
    end

    def prepare_rich_text(rich_text)
      { h1: "h5" }.each do |tag, replacement|
        rich_text = rich_text.to_s.gsub("<#{tag}", "<#{replacement}")
        rich_text = rich_text.to_s.gsub("</#{tag}>", "</#{replacement}>")
      end

      rich_text.sub(/(<br>)+$/, "")
    end
    # @prawn_document.draw_text("Dokument erstellt am #{Time.current.strftime('%d %B %Y')} um #{Time.current.strftime('%H:%M:%S')}", at: [ 0, -15 ])

    def font(...)
      @prawn_document.font(...)
    end

    def formatted_text(...)
      @prawn_document.formatted_text(...)
    end

    def move_down(...)
      @prawn_document.move_down(...)
    end

    def safe_display(value, &block)
      return if value.blank?

      begin
        yield(value)
      rescue StandardError
        nil
      end
    end

    def bold(text)
      @prawn_document.font(@font, style: :bold) do
        @prawn_document.text text
      end
    end

    def image(attachable, **args)
      begin
        @prawn_document.image(ActiveStorage::Blob.service.path_for(attachable.key), **args) && raise("david")
      rescue StandardError
        false
      end
    end

    def without_page_break(&block)
      return yield
      return @prawn_document.bounding_box([ 0, @prawn_document.cursor ], width: 300) do
        yield
        # @prawn_document.stroke_bounds if Rails.env.development?
        # print_coordinates
      end
      @prawn_document.span(520) do
        yield
        # @prawn_document.stroke_bounds
      end
    end

    def print_coordinates
      @prawn_document.text("top: #{@prawn_document.bounds.top}")
      @prawn_document.text("bottom: #{@prawn_document.bounds.bottom}")
      @prawn_document.text("left: #{@prawn_document.bounds.left}")
      @prawn_document.text("right: #{@prawn_document.bounds.right}")
      @prawn_document.move_down(10)
      @prawn_document.text("absolute top: #{Float(@prawn_document.bounds.absolute_top).round(2)}")
      @prawn_document.text("absolute bottom: #{Float(@prawn_document.bounds.absolute_bottom).round(2)}")
      @prawn_document.text("absolute left: #{Float(@prawn_document.bounds.absolute_left).round(2)}")
      @prawn_document.text("absolute right: #{Float(@prawn_document.bounds.absolute_right).round(2)}")
    end

    def new_page(required_space: 0)
      @prawn_document.start_new_page if @prawn_document.cursor <= required_space + 10
    end
  end
end
