import { useEffect, useState, useCallback } from "react";
import {
  fetchDeltaAccount,
  loadCreds,
  type DeltaAccountResponse,
  type DeltaCreds,
} from "@/lib/delta-account";

/**
 * Loads Delta creds from localStorage and calls the signed /api/delta/account
 * server route. Auto-refreshes every 30s while creds are present. Emits a
 * `delta-creds-changed` window event to re-sync across the tab.
 */
export function useDeltaAccount(pollMs = 30_000) {
  const [creds, setCreds] = useState<DeltaCreds | null>(() => loadCreds());
  const [account, setAccount] = useState<DeltaAccountResponse | null>(null);
  const [loading, setLoading] = useState(false);

  const refresh = useCallback(async (c?: DeltaCreds | null) => {
    const use = c ?? loadCreds();
    if (!use) {
      setAccount(null);
      return null;
    }
    setLoading(true);
    try {
      const resp = await fetchDeltaAccount(use);
      setAccount(resp);
      return resp;
    } catch (e) {
      const resp: DeltaAccountResponse = {
        connected: false,
        error: e instanceof Error ? e.message : String(e),
      };
      setAccount(resp);
      return resp;
    } finally {
      setLoading(false);
    }
  }, []);

  useEffect(() => {
    const onChange = () => {
      const next = loadCreds();
      setCreds(next);
      refresh(next);
    };
    window.addEventListener("delta-creds-changed", onChange);
    refresh(creds);
    const t = window.setInterval(() => refresh(), pollMs);
    return () => {
      window.removeEventListener("delta-creds-changed", onChange);
      window.clearInterval(t);
    };
    // eslint-disable-next-line react-hooks/exhaustive-deps
  }, [pollMs]);

  return { creds, account, loading, refresh };
}
