// Shopify Web Pixel Extension for Meta Commerce & Pixel Con
// Handles standard customer events, deterministic event_id generation, and CAPI forwarding

declare const analytics: {
  subscribe: (eventName: string, callback: (event: any) => void) => void;
};

declare const browser: {
  cookie: {
    get: (name: string) => Promise<string | null>;
  };
};

function generateEventId(eventName: string, idHint?: string): string {
  const ts = Date.now();
  const rand = Math.random().toString(36).substring(2, 8);
  return `meta_${eventName.toLowerCase()}_${idHint || 'anon'}_${ts}_${rand}`;
}

async function sendCapiEvent(eventName: string, eventId: string, eventData: any) {
  try {
    const fbp = await browser.cookie.get('_fbp');
    const fbc = await browser.cookie.get('_fbc');

    await fetch('/apps/meta-commerce-pixel-con/api/capi/events', {
      method: 'POST',
      headers: { 'Content-Type': 'application/json' },
      body: JSON.stringify({
        eventName,
        eventId,
        eventSourceUrl: eventData?.context?.document?.location?.href || '',
        fbp,
        fbc,
        data: eventData,
      }),
      keepalive: true,
    });
  } catch (err) {
    // Fail silently in storefront
  }
}

// 1. PageView
analytics.subscribe('page_viewed', (event) => {
  const eventId = generateEventId('pageview');
  sendCapiEvent('PageView', eventId, event);
});

// 2. ViewContent
analytics.subscribe('product_viewed', (event) => {
  const productId = event?.data?.productVariant?.product?.id;
  const eventId = generateEventId('viewcontent', productId);
  sendCapiEvent('ViewContent', eventId, event);
});

// 3. AddToCart
analytics.subscribe('product_added_to_cart', (event) => {
  const lineId = event?.data?.cartLine?.merchandise?.id;
  const eventId = generateEventId('addtocart', lineId);
  sendCapiEvent('AddToCart', eventId, event);
});

// 4. InitiateCheckout
analytics.subscribe('checkout_started', (event) => {
  const token = event?.data?.checkout?.token;
  const eventId = generateEventId('initiatecheckout', token);
  sendCapiEvent('InitiateCheckout', eventId, event);
});

// 5. Purchase
analytics.subscribe('checkout_completed', (event) => {
  const orderId = event?.data?.checkout?.order?.id || event?.data?.checkout?.token;
  const eventId = generateEventId('purchase', orderId);
  sendCapiEvent('Purchase', eventId, event);
});
