'use client';
// Integration example: use/adapt for the hosted service. Only React is required.
import { useEffect, useRef, useState } from 'react';

type PageFacts = { type: string; id?: string | number; title?: string };
type Widget = { setContext(value: { page: PageFacts }): void; destroy(): void };
type BrowserSDK = { mount(options: { apiUrl: string; title: string; publicKey?: string; getToken?: () => Promise<string> }): Widget };
declare global { interface Window { ContextAssistant?: BrowserSDK } }
let scriptPromise: Promise<BrowserSDK> | undefined;

function loadWidget(): Promise<BrowserSDK> {
  if (window.ContextAssistant) return Promise.resolve(window.ContextAssistant);
  if (!scriptPromise) {
    scriptPromise = new Promise((resolve, reject) => {
      const script = document.createElement('script');
      script.src = 'https://contextassistant.io/assets/embed.js';
      script.async = true;
      script.onload = () => window.ContextAssistant
        ? resolve(window.ContextAssistant) : reject(new Error('Widget API unavailable'));
      script.onerror = () => { script.remove(); reject(new Error('Widget script unavailable')); };
      document.head.appendChild(script);
    });
  }
  return scriptPromise;
}

async function getToken() {
  const response = await fetch('/api/context-assistant/token', { method: 'POST', credentials: 'same-origin' });
  if (!response.ok) throw new Error('Token request failed: ' + response.status);
  const data = await response.json();
  if (typeof data.token !== 'string' || !data.token) throw new Error('Invalid token response');
  return data.token;
}

export function ContextAssistantWidget({ identityKey = 'public', publicKey, page }: {
  identityKey?: string; // Private mode: change on login/logout; not proof of identity.
  publicKey?: string; // Public knowledge only. Omit to retain server-token mode.
  page: PageFacts;
}) {
  const widget = useRef<Widget | null>(null);
  const currentPage = useRef(page);
  currentPage.current = page;
  const [error, setError] = useState('');
  useEffect(() => {
    let cancelled = false;
    setError('');
    loadWidget().then(sdk => {
      if (cancelled) return;
      // The server-issued token selects the assistant. No agent override.
      widget.current = sdk.mount({ apiUrl: 'https://api.contextassistant.io', title: 'Assistant', publicKey, getToken: publicKey ? undefined : getToken });
      widget.current.setContext({ page: currentPage.current });
    }).catch(() => { if (!cancelled) setError('The assistant could not load. Please try again later.'); });
    return () => { cancelled = true; widget.current?.destroy(); widget.current = null; };
  }, [identityKey, publicKey]);
  useEffect(() => { widget.current?.setContext({ page }); }, [page]);
  return error ? <p role="status">{error}</p> : null;
}
