// verifier-react-hook.jsx
// React hook wrapping the same vp-start / vp-status flow.
// European Digital Identity Wallet verifier client.
// Reference: docs.eudi.dev / OpenID for Verifiable Presentations (OID4VP) FINAL.
// (c) Aloaha Limited.

import { useEffect, useRef, useState } from 'react';

const CODEB = (typeof window !== 'undefined' && window.CODEB_TENANT_HOST) || '';

export function useEudiVerifier(options) {
  const opts = options || {};
  const query = opts.query || 'pid-minimal';
  const timeoutMs = opts.timeoutMs || 180000;
  const pollMs = opts.pollMs || 1500;

  const [session, setSession] = useState(null); // { id, deep_link, request_uri }
  const [status, setStatus] = useState('idle'); // idle|starting|waiting|completed|error|expired
  const [claims, setClaims] = useState(null);
  const [error, setError] = useState(null);
  const cancelled = useRef(false);

  function start() {
    cancelled.current = false;
    setStatus('starting');
    setError(null);
    setClaims(null);
    fetch(CODEB + '/oidc.ashx?action=vp-start&query=' + encodeURIComponent(query), {
      method: 'POST',
      credentials: 'omit'
    })
      .then(function (r) {
        if (!r.ok) throw new Error('vp-start HTTP ' + r.status);
        return r.json();
      })
      .then(function (s) {
        if (cancelled.current) return;
        setSession(s);
        setStatus('waiting');
      })
      .catch(function (e) { setError(e); setStatus('error'); });
  }

  function cancel() {
    cancelled.current = true;
    setStatus('idle');
  }

  useEffect(function () {
    if (status !== 'waiting' || !session) return;
    const started = Date.now();
    let alive = true;
    const t = setInterval(function () {
      if (!alive || cancelled.current) return;
      if (Date.now() - started > timeoutMs) {
        alive = false; clearInterval(t); setStatus('expired');
        return;
      }
      fetch(CODEB + '/oidc.ashx?action=vp-status&id=' + encodeURIComponent(session.id), {
        credentials: 'omit'
      })
        .then(function (r) { return r.json(); })
        .then(function (s) {
          if (!alive || cancelled.current) return;
          if (s.status === 'completed') {
            alive = false; clearInterval(t);
            setClaims(s.claims || {});
            setStatus('completed');
            if (opts.onSuccess) opts.onSuccess(s.claims || {});
          } else if (s.status === 'error' || s.status === 'expired') {
            alive = false; clearInterval(t);
            setStatus(s.status);
            if (opts.onError) opts.onError(new Error(s.status));
          }
        })
        .catch(function () { /* transient, keep polling */ });
    }, pollMs);
    return function () { alive = false; clearInterval(t); };
  }, [status, session ? session.id : null]);

  return { session, status, claims, error, start, cancel };
}
