import type { BackendAdapter, CapabilityRoute } from './adapters.js';

export interface ApiResponse {
  status: number;
  headers: Headers;
  body: unknown;
}

export async function apiRequest(
  adapter: BackendAdapter,
  method: string,
  route: CapabilityRoute,
  credential?: string,
  body?: unknown,
  id?: string,
): Promise<ApiResponse> {
  const request = adapter.request(route, credential, id);
  const response = await fetch(request.url, {
    method,
    headers: request.headers,
    body: body === undefined || method === 'GET' ? undefined : JSON.stringify(body),
    signal: AbortSignal.timeout(60_000),
  });
  const text = await response.text();
  let parsed: unknown;
  try {
    parsed = text ? JSON.parse(text) : null;
  } catch {
    parsed = text;
  }
  return { status: response.status, headers: response.headers, body: parsed };
}

export function field(body: Record<string, unknown>, ...names: string[]): unknown {
  for (const name of names) if (body[name] !== undefined) return body[name];
  return undefined;
}
