import { Client, simpleFetchHandler } from "@atcute/client";

export { ClientResponseError, isXRPCErrorPayload, ok } from "@atcute/client";
export type { XRPCErrorPayload } from "@atcute/client";

// generated lexicons register ambient types; don't import the barrel at runtime.

export interface BobbinContext {
	readonly xrpc: Client;
	readonly serviceUrl: string;
	readonly fetch: typeof globalThis.fetch;
}

export interface CreateBobbinOptions {
	serviceUrl: string;
	fetch?: typeof globalThis.fetch;
}

export const createBobbinClient = ({ serviceUrl, fetch }: CreateBobbinOptions): BobbinContext => {
	const origin = serviceUrl.replace(/\/+$/, "");
	const boundFetch = fetch ?? globalThis.fetch;
	const xrpc = new Client({ handler: simpleFetchHandler({ service: origin, fetch: boundFetch }) });
	return { xrpc, serviceUrl: origin, fetch: boundFetch };
};

export type QueryValue = string | number | boolean | readonly (string | number)[] | undefined;

export interface XrpcRequestInit {
	signal?: AbortSignal;
	headers?: HeadersInit;
}
