import type { NotificationClient } from '@platform-modules/notifications-react';

function parseError(body: unknown, statusText: string): Error {
  const message =
    (body as { error?: { message?: string } } | null)?.error?.message ?? statusText;
  return new Error(message);
}

/** Host NotificationClient — session-scoped inbox routes (never passes userId). */
export function makeNotificationClient(): NotificationClient {
  return {
    async list(opts) {
      const params = new URLSearchParams();
      if (opts?.cursor) params.set('cursor', opts.cursor);
      if (opts?.limit != null) params.set('limit', String(opts.limit));
      if (opts?.unreadOnly) params.set('unreadOnly', 'true');
      const qs = params.toString();
      const res = await fetch(`/api/admin/notifications${qs ? `?${qs}` : ''}`, {
        credentials: 'same-origin',
      });
      const body: unknown = await res.json().catch(() => null);
      if (!res.ok) throw parseError(body, res.statusText);
      const page = body as { items: Awaited<ReturnType<NotificationClient['list']>>['items']; nextCursor?: string | null };
      return {
        items: page.items,
        ...(page.nextCursor ? { nextCursor: page.nextCursor } : {}),
      };
    },
    async unreadCount() {
      const res = await fetch('/api/admin/notifications/unread-count', { credentials: 'same-origin' });
      const body: unknown = await res.json().catch(() => null);
      if (!res.ok) throw parseError(body, res.statusText);
      return (body as { count: number }).count;
    },
    async markRead(ids) {
      const res = await fetch('/api/admin/notifications/read', {
        method: 'POST',
        credentials: 'same-origin',
        headers: { 'content-type': 'application/json', origin: window.location.origin },
        body: JSON.stringify({ ids }),
      });
      const body: unknown = await res.json().catch(() => null);
      if (!res.ok) throw parseError(body, res.statusText);
    },
  };
}
