# frozen_string_literal: true

module PagesCore
  module HeadTagsHelper
    def document_title_tag(separator: " - ")
      parts = [document_title, PagesCore.config.site_name]
      tag.title(parts.compact_blank.uniq.join(separator))
    end

    def head_tag(&)
      PagesCore.deprecator.warn(
        "head_tag helper is deprecated and will be removed"
      )

      tag.head do
        safe_join([document_title_tag,
                   pages_meta_tags(instance_variable_get(:@page)),
                   ([csrf_meta_tags, csp_meta_tag] unless static_cached?),
                   (block_given? ? capture(&) : nil)].flatten.compact_blank,
                  "\n")
      end
    end

    def meta_image_url(image, size: "1200x")
      return if image.blank?
      return image unless image.is_a?(Image)

      dynamic_image_url(image, size:, only_path: false)
    end

    def pages_meta_tags(page = nil)
      safe_join(
        [(tag.meta(name: "robots", content: "noindex") if page&.skip_index?),
         meta_description_tag(meta_description(page)),
         meta_image_tag(meta_image(page)),
         open_graph_tags(page)].compact_blank, "\n"
      )
    end

    private

    def meta_description(record = nil)
      description = content_for(:meta_description)
      description ||= record.meta_description if record.try(&:meta_description?)
      description ||= record.excerpt if record.try(&:excerpt?)
      strip_tags(description)&.strip
    end

    def meta_description_tag(content)
      return if content.blank?

      tag.meta(name: "description", content:)
    end

    def meta_image(record = nil)
      meta_image_url(
        content_for(:meta_image) ||
          record.try(:meta_image) || record.try(:image)
      )
    end

    def meta_image_tag(href)
      return if href.blank?

      tag.link(rel: "image_src", href:)
    end

    def open_graph_description(record = nil)
      if content_for?(:open_graph_description)
        content_for(:open_graph_description)
      elsif record.try(:open_graph_description?)
        record.open_graph_description
      else
        meta_description(record)
      end
    end

    def open_graph_properties(record = nil)
      { type: "website",
        site_name: PagesCore.config(:site_name),
        title: open_graph_title(record),
        image: meta_image(record),
        description: open_graph_description(record)&.strip,
        url: request.url }
    end

    def open_graph_tags(record = nil)
      safe_join(
        open_graph_properties(record)
          .compact
          .map { |name, content| tag.meta(property: "og:#{name}", content:) },
        "\n"
      )
    end

    def open_graph_title(record = nil)
      if content_for?(:open_graph_title)
        content_for(:open_graph_title)
      elsif record.try(:open_graph_title?)
        record.open_graph_title
      else
        document_title
      end
    end
  end
end