const GTM_ID = 'MWH6SD98'; //from settings tag
const GTM_URL = 'https://load.metrics.modusbrand.com'; //from settings tag

const sandbox_events = ['payment_info_submitted', 'checkout_started', 'checkout_shipping_info_submitted', 'checkout_contact_info_submitted', 'checkout_completed' ];

const event_name = {"page_viewed":"page_view_stape","payment_info_submitted":"add_payment_info_stape","checkout_started":"begin_checkout_stape","checkout_shipping_info_submitted":"add_shipping_info_stape","checkout_contact_info_submitted":"add_contact_info_stape","checkout_completed":"purchase_stape","alert_displayed":"alert_displayed_stape","ui_extension_errored":"ui_extension_errored_stape"};

const isLog = undefined;

const useMultyMarkets = false
let isInsertGTM = false

const href = window.initContext?.context?.document?.location?.href || "";
const isCheckoutPage = href.includes("/checkouts");
const canSubscribe = window.analytics && typeof window.analytics.subscribe === "function";

let customerShopStape = {}

try {
  customerShopStape = JSON.parse(window.localStorage.getItem('customerShopStape')) || {}
} catch (e) {}

const clearObj = (obj = {}) =>
  Object.fromEntries(
    Object.entries(obj).filter(([_, value]) => value !== null && value !== undefined && value !== '')
  );

function extractMarketData(event) {
  const marketData =
    event.data?.checkout?.localization?.market ??
    event.data?.localization?.market ?? null;

  return {
    id: marketData?.id?.split("/").pop() ?? null,
    handle: marketData?.handle ?? null,
  };
}

function prepareDataLayerObject(event, eventName) {
  if (isLog) {
    console.log('event', event)
  }

  const ecomm_pagetype = getPageType();
  const ecom = parseEcomParams(event);
  ecom.items = parseItems(event);
  const userData = parseUserData(event);
  const cart_state = getCart(window.initContext?.data?.cart || {});
  const market = extractMarketData(event);

  let obj = {
    event: event_name[eventName],
    user_data: clearObj(userData),
    cart_state,
    ecomm_pagetype,
    actual_url: href,
  };


  if ([
    'checkout_completed',
    'payment_info_submitted',
    'checkout_started',
    'checkout_shipping_info_submitted',
    'checkout_contact_info_submitted'
  ].includes(eventName)) {
    obj.checkout_token = event?.data?.checkout?.token
  }

  if (['checkout_completed'].includes(eventName)) {
    if (obj?.user_data) {
      obj.user_data.customer_lifetime_value =  Number(
        (
          (Number(customerShopStape?.total_spent) || 0) +
          (Number(event?.data?.checkout?.totalPrice?.amount) || 0)
        ).toFixed(2)
      );
    }
  }

  if ([
    'checkout_completed',
    'payment_info_submitted',
    'checkout_started',
    'checkout_shipping_info_submitted',
    'checkout_contact_info_submitted'
  ].includes(eventName)) {
    obj.delivery = getDelivery(event)
  }

  if (['checkout_completed', 'payment_info_submitted'].includes(eventName)) {
    ecom.payment_type = event?.data?.checkout?.transactions?.[0]?.paymentMethod?.type;
  }
  if (['alert_displayed', 'ui_extension_errored'].includes(eventName)) {
    // delete obj.ecommerce;
    // delete obj.cart_state;
    obj = { ...obj, ...(event?.data?.alert || {}) }
  }

  if (eventName != 'page_viewed') obj.ecommerce = ecom;
  if (market.id) obj.market_id = market.id;
  if (market.handle) obj.market_handle = market.handle;

  return obj;
}

function handleAnalyticsEvent(event) {
  const eventName = event.name;
  const isPageViewed = eventName === "page_viewed";

  const data = prepareDataLayerObject(event, eventName);
  if (isLog) {
    console.log('Send event data', data)
  }
  const pushData = () => {
    if (isCheckoutPage) {
      // Checkout page: push everything to dataLayer
      window.dataLayer = window.dataLayer || [];
      window.dataLayer.push(data);
    } else if (isPageViewed) {
      // Non-checkout: only page_viewed goes to parent
      window.parent.postMessage(data, location.origin);
    }
    // No push for other events outside checkout
  };

  setTimeout(pushData, 500);
}

if (canSubscribe) {

  // Checkout-specific sandbox events (excluding page_viewed)
  if (isCheckoutPage) {
    if (!useMultyMarkets) {
      loadGTM();
    }

    window.analytics.subscribe("all_standard_events", (event) => {
      const marketId = event?.data?.checkout?.localization?.market?.id
      if(useMultyMarkets && marketId){
        loadGTM(marketId);
      }
      if (sandbox_events.includes(event.name) || event.name == 'page_viewed') {
        handleAnalyticsEvent(event);
      }
    });
  } else {
    // Always subscribe to page_viewed
    window.analytics.subscribe("page_viewed", (event) => {
      handleAnalyticsEvent(event);
    });
  }
}

function getPageType() {

  let path = window.initContext?.context?.document?.location?.pathname;

  if (path.includes('/collection')) { return 'category'; }
  else if (path.includes('/product')) { return 'product'; }
  else if (path.includes('/cart')) { return 'basket'; }
  else if (path === '/') { return 'home'; }
  else if (path.includes('thank_you') || path.includes('thank-you')) { return 'purchase'; }
  else if (path.includes('/checkout')) { return 'basket'; }
  else { return 'other'; }

}

function loadGTM(key) {
  
      if(isInsertGTM) return;
      isInsertGTM = true;
      switch (key) {
        
      
        default:
          !function(){"use strict";function l(e){for(var t=e,r=0,n=document.cookie.split(";");r<n.length;r++){var o=n[r].split("=");if(o[0].trim()===t)return o[1]}}function s(e){return localStorage.getItem(e)}function u(e){return window[e]}function A(e,t){e=document.querySelector(e);return t?null==e?void 0:e.getAttribute(t):null==e?void 0:e.textContent}var e=window,t=document,r="script",n="dataLayer",o="https://metrics.modusbrand.com",a="https://load.metrics.modusbrand.com",i="5cewslshp",c="45fxy=GQxOKyc6SC4nIEU%2FN05dRQZVQUJCUQENTQUcCAYEBxERBhdCEBgI",g="jsVariable",v="_sbp",E="",d=!1;try{var d=!!g&&(m=navigator.userAgent,!!(m=new RegExp("Version/([0-9._]+)(.*Mobile)?.*Safari.*").exec(m)))&&16.4<=parseFloat(m[1]),f="stapeUserId"===g,I=d&&!f?function(e,t,r){void 0===t&&(t="");var n={cookie:l,localStorage:s,jsVariable:u,cssSelector:A},t=Array.isArray(t)?t:[t];if(e&&n[e])for(var o=n[e],a=0,i=t;a<i.length;a++){var c=i[a],c=r?o(c,r):o(c);if(c)return c}else console.warn("invalid uid source",e)}(g,v,E):void 0;d=d&&(!!I||f)}catch(e){console.error(e)}var m=e,g=(m[n]=m[n]||[],m[n].push({"gtm.start":(new Date).getTime(),event:"gtm.js"}),t.getElementsByTagName(r)[0]),v=I?"&bi="+encodeURIComponent(I):"",E=t.createElement(r),f=(d&&(i=8<i.length?i.replace(/([a-z]{8}$)/,"kp$1"):"kp"+i),!d&&a?a:o);E.async=!0,E.src=f+"/"+i+".js?"+c+v,null!=(e=g.parentNode)&&e.insertBefore(E,g)}();
          break;
      }
    
}


function parseItems(event) {

  let items = [];

  if (event.data?.checkout?.lineItems) {
    for (let i = 0; i < event.data.checkout.lineItems.length; i++) {
      const lineItem = event.data.checkout.lineItems[i];
      const sellingPlanAllocation = lineItem.sellingPlanAllocation;

      const item = {
        item_id: lineItem.variant.product.id,
        item_sku: lineItem.variant.sku,
        item_variant: lineItem.variant.id,
        item_name: lineItem.variant.product.title,
        variant_name: lineItem.variant.title,
        item_category: lineItem.variant.product.type,
        item_brand: lineItem.variant.product.vendor,
        item_url: lineItem.variant.product?.url,
        price: lineItem.variant.price.amount,
        imageURL: lineItem?.variant?.image?.src,
        discount: lineItem.discountAllocations[0]?.amount?.amount || null,
        quantity: lineItem.quantity,
        index: i + 1,
      };

      if (sellingPlanAllocation && sellingPlanAllocation.sellingPlan?.id) {
        const { id, name } = sellingPlanAllocation.sellingPlan;
        if (id) {
          const sellingPlanId = id.split('/').pop();
          if (sellingPlanId) {
            item.item_selling_plan_id = sellingPlanId;
          }
        }
        if (name) {
          const sellingPlanName = name || null;
          if (sellingPlanName) {
            item.item_selling_plan_name = sellingPlanName;
          }
        }
      }

      items.push(item);
    }
  }

  if (event.data?.cartLine?.merchandise) {
    items.push({
      'item_id': event.data.cartLine.merchandise.product.id,
      'item_sku': event.data.cartLine.merchandise.sku,
      'item_variant': event.data.cartLine.merchandise.id,
      'item_name': event.data.cartLine.merchandise.product.title,
      'variant_name': event.data.cartLine.merchandise.title,
      'item_category': event.data.cartLine.merchandise.product.type,
      'item_brand': event.data.cartLine.merchandise.product.vendor,
      'item_url': event.data.cartLine.merchandise.product?.url,
      'price': event.data.cartLine.merchandise.price.amount,
      'imageURL': event.data.cartLine.merchandise?.image?.src,
      'quantity': event.data.cartLine.quantity
    });
  }

  if (event.data?.productVariant) {
    items.push({
      'item_id': event.data.productVariant.product.id,
      'item_sku': event.data.productVariant.sku,
      'item_variant': event.data.productVariant.id,
      'item_name': event.data.productVariant.product.title,
      'variant_name': event.data.productVariant.title,      
      'item_category': event.data.productVariant.product.type,
      'price': event.data.productVariant.price.amount,
      'item_brand': event.data.productVariant.product.vendor,
      'imageURL': event.data.productVariant?.image?.src,
      'item_url': event.data.productVariant?.product?.url,
      'quantity': '1'
    });
  }

  if (event.data?.collection?.productVariants) {
    for (let i = 0; i < event.data?.collection?.productVariants.length; i++) {
      const variant = event.data.collection.productVariants[i];
      items.push({
        item_id: variant.product.id,
        item_sku: variant.sku,
        item_variant: variant.id,
        item_name: variant.product.title,
        variant_name: variant.title,
        item_category: variant.product.type,
        item_brand: variant.product.vendor,
        price: variant.price.amount,
        imageURL: variant?.image?.src,
        item_url: variant?.product?.url,
        index: i + 1,
      });
    }
  }

  // Parse search result product variants
  if (event.data?.searchResult?.productVariants) {
    for (let i = 0; i < event.data.searchResult.productVariants.length; i++) {
      const variant = event.data.searchResult.productVariants[i];
      items.push({
        item_id: variant.product.id,
        item_sku: variant.sku,
        item_variant: variant.id,
        item_name: variant.product.title,
        variant_name: variant.title,
        item_category: variant.product.type,
        item_brand: variant.product.vendor,
        price: variant.price.amount,
        imageURL: variant?.image?.src,
        item_url: variant?.product?.url,
        index: i + 1,
      });
    }
  }

  if (event.data?.cart?.lines) {
    for (let i = 0; i < event.data.cart.lines.length; i++) {
      const line = event.data.cart.lines[i];
      items.push({
        item_id: line.merchandise.product.id,
        item_sku: line.merchandise.sku,
        item_variant: line.merchandise.id,
        item_name: line.merchandise.product.title,
        variant_name: line.merchandise.title,
        item_category: line.merchandise.product.type,
        item_brand: line.merchandise.product.vendor,
        item_url: line.merchandise?.product?.url,
        price: line.merchandise.price.amount,
        imageURL: line.merchandise?.image?.src,
        quantity: line.quantity,
        index: i + 1,
      });
    }
  }
  
  try {
    if(window?.productShopStape){
      for (let index = 0; index < items.length; index++) {
        const item = items[index];
        window?.productShopStape?.variants.forEach(variant => {
          if(variant?.id == item?.item_variant && variant?.compare_at_price){
            items[index].compare_at_price = (variant.compare_at_price/100)  + ''
          }
        });
      }
    }

    if(window?.collectionShopStape){
      for (let index = 0; index < items.length; index++) {
        const item = items[index];
        window?.collectionShopStape?.products?.forEach(product => {
          product?.variants?.forEach(variant => {
            if(variant?.id == item?.item_variant && variant?.compare_at_price){
              items[index].compare_at_price = variant.compare_at_price + ''
            }
          });
        })
      }
    }

    if(localStorage && localStorage?.getItem('addedProductStape')){
      let addedProductStape = [];
      try {
        if(localStorage.getItem('addedProductStape')){
          addedProductStape = JSON.parse(localStorage.getItem('addedProductStape')) || []
        }
      } catch (error) {}

      for (let index = 0; index < items.length; index++) {
        const item = items[index];
        addedProductStape.forEach(_i => {
          if(_i?.item_variant == item?.item_variant && _i.compare_at_price){
            items[index].compare_at_price = _i.compare_at_price + ''
          }
        });
      }
    }
  } catch (error) {}

  return items;
}



function parseEcomParams(event) {
    
  let ecom = {};

  if (event?.data?.checkout?.totalPrice?.hasOwnProperty('amount')) {
    ecom.value = event?.data?.checkout?.totalPrice?.amount?.toString();
    ecom.cart_total = event?.data?.checkout?.totalPrice?.amount?.toString();
    ecom.currency = event?.data?.checkout?.totalPrice?.currencyCode;
    ecom.cart_quantity = event?.data?.checkout?.lineItems?.length;
  }

  if (event.name == "checkout_completed") {
    ecom.tax = event?.data?.checkout?.totalTax?.amount;
    ecom.shipping = event?.data?.checkout?.shippingLine?.price?.amount;
    ecom.transaction_id = event?.data?.checkout?.order?.id;
    ecom.coupon = event?.data?.checkout?.discountApplications[0]?.title;
    ecom.discount = event?.data?.checkout?.discountApplications[0]?.title;
    ecom.discount_amount = event?.data?.checkout?.discountApplications[0]?.value?.amount;
    ecom.discount_percentage = event?.data?.checkout?.discountApplications[0]?.value?.percentage;
    ecom.sub_total = event?.data?.checkout?.subtotalPrice?.amount;
  }

  if (event.name == "collection_viewed") {
    ecom.collection_id = event?.data?.collection?.id + '';
    ecom.item_list_id = event?.data?.collection?.id + '';
    ecom.item_list_name = event?.data?.collection?.title;
    ecom.currency = event?.data?.collection?.productVariants[0]?.price?.currencyCode;
  }

  if (event.name == "search_submitted") {
    ecom.search_term = event?.data?.searchResult?.query;
    ecom.currency = event?.data?.searchResult?.productVariants[0]?.price?.currencyCode;
  }

  if (event.name == "cart_viewed") {
    ecom.value = event?.data?.cart?.cost?.totalAmount?.amount?.toString();
    ecom.currency = event?.data?.cart?.cost?.totalAmount?.currencyCode;
  }

  if (event.name == "product_viewed") {
    ecom.value = event?.data?.productVariant?.price?.amount?.toString();
    ecom.currency = event?.data?.productVariant?.price?.currencyCode;
  }

  if (event.name == "product_added_to_cart") {
    ecom.value = (event?.data?.cartLine?.cost?.totalAmount?.amount * 1).toFixed(2);
    ecom.currency = event?.data?.cartLine?.cost?.totalAmount?.currencyCode;
  }

  if (event.name == "product_removed_from_cart") {
    ecom.value = (event?.data?.cartLine?.cost?.totalAmount?.amount*1).toFixed(2);
    ecom.currency = event?.data?.cartLine?.cost?.totalAmount?.currencyCode;
  }

  return ecom;

};



function getCart(cart = {}) {
    const tmp = {
      cart_id: cart.id || null,
      cart_quantity: cart.totalQuantity || 0, 
      cart_value: cart.cost?.totalAmount?.amount || 0,
      currency: cart.cost?.totalAmount?.currencyCode,
      lines: (cart.lines || []).map(_i => ({
        item_variant: _i.merchandise.id,
        item_id: _i.merchandise.product.id,
        item_sku:        _i.merchandise.sku,
        item_name:      _i.merchandise.product.title,
        quantity:        _i.quantity,
        line_total_price:  _i.cost.totalAmount.amount,
        price:  _i.merchandise.price.amount,
      }))

    }
    return tmp;
}



function getDelivery(event) {
  const data = {}

  const shippingAmount = event?.data?.checkout?.delivery?.selectedDeliveryOptions[0]?.cost?.amount || 0;
  const costAfterDiscounts = event?.data?.checkout?.delivery?.selectedDeliveryOptions[0]?.costAfterDiscounts?.amount || 0

  data.shipping_tier = event?.data?.checkout?.delivery?.selectedDeliveryOptions[0]?.title || '';
  data.shipping_amount = shippingAmount;
  data.currency = event?.data?.checkout?.delivery?.selectedDeliveryOptions[0]?.cost?.currencyCode;
  data.address_province_code = event?.data?.checkout?.shippingAddress?.provinceCode ? event?.data?.checkout.shippingAddress.provinceCode : null;
  data.address_zip = event?.data?.checkout?.shippingAddress?.zip ? event?.data?.checkout.shippingAddress.zip : null;
  data.delivery_method_type = event?.data?.checkout?.delivery?.selectedDeliveryOptions[0]?.type || "shipping";
  data.shipping_discount_amount = shippingAmount - costAfterDiscounts;

  return data
}



function gtmEvent(event){}

function parseUserData(event) {
  let userData = {};

  userData.first_name = event.data?.checkout?.billingAddress?.firstName ? event.data.checkout.billingAddress.firstName : event.data?.checkout?.shippingAddress?.firstName ? event.data.checkout.shippingAddress.firstName : window.initContext?.data?.customer?.firstName ? window.initContext.data.customer.firstName : null;
  userData.last_name = event.data?.checkout?.billingAddress?.lastName ? event.data.checkout.billingAddress.lastName : event.data?.checkout?.shippingAddress?.lastName ? event.data.checkout.shippingAddress.lastName : window.initContext?.data?.customer?.lastName ? window.initContext.data.customer.lastName : null;
  userData.email = event.data?.checkout?.email ? event.data.checkout.email : window.initContext?.data?.customer?.email ? window.initContext.data.customer.email : null;
  userData.phone = event.data?.checkout?.billingAddress?.phone ? event.data.checkout.billingAddress.phone : event.data?.checkout?.shippingAddress?.phone ? event.data.checkout.shippingAddress.phone : window.initContext?.data?.customer?.phone ? window.initContext.data.customer.phone : null;
  userData.city = event.data?.checkout?.billingAddress?.city ? event.data.checkout.billingAddress.city : event.data?.checkout?.shippingAddress?.city ? event.data.checkout.shippingAddress.city : null;
  userData.country = event.data?.checkout?.billingAddress?.countryCode ? event.data.checkout.billingAddress.countryCode : event.data?.checkout?.shippingAddress?.countryCode ? event.data.checkout.shippingAddress.countryCode : null;
  userData.zip = event.data?.checkout?.billingAddress?.zip ? event.data.checkout.billingAddress.zip : event.data?.checkout?.shippingAddress?.zip ? event.data.checkout.shippingAddress.zip : null;
  userData.region = event.data?.checkout?.billingAddress?.provinceCode ? event.data.checkout.billingAddress.provinceCode : event.data?.checkout?.shippingAddress?.provinceCode ? event.data.checkout.shippingAddress.provinceCode : null;
  userData.street = event.data?.checkout?.billingAddress?.address1 ? event.data.checkout.billingAddress.address1 : event.data?.checkout?.shippingAddress?.address1 ? event.data.checkout.shippingAddress.address1 : null;
  userData.customer_id = window.initContext?.data?.customer?.id || event?.data?.checkout?.order?.customer?.id ? window?.initContext?.data?.customer?.id || event?.data?.checkout?.order?.customer?.id : null;
  // userData.lifetime_orders = window.initContext?.data?.customer?.ordersCount ? window.initContext.data.customer.ordersCount : 0;
  userData.new_customer = event?.data?.checkout?.order?.customer?.isFirstOrder;

  userData.shopify_client_id = event?.clientId;

  return userData;
}
