---
import VercelAnalytics from "@vercel/analytics/astro";

// Analytics scripts injected into <head>. PostHog and custom providers use the
// inline-snippet house style (banner/theme/JSON-LD); Vercel uses its official
// Astro component. Loads ONLY in production builds so `blume dev` stays clean
// and local traffic never reaches your analytics.
interface AnalyticsScript {
  attributes?: Record<string, string>;
  content?: string;
  src?: string;
  strategy?: "async" | "defer";
}

interface Props {
  analytics?: {
    posthog?: { host?: string; key: string };
    scripts?: AnalyticsScript[];
    vercel?: boolean;
  } | null;
}

const { analytics } = Astro.props;
const enabled = import.meta.env.PROD && Boolean(analytics);

// Vercel Web Analytics: rendered via the official @vercel/analytics/astro
// component, which injects the first-party script Vercel serves at
// /_vercel/insights once Web Analytics is enabled for the project.
const vercelEnabled = enabled && analytics?.vercel === true;

// PostHog: the official array.js loader snippet, keyed off config. The host
// defaults to PostHog Cloud US; EU/self-hosted users override `posthog.host`.
const POSTHOG_LOADER =
  '!function(t,e){var o,n,p,r;e.__SV||(window.posthog=e,e._i=[],e.init=function(i,s,a){function g(t,e){var o=e.split(".");2==o.length&&(t=t[o[0]],e=o[1]),t[e]=function(){t.push([e].concat(Array.prototype.slice.call(arguments,0)))}}(p=t.createElement("script")).type="text/javascript",p.crossOrigin="anonymous",p.async=!0,p.src=s.api_host.replace(".i.posthog.com","-assets.i.posthog.com")+"/static/array.js",(r=t.getElementsByTagName("script")[0]).parentNode.insertBefore(p,r);var u=e;for(void 0!==a?u=e[a]=[]:a="posthog",u.people=u.people||[],u.toString=function(t){var e="posthog";return"posthog"!==a&&(e+="."+a),t||(e+=" (stub)"),e},u.people.toString=function(){return u.toString(1)+".people (stub)"},o="init capture register register_once register_for_session unregister unregister_for_session getFeatureFlag getFeatureFlagPayload isFeatureEnabled reloadFeatureFlags updateEarlyAccessFeatureEnrollment getEarlyAccessFeatures on onFeatureFlags onSessionId getSurveys getActiveMatchingSurveys renderSurvey canRenderSurvey getNextSurveyStep identify setPersonProperties group resetGroups setPersonPropertiesForFlags resetPersonPropertiesForFlags setGroupPropertiesForFlags resetGroupPropertiesForFlags reset get_distinct_id getGroups get_session_id get_session_replay_url alias set_config startSessionRecording stopSessionRecording sessionRecordingStarted captureException loadToolbar get_property getSessionProperty createPersonProfile opt_in_capturing opt_out_capturing has_opted_in_capturing has_opted_out_capturing clear_opt_in_out_capturing debug getPageViewId captureTraceFeedback captureTraceMetric".split(" "),n=0;n<o.length;n++)g(u,o[n]);e._i.push([i,s,a])},e.__SV=1)}(document,window.posthog||[]);';
const posthog = enabled ? analytics?.posthog : undefined;
// PostHog's loader only captures a pageview per real page load, but the client
// router turns link clicks into in-place swaps — capture those too, keyed off
// `astro:page-load` with a pathname guard so the initial load (which the
// loader already counted) and same-page hash moves aren't double-counted.
// Vercel Web Analytics and GA4's enhanced measurement track history changes
// on their own.
const POSTHOG_SPA_PAGEVIEWS =
  'document.addEventListener("astro:page-load",function(){var p=window.__blumePhPath;window.__blumePhPath=location.pathname;if(p!==undefined&&p!==location.pathname){posthog.capture("$pageview");}});';
const posthogSnippet = posthog
  ? `${POSTHOG_LOADER}posthog.init(${JSON.stringify(posthog.key)},{api_host:${JSON.stringify(posthog.host ?? "https://us.i.posthog.com")}});${POSTHOG_SPA_PAGEVIEWS}`
  : null;

// Custom scripts: any other provider. Each is either external (`src`) or inline
// (`content`). Explicit fields win over spread `attributes`.
const customScripts = enabled ? (analytics?.scripts ?? []) : [];
const externalScripts = customScripts
  .filter((script) => script.src)
  .map((script) => ({
    ...script.attributes,
    ...(script.strategy === "async" ? { async: true } : {}),
    ...(script.strategy === "defer" ? { defer: true } : {}),
    src: script.src,
  }));
const inlineScripts = customScripts
  .filter((script) => script.content)
  .map((script) => ({ attributes: script.attributes ?? {}, content: script.content }));
---

{vercelEnabled && <VercelAnalytics />}
{posthogSnippet && <script is:inline set:html={posthogSnippet} />}
{externalScripts.map((attrs) => <script is:inline {...attrs} />)}
{
  inlineScripts.map((script) => (
    <script is:inline set:html={script.content} {...script.attributes} />
  ))
}
