"use client";

import { useEffect } from "react";

type ConsentState = "legacy" | "granted" | "denied" | "pending";
type StorageMode = "persistent" | "none";

declare global {
  interface Window {
    ClickReportTracking?: {
      setConsent: (state: ConsentState) => boolean;
    };
  }
}

export interface ClickReportScriptProps {
  siteToken: string;
  consent?: ConsentState;
  storage?: StorageMode;
}

const SITE_TOKEN_PATTERN = /^[A-Za-z0-9_-]{6,128}$/;

/**
 * Framework-neutral React loader. Render once near the application root.
 * The shared script is intentionally retained across Strict Mode effect probes.
 */
export function ClickReportScript({
  siteToken,
  consent = "legacy",
  storage = "persistent",
}: ClickReportScriptProps) {
  useEffect(() => {
    if (!SITE_TOKEN_PATTERN.test(siteToken)) return;

    const existing = document.getElementById("clickreport-tracker") as HTMLScriptElement | null;
    if (existing) {
      let configuredToken = existing.dataset.clickreportSiteToken;
      try {
        configuredToken = configuredToken || new URL(existing.src).searchParams.get("id") || undefined;
      } catch {
        configuredToken = configuredToken || undefined;
      }
      if (configuredToken && configuredToken !== siteToken) {
        console.error("A different ClickReport site token is already installed");
        return;
      }
      const configuredStorage = existing.dataset.storage || "persistent";
      if (window.ClickReportTracking && configuredStorage !== storage) {
        console.error("ClickReport storage mode cannot change after the tracker initializes");
        return;
      }
      existing.dataset.clickreportSiteToken = siteToken;
      existing.dataset.consent = consent;
      if (!window.ClickReportTracking) {
        existing.dataset.storage = storage;
      }
      window.ClickReportTracking?.setConsent(consent);
      return;
    }

    const script = document.createElement("script");
    script.id = "clickreport-tracker";
    script.async = true;
    script.src = `https://www.clickreport.com/track.js?id=${encodeURIComponent(siteToken)}`;
    script.dataset.clickreportSiteToken = siteToken;
    script.dataset.consent = consent;
    script.dataset.storage = storage;
    document.head.appendChild(script);
  }, [consent, siteToken, storage]);

  return null;
}
