<?php

namespace App\Services;

use App\Models\CatalogLandingPageVisit;
use App\Models\LandingPage;
use DOMDocument;

class CatalogLandingPageVisitDocument
{
    public function apply(LandingPage $page, string $html, CatalogLandingPageVisit $visit): string
    {
        $parameters = $page->publicRouteParameters();

        if ($parameters === null) {
            return $html;
        }

        $clickoutUrl = route('public-catalog-landing-pages.clickouts.store', $parameters, absolute: true);
        $pageLoadId = $visit->page_load_id;

        if (! is_string($clickoutUrl) || ! is_string($pageLoadId) || $pageLoadId === '') {
            return $html;
        }

        return $this->injectIntoHtml($html, $pageLoadId, $clickoutUrl);
    }

    private function injectIntoHtml(string $html, string $pageLoadId, string $clickoutUrl): string
    {
        $dom = new DOMDocument;
        $dom->preserveWhiteSpace = true;

        libxml_use_internal_errors(true);
        $loaded = $dom->loadHTML($html, LIBXML_HTML_NODEFDTD);
        libxml_clear_errors();

        if (! $loaded) {
            return $html;
        }

        $pageLoadIdJson = json_encode($pageLoadId, JSON_HEX_TAG | JSON_HEX_AMP | JSON_HEX_APOS | JSON_HEX_QUOT);
        $clickoutUrlJson = json_encode($clickoutUrl, JSON_HEX_TAG | JSON_HEX_AMP | JSON_HEX_APOS | JSON_HEX_QUOT);

        if (! is_string($pageLoadIdJson) || ! is_string($clickoutUrlJson)) {
            return $html;
        }

        $script = $dom->createElement('script');
        $script->appendChild($dom->createTextNode(
            "(function () {\n"
            ."  window.__admediaCatalogPageLoadId = {$pageLoadIdJson};\n"
            ."  window.__admediaCatalogClickoutUrl = {$clickoutUrlJson};\n"
            .<<<'JS'

  function isCatalogProductCta(link) {
    if (!link || !link.getAttribute) {
      return false;
    }

    if (link.closest('header.topbar a.brand, header .logo, .topbar .brand')) {
      return false;
    }

    if (link.matches('[class*="cta"], [class*="row-cta"], .row-overlay-link, .row-thumb-link')) {
      return true;
    }

    return !!link.closest('.product-row, .product-card, .product-rows, #products, section[id*="product"], article');
  }

  function recordCatalogClickout(link) {
    var endpoint = window.__admediaCatalogClickoutUrl;
    var pageLoadId = window.__admediaCatalogPageLoadId;

    if (!endpoint || !pageLoadId || !link) {
      return;
    }

    var payload = JSON.stringify({
      page_load_id: pageLoadId,
      destination_url: link.getAttribute('href') || link.href || ''
    });

    if (navigator.sendBeacon) {
      navigator.sendBeacon(endpoint, new Blob([payload], { type: 'application/json' }));
      return;
    }

    if (typeof fetch === 'function') {
      fetch(endpoint, {
        method: 'POST',
        body: payload,
        headers: { 'Content-Type': 'application/json' },
        keepalive: true,
        credentials: 'omit'
      });
    }
  }

  document.addEventListener('click', function (event) {
    var link = event.target.closest('a[href^="http"]');
    if (!isCatalogProductCta(link)) {
      return;
    }

    recordCatalogClickout(link);
  }, true);
})();
JS
        ));

        $bodies = $dom->getElementsByTagName('body');

        if ($bodies->length > 0) {
            $bodies->item(0)?->appendChild($script);
        } else {
            $dom->appendChild($script);
        }

        $output = $dom->saveHTML();

        return is_string($output) ? $output : $html;
    }
}
