// DP script
let dp_eventsToCheck = [
  "add_to_cart",
  "view_item",
  "login",
  "sign_up",
  "view_cart",
  "begin_checkout",
  "remove_from_cart",
  "view_item_list",
  "select_item",
  "add_to_wishlist",
  "view_promotion",
  "select_promotion",
  "add_payment_info",
  "add_shipping_info",
  "refund",
];

let dp_eventsForUpgates = {
  "cart.add": "add_to_cart",
  "cart.remove": "remove_from_cart",
  "checkout.initiate": "begin_checkout",
  "checkout.payment.select": "add_payment_info",
  "checkout.shipment.select": "add_shipping_info",
};

var dp_xdataSent = false;
let dp_lastTrackedUrl = window.location.href;

window.index_conversion = window.index_conversion || {};
window.index_conversion.automatic_event =
  window.index_conversion.automatic_event || [];
var dp_dataProcessed = false;
var urlForErrors =
  "https://n8n.advisio.cz/webhook/cc0a1f34-d512-46b6-b8ad-f60750a019ea";
var dp_shopType;

var _cs = (document.currentScript && document.currentScript.src) || "";
var dp_scriptURL = _cs
  ? _cs.indexOf("myshoptet.com") !== -1
    ? window.location.href
    : _cs
  : window.location.href;

function sendData() {
  dp_xdataSent = false;
  dp_sendData();
}

function dp_sendData() {
  if (dp_xdataSent) return;

  try {
    var dp_script_domain = new URL(dp_scriptURL).origin;

    window.index_conversion = window.index_conversion || {};
    var screen_resolution =
      typeof window !== "undefined" &&
      window.screen &&
      window.screen.width &&
      window.screen.height
        ? window.screen.width + "x" + window.screen.height
        : "unknown";
    index_conversion.currentURL = window.location.href || "";

    if (window.location.href.includes("cfpm_ref")) {
      try {
        const urlParams = new URLSearchParams(window.location.search);
        const pageReferrer = urlParams.get("cfpm_ref");
        index_conversion.referrerURL = pageReferrer
          ? decodeURIComponent(pageReferrer)
          : document.referrer || "";
      } catch (e) {
        index_conversion.referrerURL = document.referrer || "";
      }
    } else {
      index_conversion.referrerURL = document.referrer || "";
    }

    index_conversion.titleURL = document.title || "";
    index_conversion.screen_resolution = screen_resolution || "";
    index_conversion.language = (
      typeof navigator !== "undefined" &&
      typeof navigator?.language === "string"
        ? navigator.language
        : "cs-cz"
    ).toLowerCase();

    index_conversion.mobile =
      typeof navigator !== "undefined"
        ? navigator.userAgentData?.mobile ??
          /Mobi|Android/i.test(navigator?.userAgent || "")
        : false;

    index_conversion.version = "4";
    index_conversion.cookie = getSpecificCookies();

    var e = dp_script_domain;

    var itemCount = 0;
    if (
      window.index_conversion.automatic_event &&
      window.index_conversion.automatic_event.length > 0
    ) {
      for (var i = 0; i < index_conversion.automatic_event.length; i++) {
        if (index_conversion.automatic_event[i].items) {
          itemCount += index_conversion.automatic_event[i].items.length;
        }
      }
    }

    var data = JSON.stringify(index_conversion);
    var queryString = `z=${new Date().getTime()}`;
    var useBody = itemCount > 2;

    if (!useBody) {
      for (var key in index_conversion) {
        if (index_conversion.hasOwnProperty(key)) {
          var value = index_conversion[key];
          if (typeof value === "object" && value !== null) {
            value = JSON.stringify(value);
          }
          queryString +=
            "&" + encodeURIComponent(key) + "=" + encodeURIComponent(value);
        }
      }
    }

    var url = e + "/index_gv3/?" + queryString + "&img=true";

    var sendUsingFetch = function () {
      if (window.fetch) {
        fetch(url, {
          method: useBody ? "POST" : "GET",
          mode: "no-cors",
          headers: {
            "Content-Type": "text/plain",
          },
          body: useBody ? data : null,
          cache: "no-store",
        }).catch(function (error) {
          console.error("Fetch error:", error);
          sendUsingXHR();
        });
      } else {
        sendUsingXHR();
      }
    };

    var sendUsingXHR = function () {
      var xhr = new XMLHttpRequest();
      xhr.open(useBody ? "POST" : "GET", url, true);
      xhr.setRequestHeader("Content-Type", "text/plain");

      xhr.onreadystatechange = function () {
        if (xhr.readyState === XMLHttpRequest.DONE) {
          if ((xhr.status >= 200 && xhr.status < 300) || xhr.status === 444) {
            console.log("XHR success: ", xhr.status);
          } else {
            console.error(
              `XHR error: ${xhr.status} ${xhr.statusText} -> fallback to image`
            );
            sendUsingImage();
          }
        }
      };

      xhr.onerror = function () {
        console.error(
          `XHR onerror: ${xhr.status} ${xhr.statusText} -> fallback to image`
        );
        sendUsingImage();
      };

      xhr.send(useBody ? data : null);
    };

    var sendUsingImage = function () {
      try {
        var img = new Image();
        img.src = url;
      } catch (e) {
        console.error("Image request error:", e);
        dp_reportError(e, { where: "sendUsingImage" });
      }
    };

    // sendUsingXHR();
    sendUsingFetch();

    dp_xdataSent = true;
  } catch (err) {
    console.error("Error in try block:", err);
    dp_reportError(err, { where: "dp_sendData" });
  }
}

function dp_reportError(err, ctx) {
  try {
    if (!ctx || !ctx.where) {
      console.warn("[DataPlus] Error without context - ignoring:", err);
      return;
    }

    const allowedContexts = [
      "dp_sendData",
      "sendUsingImage",
      "sendUsingXHR",
      "sendUsingFetch",
      "dp_checkAndSendAiOverview",
      "history.wrapper",
      "event_listeners.wrapper",
      "transformItemsObject",
      "processShoptetEvents",
      "processGA4DataLayerEvent",
      "upgates.event_handler",
      "dp_processTransaction",
    ];

    if (!allowedContexts.includes(ctx.where)) {
      console.warn(
        "[DataPlus] Error from unknown context - ignoring:",
        ctx.where,
        err
      );
      return;
    }

    let message = "",
      stack = "",
      errorType = "";

    if (err && typeof err === "object") {
      message = String(err.message || "");
      stack = String(err.stack || "");
      errorType = err.name || typeof err;
    } else {
      message = String(err);
      errorType = "Error";
    }

    let currentEvent = null;
    let eventCount = 0;
    try {
      if (window.index_conversion?.automatic_event?.length > 0) {
        eventCount = window.index_conversion.automatic_event.length;
        const lastEvent =
          window.index_conversion.automatic_event[eventCount - 1];
        currentEvent = lastEvent?.name || null;
      }
    } catch (_) {}

    const sourceUrl =
      typeof dp_scriptURL === "string"
        ? dp_scriptURL
        : typeof location !== "undefined"
        ? location.href
        : "";
    const ua =
      typeof navigator !== "undefined" && navigator.userAgent
        ? navigator.userAgent
        : "Unknown";
    const lang =
      typeof navigator !== "undefined" && navigator.language
        ? navigator.language
        : "Unknown";

    const browserCaps = {
      fetch: typeof window.fetch === "function",
      xhr: typeof window.XMLHttpRequest === "function",
      image: typeof window.Image === "function",
    };

    const networkState = {
      online: typeof navigator !== "undefined" ? navigator.onLine : null,
    };

    try {
      const conn =
        navigator.connection ||
        navigator.mozConnection ||
        navigator.webkitConnection;
      if (conn) {
        networkState.type = conn.effectiveType || conn.type || null;
        networkState.rtt = conn.rtt || null;
        networkState.downlink = conn.downlink || null;
      }
    } catch (_) {}

    const pageState = {
      readyState: typeof document !== "undefined" ? document.readyState : null,
      visibilityState:
        typeof document !== "undefined" ? document.visibilityState : null,
    };

    let text = `*🚨 DataPlus Script Error fix*\n\n`;
    text += `*${errorType}:* \`${message}\`\n\n`;

    if (stack) {
      text += `*Stack Trace:*\n\`\`\`\n${stack}\n\`\`\`\n\n`;
    }

    if (ctx || currentEvent || dp_shopType) {
      text += `*Context:*\n`;
      if (ctx?.where) text += `  • where: ${ctx.where}\n`;
      if (currentEvent) text += `  • processing_event: ${currentEvent}\n`;
      if (dp_shopType) text += `  • shop_type: ${dp_shopType}\n`;

      if (ctx) {
        const cleanCtx = { ...ctx };
        delete cleanCtx.where;

        Object.entries(cleanCtx).forEach(([key, value]) => {
          if (value !== null && value !== undefined) {
            if (key === "failures" && Array.isArray(value)) {
              text += `  • failures:\n`;
              value.forEach((failure, idx) => {
                text += `    ${idx + 1}. Transport: ${
                  failure.step || "unknown"
                }\n`;
                if (failure.name)
                  text += `       Error Type: ${failure.name}\n`;
                if (failure.message)
                  text += `       Message: ${failure.message}\n`;
                if (failure.extra) {
                  text += `       Details: ${JSON.stringify(failure.extra)}\n`;
                }
              });
            } else {
              text += `  • ${key}: ${
                typeof value === "object" ? JSON.stringify(value) : value
              }\n`;
            }
          }
        });
      }
      text += `\n`;
    }
    text += `*Environment:*\n`;
    text += `  • Browser: fetch=${browserCaps.fetch}, xhr=${browserCaps.xhr}, img=${browserCaps.image}\n`;
    text += `  • Network: online=${networkState.online}`;
    if (networkState.type) {
      text += `, type=${networkState.type}`;
      if (networkState.rtt) text += `, rtt=${networkState.rtt}ms`;
    }
    text += `\n`;
    text += `  • Page: ${pageState.readyState}, visibility=${pageState.visibilityState}\n`;
    text += `  • State: dp_xdataSent=${dp_xdataSent}, event_count=${eventCount}\n\n`;

    text += `*URL:* ${sourceUrl}\n`;
    text += `*User Agent:* ${ua}\n`;
    text += `*Language:* ${lang}`;

    const payload = { text };

    const base =
      typeof urlForErrors === "string" && urlForErrors
        ? urlForErrors
        : typeof REPORT_URL === "string" && REPORT_URL
        ? REPORT_URL
        : "";
    if (!base) return;

    fetch(base, {
      method: "POST",
      headers: {
        "Content-Type": "application/json",
      },
      body: JSON.stringify(payload),
      mode: "cors",
      keepalive: true,
    }).catch((e) => {
      console.error("Error reporting failed:", e);
    });
  } catch (fatal) {
    console.error("dp_reportError failed:", fatal);
  }
}

function tldToCurrency() {
  var hostname = window.location.hostname;
  var hostnameArray = hostname.split(".");

  var domainName = "";
  var tld = "";
  var currency = "CZK";

  if (hostnameArray.length === 2) {
    domainName = hostnameArray[0];
    tld = hostnameArray[1];
  } else if (hostnameArray.length === 3) {
    domainName = hostnameArray[1];
    tld = hostnameArray[2];
  } else if (hostnameArray.length > 3) {
    domainName = hostnameArray[hostnameArray.length - 2];
    tld = hostnameArray[hostnameArray.length - 1];
  }

  domainName = domainName.toLowerCase();

  if (
    domainName === "nedeto" ||
    domainName === "maluna" ||
    domainName === "trenirkaren"
  ) {
    currency = "CZK";
  } else if (tld === "sk") {
    currency = "EUR";
  } else if (tld === "pl") {
    currency = "PLN";
  } else if (tld === "hu") {
    currency = "HUF";
  }

  return currency;
}

function trimString(stringForTrim) {
  return stringForTrim.replace(/[\n\t]/g, "").trim();
}

function getSpecificCookies() {
  var cookieNames = ["_ga", "_fbp", "_fbc", "d5b8v3a2d7v3", "_gcl_aw"];
  var cookies = [];
  var allCookies = [];

  try {
    allCookies = document?.cookie?.split(";") || [];
  } catch (error) {
    allCookies = [];
  }

  for (var i = 0; i < allCookies.length; i++) {
    var cookie = allCookies[i].trim();
    var parts = cookie.split("=");
    var name = parts[0];
    var value = parts[1] || "";

    if (cookieNames.includes(name)) {
      if (name === "_gcl_aw" && value.split(".").length === 3) {
        cookies.push(name + "=" + value.split(".")[2]);
      } else {
        cookies.push(name + "=" + value);
      }
    }
  }

  return cookies.join("; ");
}

(function dp_checkAndSendAiOverview() {
  try {
    if (!document.referrer?.includes(".google.")) return;

    const entry =
      (typeof performance !== "undefined" &&
        typeof performance.getEntries === "function" &&
        performance.getEntries().length > 0 &&
        performance.getEntries()[0]) ||
      null;
    const currentUrl = (entry && entry.name) || window.location.href;
    const match = currentUrl.match(/#:~:text=([^&]*)/);

    // 3. Pokud je shoda, připravíme a odešleme event
    if (match?.[1]) {
      const aiOverviewText = decodeURIComponent(match[1])
        .normalize("NFD")
        .replace(/[\u0300-\u036f\u2013]/g, "");

      window.index_conversion = window.index_conversion || {};
      window.index_conversion.automatic_event =
        window.index_conversion.automatic_event || [];
      window.index_conversion.automatic_event.push({
        name: "ai_overview",
        ai_overview_text: aiOverviewText,
      });

      dp_xdataSent = false;
      dp_sendData();
    }
  } catch (e) {
    dp_reportError(e, { where: "dp_checkAndSendAiOverview" });
  }

  window.dp_checkAndSendAiOverview = dp_checkAndSendAiOverview;
})();

try {
  (function (history) {
    const originalPushState = history.pushState;
    const originalReplaceState = history.replaceState;

    const handleHistoryChange = (newUrl) => {
      if (!newUrl) return;
      const newAbsoluteUrl = new URL(newUrl, window.location.href).href;

      if (newAbsoluteUrl !== dp_lastTrackedUrl) {
        dp_lastTrackedUrl = newAbsoluteUrl;

        dp_xdataSent = false;
        dp_sendData();
        setTimeout(() => dp_processTransaction(), 500);
      }
    };

    history.pushState = function () {
      handleHistoryChange(arguments[2]);
      return originalPushState.apply(history, arguments);
    };

    history.replaceState = function () {
      handleHistoryChange(arguments[2]);
      return originalReplaceState.apply(history, arguments);
    };

    window.addEventListener("popstate", function () {
      handleHistoryChange(window.location.href);
    });
  })(window.history);
} catch (err) {
  dp_reportError(err, { where: "history.wrapper" });
}

try {
  dp_sendData();

  document.addEventListener("DOMContentLoaded", dp_sendData);
  if (
    typeof window !== "undefined" &&
    typeof window.addEventListener === "function"
  ) {
    window.addEventListener("load", dp_sendData);
    window.addEventListener("beforeunload", dp_sendData);
  }
} catch (err) {
  console.error("Error in try block:", err);
  dp_reportError(err, { where: "event_listeners.wrapper" });
}

(function setupGaCookieWatch() {
  function fallbackDocCookie(note) {
    try {
      const hasGa = /(?:^|;\s*)_ga=/.test(document.cookie || "");
      if (!hasGa)
        console.warn(
          "Cookie '_ga' not found via document.cookie" +
            (note ? " – " + note : "")
        );
    } catch (e) {
      console.warn("document.cookie access failed:", e);
    }
  }

  try {
    const cs = (typeof window !== "undefined" && window.cookieStore) || null;
    if (!cs || typeof cs.get !== "function") {
      fallbackDocCookie("cookieStore not available");
      return;
    }

    const handleChange = (event) => {
      try {
        const changed = (event && event.changed) || [];
        for (let i = 0; i < changed.length; i++) {
          const c = changed[i];
          if (c && c.name === "_ga") {
            dp_xdataSent = false;
            dp_sendData();
            try {
              cs.removeEventListener("change", handleChange);
            } catch (_) {}
            break;
          }
        }
      } catch (e) {
        console.warn("cookieStore change handler error:", e);
      }
    };

    let getPromise;
    try {
      getPromise = cs.get("_ga");
    } catch (syncErr) {
      console.warn("cookieStore.get threw synchronously:", syncErr);
      fallbackDocCookie("cookieStore.get sync error");
      return;
    }

    getPromise
      .then((cookie) => {
        try {
          if (!cookie || !cookie.value) {
            try {
              cs.addEventListener("change", handleChange);
            } catch (e) {
              console.warn("cookieStore.addEventListener failed:", e);
            }
          }
        } catch (e) {
          console.warn("cookieStore then-block failed:", e);
        }
      })
      .catch((err) => {
        console.warn("cookieStore.get rejected:", err);
        fallbackDocCookie("cookieStore.get rejected");
      });
  } catch (blockErr) {
    console.warn("cookieStore block failed:", blockErr);
    fallbackDocCookie("cookieStore block exception");
  }
})();

const transformItemsObject = (itemsArray) => {
  try {
    if (Array.isArray(itemsArray)) {
      let transformedItemsArray = [];
      itemsArray.forEach((item) => {
        let newItem = {};

        if (item.item_brand) {
          newItem.br = item.item_brand;
        }

        if (item.item_id) {
          newItem.id = item.item_id.toString();
        } else if (item.option?.id) {
          newItem.id = String(item.option.id);
        } else if (item.id) {
          newItem.id = String(item.id);
        }

        if (item.item_name || item.title) {
          newItem.nm = item.item_name || item.title;
        }

        if (item.quantity) {
          newItem.qt = item.quantity.toString();
        }

        if (item.price) {
          if (typeof item.price === "object") {
            newItem.pr =
              upgates &&
              upgates.settings &&
              upgates.settings.conversionPricesWithVat &&
              item.price &&
              item.price.withVat
                ? item.price.withVat.toString()
                : item.price && item.price.withoutVat
                ? item.price.withoutVat.toString()
                : "0";
          } else {
            newItem.pr = item.price.toString();
          }
        }

        let count = 1;
        Object.keys(item).forEach((key) => {
          if (key.includes("item_category")) {
            if (count === 1) {
              newItem.ca = item[key];
            } else {
              newItem[`c${count}`] = item[key];
            }
            count++;
          }
        });

        transformedItemsArray.push(newItem);
      });
      return transformedItemsArray;
    }
  } catch (error) {
    dp_reportError(error, { where: "transformItemsObject" });
  }
};

const processShoptetEvents = (item, type) => {
  try {
    if (
      window.dataLayer &&
      Array.isArray(window.dataLayer) &&
      window.dataLayer.length > 0 &&
      window.dataLayer[0] &&
      window.dataLayer[0].shoptet
    ) {
      dp_xdataSent = false;
      index_conversion.automatic_event = [];

      index_conversion.automatic_event.push({
        name: type,
        currency: item[2]?.currency || tldToCurrency(),
        value: item[2]?.value?.toString() || null,
        version: "shoptet",
        customer_type:
          window.dataLayer[0] &&
          window.dataLayer[0].shoptet &&
          window.dataLayer[0].shoptet.customer &&
          window.dataLayer[0].shoptet.customer.groupId
            ? window.dataLayer[0].shoptet.customer.groupId
            : 1,
        items: transformItemsObject(item[2]?.items) || null,
      });

      window.index_conversion.automatic_event.forEach((item) => {
        for (const [key, value] of Object.entries(item)) {
          value === null && delete item[key];
        }
      });

      dp_sendData();
    }
  } catch (error) {
    dp_reportError(error, { where: "processShoptetEvents" });
  }
};

function processGA4DataLayerEvent(eventData) {
  try {
    const eventName = eventData?.event;

    if (!eventName || !dp_eventsToCheck.includes(eventName)) return;

    if (eventName === "purchase") return;

    dp_xdataSent = false;
    index_conversion.automatic_event = [];

    const ecommerce = eventData?.ecommerce || {};

    const transformedItems = (ecommerce?.items || []).map(function (product) {
      const obj = {};
      const categories = [];

      for (const key in product) {
        if (key?.indexOf("item_category") !== -1) {
          categories.push({ key: key, value: product?.[key] });
        }
      }

      for (let k = 0; k < categories.length; k++) {
        const key = k === 0 ? "ca" : "c" + (k + 1);
        obj[key] = categories[k]?.value;
      }

      if (product?.id || product?.item_id) {
        obj.id = String(product?.id || product?.item_id);
      }
      if (product?.name || product?.item_name) {
        obj.nm = trimString(product?.name || product?.item_name);
      }
      if (product?.price !== undefined || product?.item_price !== undefined) {
        obj.pr = String(product?.price ?? product?.item_price);
      }
      if (product?.quantity || product?.item_quantity) {
        obj.qt = String(product?.quantity || product?.item_quantity);
      }
      if (product?.brand || product?.item_brand) {
        obj.br = String(product?.brand || product?.item_brand);
      }
      if (product?.variant || product?.item_variant) {
        obj.va = String(product?.variant || product?.item_variant);
      }
      if (product?.item_list_id) {
        obj.li = String(product.item_list_id);
      }
      if (product?.item_list_name) {
        obj.ln = String(product.item_list_name);
      }
      if (product?.index !== undefined && !isNaN(Number(product.index))) {
        obj.lp = Number(product.index);
      }

      return obj;
    });

    const eventObject = {
      name: eventName,
      version: "dataLayer_GA4",
      currency: ecommerce?.currency || tldToCurrency(),
    };

    if (ecommerce?.value !== undefined) {
      eventObject.value = String(ecommerce?.value);
    }

    switch (eventName) {
      case "view_item_list":
      case "select_item":
        if (ecommerce?.item_list_id) {
          eventObject.item_list_id = String(ecommerce?.item_list_id);
        }
        if (ecommerce?.item_list_name) {
          eventObject.item_list_name = String(ecommerce?.item_list_name);
        }
        break;

      case "view_promotion":
      case "select_promotion":
        if (ecommerce?.promotion_id) {
          eventObject.promotion_id = String(ecommerce?.promotion_id);
        }
        if (ecommerce?.promotion_name) {
          eventObject.promotion_name = String(ecommerce?.promotion_name);
        }
        if (ecommerce?.creative_name) {
          eventObject.creative_name = String(ecommerce?.creative_name);
        }
        if (ecommerce?.creative_slot) {
          eventObject.creative_slot = String(ecommerce?.creative_slot);
        }
        break;

      case "add_payment_info":
        if (ecommerce?.payment_type) {
          eventObject.payment_type = String(ecommerce?.payment_type);
        }
        if (ecommerce?.coupon) {
          eventObject.coupon = String(ecommerce?.coupon);
        }
        break;

      case "add_shipping_info":
        if (ecommerce?.shipping_tier) {
          eventObject.shipping_tier = String(ecommerce?.shipping_tier);
        }
        if (ecommerce?.coupon) {
          eventObject.coupon = String(ecommerce?.coupon);
        }
        break;

      case "begin_checkout":
        if (ecommerce?.coupon) {
          eventObject.coupon = String(ecommerce?.coupon);
        }
        break;

      case "refund":
        if (ecommerce?.transaction_id) {
          eventObject.transaction_id = String(ecommerce.transaction_id);
        }
        if (ecommerce?.affiliation) {
          eventObject.affiliation = String(ecommerce.affiliation);
        }
        if (
          ecommerce?.tax !== undefined &&
          ecommerce.tax !== "" &&
          !isNaN(Number(ecommerce.tax))
        ) {
          eventObject.tax = Number(ecommerce.tax);
        }
        if (
          ecommerce?.shipping !== undefined &&
          ecommerce.shipping !== "" &&
          !isNaN(Number(ecommerce.shipping))
        ) {
          eventObject.shipping = Number(ecommerce.shipping);
        }
        if (
          ecommerce?.value !== undefined &&
          ecommerce.value !== "" &&
          !isNaN(Number(ecommerce.value))
        ) {
          eventObject.value = Number(ecommerce.value);
        }
        if (ecommerce?.currency) {
          eventObject.currency = String(ecommerce.currency);
        }
        break;
    }

    if (transformedItems.length > 0) {
      eventObject.items = transformedItems;
    }

    index_conversion.automatic_event.push(eventObject);

    window.index_conversion.automatic_event.forEach((item) => {
      Object.entries(item).forEach(([key, value]) => {
        if (value === null || value === undefined) delete item[key];
      });
    });

    dp_sendData();
  } catch (error) {
    dp_reportError(error, {
      where: "processGA4DataLayerEvent",
      eventName: eventData?.event,
    });
  }
}

const dp_translateUpgatesEvents = (eventsObject, event) =>
  eventsObject[event] || null;

if (window.upgates && typeof window.upgates === "object") {
  if (upgates && upgates.pageType === "product" && upgates.product) {
    dp_xdataSent = false;
    index_conversion.automatic_event = [];

    const productPrice =
      upgates.settings &&
      upgates.settings.conversionPricesWithVat &&
      upgates.product.price &&
      upgates.product.price.withVat
        ? upgates.product.price.withVat
        : upgates.product.price && upgates.product.price.withoutVat
        ? upgates.product.price.withoutVat
        : 0;

    const productPriceStr =
      upgates.settings &&
      upgates.settings.conversionPricesWithVat &&
      upgates.product.price &&
      upgates.product.price.withVat
        ? String(upgates.product.price.withVat)
        : upgates.product.price && upgates.product.price.withoutVat
        ? String(upgates.product.price.withoutVat)
        : "0";

    index_conversion.automatic_event.push({
      name: "view_item",
      currency: upgates?.currency || tldToCurrency(),
      value: productPrice,
      version: "upgates",
      items: [
        {
          id: String(upgates.product.id),
          nm: trimString(upgates.product.title),
          pr: productPriceStr,
          qt: "1",
          ca:
            upgates.product.category &&
            upgates.product.category.path &&
            upgates.product.category.path[0]
              ? upgates.product.category.path[0]
              : null,
          c2:
            upgates.product.category &&
            upgates.product.category.path &&
            upgates.product.category.path[1]
              ? upgates.product.category.path[1]
              : null,
          c3:
            upgates.product.category &&
            upgates.product.category.path &&
            upgates.product.category.path[2]
              ? upgates.product.category.path[2]
              : null,
          br: upgates.product.manufacturer || null,
        },
      ],
    });

    dp_sendData();
    index_conversion.automatic_event = [];
  }
  Object.keys(dp_eventsForUpgates).forEach((event) => {
    upgates.on(event, (product) => {
      try {
        dp_xdataSent = false;
        index_conversion.automatic_event = [];

        const convertedEvent = dp_translateUpgatesEvents(
          dp_eventsForUpgates,
          event
        );

        if (!convertedEvent) return;

        const value =
          event === "cart.add" || event === "cart.remove"
            ? (upgates &&
              upgates.settings &&
              upgates.settings.conversionPricesWithVat &&
              product &&
              product.price &&
              product.price.withVat
                ? product.price.withVat
                : product && product.price && product.price.withoutVat
                ? product.price.withoutVat
                : 0) * (product && product.quantity ? product.quantity : 1)
            : upgates && upgates.cart && Array.isArray(upgates.cart.products)
            ? upgates.cart.products
                .map(function (product) {
                  return upgates.settings.conversionPricesWithVat
                    ? product.price.withVat
                    : product.price.withoutVat;
                })
                .reduce(function (sum, current) {
                  return sum + current;
                }, 0)
            : 0;

        index_conversion.automatic_event.push({
          name: convertedEvent,
          currency: upgates?.currency || tldToCurrency(),
          value: Number(value).toFixed(2),
          version: "upgates",
          items:
            (event === "cart.add" || event === "cart.remove"
              ? transformItemsObject([product])
              : upgates && upgates.cart && upgates.cart.products
              ? transformItemsObject(upgates.cart.products)
              : []) || [],
        });

        window.index_conversion.automatic_event.forEach((item) => {
          Object.entries(item).forEach(([key, value]) => {
            if (value === null) delete item[key];
          });
        });

        dp_sendData();
        index_conversion.automatic_event = [];
      } catch (error) {
        dp_reportError(error, { where: "upgates.event_handler" });
      }
    });
  });
}

function dp_processTransaction() {
  try {
    if (
      window.index_conversion.automatic_event &&
      window.index_conversion.automatic_event.length > 0 &&
      !window.index_conversion.automatic_event.some(
        (e) => e.name === "form_submit"
      )
    ) {
      return;
    }
    if (dp_dataProcessed) {
      return;
    }
    if (
      !(
        window.index_conversion.transaction_id &&
        window.index_conversion.value &&
        window.index_conversion.currency
      )
    ) {
      if (typeof shoptet !== "undefined") {
        if (
          window.dataLayer &&
          Array.isArray(window.dataLayer) &&
          window.dataLayer.length > 0 &&
          window.dataLayer[0] &&
          window.dataLayer[0].shoptet &&
          window.dataLayer[0].shoptet.pageType === "thankYou"
        ) {
          dp_shopType = "shoptet";
          if (
            window.dataLayer[0].shoptet &&
            window.dataLayer[0].shoptet.order
          ) {
            var items = window.dataLayer[0].shoptet.order.content.map(function (
              item
            ) {
              var categorySplit = item.category.split("|");

              var obj = {
                id: String(item.sku),
                nm: trimString(item.name),
                pr: String(item.price),
                qt: String(item.quantity),
              };

              for (var i = 0; i < categorySplit.length; i++) {
                var trimmedCategory = categorySplit[i].trim();
                if (trimmedCategory) {
                  var key = i === 0 ? "ca" : "c" + (i + 1);
                  obj[key] = trimString(trimmedCategory);
                }
              }

              return obj;
            });

            index_conversion.automatic_event.push({
              name: "purchase",
              currency:
                window.dataLayer[0].shoptet &&
                window.dataLayer[0].shoptet.currency
                  ? window.dataLayer[0].shoptet.currency
                  : tldToCurrency(),
              value: String(window.dataLayer[0].shoptet.order.netto),
              transaction_id: String(window.dataLayer[0].shoptet.order.orderNo),
              version: "shoptet",
              items: items,
            });
          }
        }
      } else if (typeof upgates !== "undefined") {
        if (upgates && upgates.pageType === "order.recieved" && upgates.order) {
          dp_shopType = "upgates";
          var isVAt =
            upgates.settings && upgates.settings.conversionPricesWithVat;

          index_conversion.automatic_event.push({
            name: "purchase",
            currency: upgates.currency || tldToCurrency(),
            transaction_id: String(upgates.order.number),
            version: "upgates",
            value: isVAt
              ? String(
                  upgates.order.prices &&
                    upgates.order.prices.total &&
                    upgates.order.prices.total.withVat
                    ? upgates.order.prices.total.withVat
                    : "0"
                )
              : String(
                  upgates.order.prices &&
                    upgates.order.prices.total &&
                    upgates.order.prices.total.withoutVat
                    ? upgates.order.prices.total.withoutVat
                    : "0"
                ),
            items:
              upgates.order.products && Array.isArray(upgates.order.products)
                ? upgates.order.products.map(function (product) {
                    var categorySplit = product.category?.path || [];

                    var obj = {
                      id: product.option
                        ? String(product.option.id)
                        : String(product.id),
                      nm: trimString(product.title),
                      qt: String(product.quantity),
                    };

                    if (isVAt) {
                      obj.pr = String(product.price.withVat);
                    } else {
                      obj.pr = String(product.price.withoutVat);
                    }

                    for (var i = 0; i < categorySplit.length; i++) {
                      var trimmedCategory = categorySplit[i].trim();
                      if (trimmedCategory) {
                        var key = i === 0 ? "ca" : "c" + (i + 1);
                        obj[key] = trimString(trimmedCategory);
                      }
                    }

                    return obj;
                  })
                : [],
          });
        }
      } else if (
        typeof shoptet === "undefined" &&
        typeof upgates === "undefined" &&
        window.dataLayer &&
        Array.isArray(window.dataLayer)
      ) {
        dp_shopType = "dataLayer_UA";
        var foundPurchase = false;
        var foundDlCH = false;

        for (var i in window.dataLayer) {
          if (
            window.dataLayer[i] &&
            window.dataLayer[i].ecommerce &&
            window.dataLayer[i].ecommerce.purchase
          ) {
            foundPurchase = true;
            let products = window.dataLayer[i].ecommerce.purchase.products;
            if (Array.isArray(products)) {
              var items = products.map(function (product) {
                var categorySplit;
                var trimmedCategory;
                var obj = {};

                function splittingCategories() {
                  for (var i = 0; i < categorySplit.length; i++) {
                    trimmedCategory = categorySplit[i]
                      ? categorySplit[i].trim()
                      : "";
                    if (trimmedCategory) {
                      var key = i === 0 ? "ca" : "c" + (i + 1);
                      obj[key] = trimString(trimmedCategory);
                    }
                  }
                }

                if (typeof product.category === "string") {
                  categorySplit = product.category.split("|");
                  splittingCategories();
                } else if (Array.isArray(product.category)) {
                  categorySplit = product.category;
                  splittingCategories();
                }

                if (product.id || product.item_id) {
                  obj.id = String(product.id || product.item_id);
                }
                if (product.name || product.item_name) {
                  obj.nm = trimString(product.name || product.item_name);
                }
                if (product.price || product.item_price) {
                  obj.pr = String(product.price || product.item_price);
                }
                if (product.quantity || product.item_quantity) {
                  obj.qt = String(product.quantity || product.item_quantity);
                }
                if (product.brand) {
                  obj.br = product.brand;
                }

                return obj;
              });
            }

            let purchaseEvent = {
              name: "purchase",
              currency:
                window.dataLayer[i] &&
                window.dataLayer[i].ecommerce &&
                window.dataLayer[i].ecommerce.purchase &&
                window.dataLayer[i].ecommerce.purchase.actionField &&
                window.dataLayer[i].ecommerce.purchase.actionField.currency
                  ? window.dataLayer[i].ecommerce.purchase.actionField.currency
                  : window.dataLayer[i] &&
                    window.dataLayer[i].ecommerce &&
                    window.dataLayer[i].ecommerce.currencyCode
                  ? window.dataLayer[i].ecommerce.currencyCode
                  : tldToCurrency(),
              transaction_id: String(
                window.dataLayer[i] &&
                  window.dataLayer[i].ecommerce &&
                  window.dataLayer[i].ecommerce.purchase &&
                  window.dataLayer[i].ecommerce.purchase.actionField &&
                  window.dataLayer[i].ecommerce.purchase.actionField.id
                  ? window.dataLayer[i].ecommerce.purchase.actionField.id
                  : ""
              ),
              version: "dataLayer_UA",
              value: String(
                window.dataLayer[i] &&
                  window.dataLayer[i].ecommerce &&
                  window.dataLayer[i].ecommerce.purchase &&
                  window.dataLayer[i].ecommerce.purchase.actionField &&
                  window.dataLayer[i].ecommerce.purchase.actionField.revenue
                  ? window.dataLayer[i].ecommerce.purchase.actionField.revenue
                  : "0"
              ),
              items: items || [],
            };

            if (
              window.dataLayer[i] &&
              window.dataLayer[i].ecommerce &&
              window.dataLayer[i].ecommerce.purchase &&
              window.dataLayer[i].ecommerce.purchase.actionField &&
              window.dataLayer[i].ecommerce.purchase.actionField.profit
            ) {
              purchaseEvent.order_profit = String(
                Number(
                  window.dataLayer[i].ecommerce.purchase.actionField.profit
                ).toFixed(2)
              );
            }

            index_conversion.automatic_event.push(purchaseEvent);
          } else if (
            window.dataLayer &&
            window.dataLayer[i] &&
            window.dataLayer[i].transactionId
          ) {
            dp_shopType = "dataLayer_CH";
            foundDlCH = true;
            var items =
              window.dataLayer[i].transactionProducts &&
              Array.isArray(window.dataLayer[i].transactionProducts)
                ? window.dataLayer[i].transactionProducts.map(function (
                    product
                  ) {
                    var obj = {};

                    if (product.sku) {
                      obj.id = String(product.sku);
                    } else if (product.id || product.item_id) {
                      obj.id = String(product.id || product.item_id);
                    }
                    if (product.name || product.item_name) {
                      obj.nm = trimString(product.name || product.item_name);
                    }

                    if (product.price || product.item_price) {
                      obj.pr = String(product.price || product.item_price);
                    }
                    if (product.price == 0 || product.item_price == 0) {
                      obj.pr = "0";
                    }

                    if (product.quantity || product.item_quantity) {
                      obj.qt = String(
                        product.quantity || product.item_quantity
                      );
                    }

                    if (product.category) {
                      var categorySplit;

                      if (product.category.indexOf("->") !== -1) {
                        categorySplit = product.category.split("->");
                      } else if (product.category.indexOf("|") !== -1) {
                        categorySplit = product.category.split("|");
                      } else if (product.category.indexOf(">") !== -1) {
                        categorySplit = product.category.split(">");
                      } else {
                        categorySplit = [product.category];
                      }

                      for (var i = 0; i < categorySplit.length; i++) {
                        var trimmedCategory = categorySplit[i].trim();
                        if (trimmedCategory) {
                          var key = i === 0 ? "ca" : "c" + (i + 1);
                          obj[key] = trimString(trimmedCategory);
                        }
                      }
                    }

                    if (product.brand || product.item_brand) {
                      obj.br = String(product.brand || product.item_brand);
                    }

                    return obj;
                  })
                : [];

            let purchaseEvent = {
              name: "purchase",
              currency:
                window.dataLayer[i] && window.dataLayer[i].transactionCurrency
                  ? window.dataLayer[i].transactionCurrency
                  : tldToCurrency(),
              version: "dataLayer_CH",
              value: String(
                window.dataLayer[i] && window.dataLayer[i].transactionTotal
                  ? window.dataLayer[i].transactionTotal
                  : "0"
              ),
              transaction_id: String(
                window.dataLayer[i] && window.dataLayer[i].transactionId
                  ? window.dataLayer[i].transactionId
                  : ""
              ),
              items: items,
            };

            if (window.dataLayer[i] && window.dataLayer[i].transactionFee) {
              purchaseEvent.order_profit = String(
                Number(window.dataLayer[i].transactionFee).toFixed(2)
              );
            }

            index_conversion.automatic_event.push(purchaseEvent);
          } else if (
            window.dataLayer &&
            window.dataLayer[i] &&
            (window.dataLayer[i].ecommerce || window.dataLayer[i].items) &&
            (window.dataLayer[i].event === "purchase" ||
              window.dataLayer[i].event === "purchase_stape") &&
            !foundDlCH
          ) {
            dp_shopType = "dataLayer_GA4";
            foundPurchase = true;

            if (!window.dataLayer[i].ecommerce) {
              window.dataLayer[i].ecommerce = {};
              window.dataLayer[i].ecommerce.transaction_id =
                window.dataLayer[i].transaction_id;
              window.dataLayer[i].ecommerce.value = window.dataLayer[i].value;
              window.dataLayer[i].ecommerce.items = window.dataLayer[i].items;
              window.dataLayer[i].ecommerce.currency =
                window.dataLayer[i].currency;
            }

            var items =
              window.dataLayer[i] &&
              window.dataLayer[i].ecommerce &&
              window.dataLayer[i].ecommerce.items &&
              Array.isArray(window.dataLayer[i].ecommerce.items)
                ? window.dataLayer[i].ecommerce.items.map(function (product) {
                    var obj = {};
                    var categories = [];

                    for (var key in product) {
                      if (key.indexOf("item_category") !== -1) {
                        categories.push({ key: key, value: product[key] });
                      }
                    }

                    for (var k = 0; k < categories.length; k++) {
                      var key = k === 0 ? "ca" : "c" + (k + 1);
                      obj[key] = categories[k].value;
                    }

                    if (product?.id || product?.item_id) {
                      obj.id = String(product.id || product.item_id);
                    }
                    if (product?.name || product?.item_name) {
                      obj.nm = trimString(product.name || product.item_name);
                    }
                    if (product?.price || product?.item_price) {
                      obj.pr = String(product.price || product.item_price);
                    }
                    if (product?.quantity || product?.item_quantity) {
                      obj.qt = String(
                        product.quantity || product.item_quantity
                      );
                    }
                    if (product?.brand || product?.item_brand) {
                      obj.br = String(product.brand || product.item_brand);
                    }
                    if (product?.item_profit) {
                      obj.ip = String(Number(product.item_profit).toFixed(2));
                    }

                    return obj;
                  })
                : [];

            let purchaseEvent = {
              name: "purchase",
              currency:
                window.dataLayer[i] &&
                window.dataLayer[i].ecommerce &&
                window.dataLayer[i].ecommerce.currency
                  ? window.dataLayer[i].ecommerce.currency
                  : tldToCurrency(),
              transaction_id: String(
                window.dataLayer[i] &&
                  window.dataLayer[i].ecommerce &&
                  window.dataLayer[i].ecommerce.transaction_id
                  ? window.dataLayer[i].ecommerce.transaction_id
                  : ""
              ),
              version: "dataLayer_GA4",
              value: String(
                window.dataLayer[i] &&
                  window.dataLayer[i].ecommerce &&
                  window.dataLayer[i].ecommerce.value
                  ? window.dataLayer[i].ecommerce.value
                  : "0"
              ),
              items: items,
            };

            if (
              window.dataLayer[i] &&
              window.dataLayer[i].ecommerce &&
              window.dataLayer[i].ecommerce.profit
            ) {
              purchaseEvent.order_profit = String(
                Number(window.dataLayer[i].ecommerce.profit).toFixed(2)
              );
            }

            index_conversion.automatic_event.push(purchaseEvent);
          }
        }

        if (window.dataLayer && !foundPurchase && !foundDlCH) {
          dp_shopType = "gtag";
          outerLoop: for (var i in window.dataLayer) {
            for (var j in window.dataLayer[i]) {
              if (
                window.dataLayer[i][j] === "purchase" &&
                window.dataLayer[i][+j + 1] &&
                window.dataLayer[i][+j + 1].transaction_id
              ) {
                var order = window.dataLayer[i][+j + 1];

                var items =
                  order.items && Array.isArray(order.items)
                    ? order.items.map(function (item) {
                        var obj = {};
                        var categories = [];

                        var category = item.category || item.item_category;

                        if (category && category.indexOf("|") !== -1) {
                          var categorySplit = category.split("|");

                          for (var i = 0; i < categorySplit.length; i++) {
                            var trimmedCategory = categorySplit[i].trim();
                            if (trimmedCategory) {
                              var key = i === 0 ? "ca" : "c" + (i + 1);
                              obj[key] = trimmedCategory;
                            }
                          }
                        } else if (category) {
                          for (var key in item) {
                            if (
                              key.indexOf("item_category") === 0 ||
                              key.indexOf("category") === 0
                            ) {
                              categories.push(item[key]);

                              for (var k = 0; k < categories.length; k++) {
                                var key = k === 0 ? "ca" : "c" + (k + 1);
                                obj[key] = trimString(categories[k]);
                              }
                            }
                          }
                        }

                        if (item.id || item.item_id) {
                          obj.id = String(item.id || item.item_id);
                        }

                        if (item.name || item.item_name) {
                          obj.nm = trimString(item.name || item.item_name);
                        }

                        if (item.price) {
                          obj.pr = String(item.price);
                        }

                        if (item.quantity) {
                          obj.qt = String(item.quantity);
                        }

                        return obj;
                      })
                    : [];

                index_conversion.automatic_event.push({
                  name: "purchase",
                  currency: order.currency || tldToCurrency(),
                  version: "gtag",
                  value: String(Number(order.value || 0).toFixed(2)),
                  tax: String(Number(order.tax || 0).toFixed(2)),
                  shipping: String(order.shipping || "0"),
                  transaction_id: String(order.transaction_id || ""),
                  items: items,
                });

                break outerLoop;
              }
            }
          }
        }
      }
    }
    if (
      window.index_conversion.automatic_event &&
      window.index_conversion.automatic_event.length > 0
    ) {
      dp_xdataSent = false;
      dp_sendData();
      dp_dataProcessed = true;
    }
  } catch (err) {
    dp_reportError(err, {
      where: "dp_processTransaction",
      shopType: dp_shopType,
      location: window.location.href,
    });
  }
}

dp_processTransaction();

document.addEventListener("DOMContentLoaded", function () {
  setTimeout(function () {
    dp_processTransaction();
  }, 100);
});

if (
  typeof window !== "undefined" &&
  typeof window.addEventListener === "function"
) {
  window.addEventListener("load", dp_processTransaction);
}

document.addEventListener("DOMContentLoaded", function () {
  var forms = document.querySelectorAll("form");
  for (var i = 0; i < forms.length; i++) {
    forms[i].addEventListener("submit", function (event) {
      if (
        window.index_conversion.automatic_event.some(
          (item) => item?.name === "purchase"
        ) === false
      ) {
        window.index_conversion.automatic_event = [];
      }
      window.index_conversion.automatic_event.push({
        name: "form_submit",
      });
      dp_xdataSent = false;
      dp_sendData();
    });
  }
});

(function (dp_eventsToCheck) {
  window.dataLayer = window.dataLayer || [];

  const originalDataLayer = window.dataLayer;
  originalDataLayer.forEach((item) => {
    // Shoptet eventy
    if (
      dp_eventsToCheck.includes(item?.[1]) &&
      item?.[2]?.send_to?.toLowerCase() === "ga4"
    ) {
      processShoptetEvents(item, item[1]);
    }

    // GA4 dataLayer eventy
    if (item?.event && dp_eventsToCheck.includes(item?.event)) {
      processGA4DataLayerEvent(item);
    }
  });

  const originalPush = window.dataLayer.push;

  window.dataLayer.push = function (...args) {
    args.forEach((item) => {
      if (item?.event === "purchase") {
        dp_processTransaction();
      }

      // Shoptet eventy
      if (item?.[2]?.send_to?.toLowerCase() === "ga4") {
        if (dp_eventsToCheck.includes(item?.[1])) {
          processShoptetEvents(item, item[1]);
        }
      }

      // GA4 dataLayer eventy
      if (item?.event && dp_eventsToCheck.includes(item?.event)) {
        processGA4DataLayerEvent(item);
      }
    });

    return originalPush.apply(this, args);
  };
})(dp_eventsToCheck);
