import Base, { type ClientRpcOptions } from "@tai-kun/surrealdb/basic-client";
import type { Auth, LivePayload, Patch, PreparedQueryLike, QueryResult, ReadonlyPatch, RecordAccessAuth, RpcGraphqlRequest, RpcResultMapping, SlotLike } from "@tai-kun/surrealdb/types";
import { type TaskListener } from "@tai-kun/surrealdb/utils";
import type { Simplify, UnionToIntersection } from "type-fest";
import type { DataType } from "../../surreal/data-types";
import Jwt from "./jwt";
export type * from "@tai-kun/surrealdb/basic-client";
type Override<T, U> = Simplify<Omit<T, keyof U> & U>;
export type InferSlotVars<TSlot extends SlotLike> = UnionToIntersection<{
    [TName in TSlot["name"]]: TSlot extends SlotLike<TName, infer TRequired, infer TValue> ? TRequired extends false ? {
        readonly [_ in TName]?: TValue;
    } : {
        readonly [_ in TName]: TValue;
    } : never;
}[TSlot["name"]]>;
export interface LiveOptions extends ClientRpcOptions {
    readonly diff?: boolean | undefined;
}
export type LiveHandler<TPayload extends LivePayload<any, any> = LivePayload> = TaskListener<[payload: TPayload]>;
export type InferLivePayload<TUuid, TData extends Readonly<RecordData> = RecordData, TPatch extends Patch[] = Patch[]> = TUuid extends {
    __diff: false;
} ? LivePayload.Data<TData, DataType.Thing | string> : TUuid extends {
    __diff: true;
} ? LivePayload.Diff<TData, TPatch, DataType.Thing | string> : LivePayload<TData, TPatch>;
export type ActionResult<TData extends Readonly<RecordData> = RecordData> = [Extract<keyof TData, "id">] extends [never] ? ({
    id: DataType.Thing | string;
} & TData) : TData;
type _In<T> = [Extract<keyof T, "in">] extends [never] ? ({
    in: DataType.Thing | string;
} & T) : T;
type _Out<T> = [Extract<keyof T, "out">] extends [never] ? ({
    out: DataType.Thing | string;
} & T) : T;
export type RelateResult<TData extends Readonly<RecordData> = RecordData> = ActionResult<_In<_Out<TData>>>;
export interface PatchOptions extends ClientRpcOptions {
    readonly diff?: boolean | undefined;
}
export interface RunOptions extends ClientRpcOptions {
    readonly version?: string | undefined;
}
export interface GraphqlOptions extends ClientRpcOptions, NonNullable<RpcGraphqlRequest["params"][1]> {
}
type RecordData = {
    [p: string]: unknown;
};
type NormalRecord = {
    id: DataType.Thing | string;
    [p: string]: unknown;
};
export default class Client extends Base {
    ping(options?: ClientRpcOptions | undefined): Promise<void>;
    use(ns: string | null | undefined, options?: ClientRpcOptions | undefined): Promise<void>;
    use(ns: string | null | undefined, db?: string | null | undefined, options?: ClientRpcOptions | undefined): Promise<void>;
    use(target: [ns: string | null | undefined, db?: string | null | undefined], options?: ClientRpcOptions | undefined): Promise<void>;
    use(target: {
        readonly ns?: string | null | undefined;
        readonly db?: string | null | undefined;
    }, options?: ClientRpcOptions | undefined): Promise<void>;
    use(target: {
        readonly namespace?: string | null | undefined;
        readonly database?: string | null | undefined;
    }, options?: ClientRpcOptions | undefined): Promise<void>;
    info<T extends RpcResultMapping["info"] = RpcResultMapping["info"]>(options?: ClientRpcOptions | undefined): Promise<T>;
    /**
     * [API Reference](https://tai-kun.github.io/surrealdb.js/v2/guides/connecting/#signup)
     */
    signup(auth: RecordAccessAuth, options?: ClientRpcOptions | undefined): Promise<Jwt>;
    /**
     * [API Reference](https://tai-kun.github.io/surrealdb.js/v2/guides/connecting/#signin)
     */
    signin(auth: Auth, options?: ClientRpcOptions | undefined): Promise<Jwt>;
    /**
     * [API Reference](https://tai-kun.github.io/surrealdb.js/v2/guides/connecting/#authenticate)
     */
    authenticate(token: string | Jwt, options?: ClientRpcOptions | undefined): Promise<void>;
    /**
     * [API Reference](https://tai-kun.github.io/surrealdb.js/v2/guides/connecting/#invalidate)
     */
    invalidate(options?: ClientRpcOptions | undefined): Promise<void>;
    live<T extends DataType.Uuid | string = DataType.Uuid | string>(table: DataType.Table | string, options: ClientRpcOptions & {
        readonly diff: true;
    }): Promise<T & {
        __diff: true;
    }>;
    live<T extends DataType.Uuid | string = DataType.Uuid | string>(table: DataType.Table | string, options?: (ClientRpcOptions & {
        readonly diff?: false | undefined;
    }) | undefined): Promise<T & {
        __diff: false;
    }>;
    live<T extends DataType.Uuid | string = DataType.Uuid | string>(table: DataType.Table | string, options?: LiveOptions | undefined): Promise<T & {
        __diff: boolean;
    }>;
    subscribe<TUuid, TPayload extends LivePayload<any, any> = InferLivePayload<TUuid>>(queryUuid: TUuid, callback: LiveHandler<TPayload>): void;
    unsubscribe(queryUuid: DataType.Uuid | string, callback: LiveHandler<any>): void;
    kill(queryUuid: DataType.Uuid | string | readonly (DataType.Uuid | string)[], options?: ClientRpcOptions | undefined): Promise<void>;
    /**
     * [API Reference](https://tai-kun.github.io/surrealdb.js/v2/guides/querying/#queryraw)
     */
    queryRaw<TResults extends readonly QueryResult[] = QueryResult[]>(surql: string | PreparedQueryLike, vars?: Readonly<RecordData> | undefined, options?: ClientRpcOptions | undefined): Promise<TResults>;
    /**
     * [API Reference](https://tai-kun.github.io/surrealdb.js/v2/guides/querying/#query)
     */
    query<TReturns extends readonly unknown[] = unknown[]>(surql: string, vars?: Readonly<RecordData> | undefined, options?: ClientRpcOptions | undefined): Promise<TReturns>;
    /**
     * [API Reference](https://tai-kun.github.io/surrealdb.js/v2/guides/querying/#query)
     */
    query<TResult>(surql: Override<PreparedQueryLike, {
        readonly slots: readonly SlotLike<any, false, any>[];
        readonly __type: TResult;
    }>, vars?: Readonly<RecordData> | undefined, options?: ClientRpcOptions | undefined): Promise<TResult>;
    /**
     * [API Reference](https://tai-kun.github.io/surrealdb.js/v2/guides/querying/#query)
     */
    query<TSlot extends SlotLike, TResult>(surql: Override<PreparedQueryLike, {
        readonly slots: readonly TSlot[];
        readonly __type: TResult;
    }>, vars: Simplify<InferSlotVars<TSlot>> & Readonly<RecordData>, options?: ClientRpcOptions | undefined): Promise<TResult>;
    let(name: string, value: unknown, options?: ClientRpcOptions | undefined): Promise<void>;
    unset(name: string, options?: ClientRpcOptions | undefined): Promise<void>;
    select<TResult extends Readonly<RecordData> = RecordData>(table: DataType.Table | string, options?: ClientRpcOptions | undefined): Promise<ActionResult<TResult>[]>;
    select<TResult extends Readonly<RecordData> = RecordData>(thing: DataType.Thing, options?: ClientRpcOptions | undefined): Promise<ActionResult<TResult>>;
    create<TResult extends Readonly<RecordData> = RecordData, TData extends Readonly<RecordData> = TResult>(table: DataType.Table | string, data?: TData | undefined, options?: ClientRpcOptions | undefined): Promise<ActionResult<TResult>>;
    create<TResult extends Readonly<RecordData> = RecordData, TData extends Readonly<RecordData> = TResult>(thing: DataType.Thing, data?: TData | undefined, options?: ClientRpcOptions | undefined): Promise<ActionResult<TResult>>;
    insert<TResult extends Readonly<RecordData> = RecordData, TData extends Readonly<RecordData> = TResult>(table: DataType.Table | string, data?: TData | readonly TData[] | undefined, options?: ClientRpcOptions | undefined): Promise<ActionResult<TResult>[]>;
    insert<TResult extends Readonly<RecordData> = RecordData, TData extends Readonly<NormalRecord> = (TResult extends {
        readonly id: any;
    } ? TResult : ({
        id: DataType.Thing | string;
    } & TResult))>(table: DataType.Table | string | null | undefined, data?: TData | readonly TData[] | undefined, options?: ClientRpcOptions | undefined): Promise<ActionResult<TResult>[]>;
    insert<TResult extends Readonly<RecordData> = RecordData, TData extends Readonly<NormalRecord> = (TResult extends {
        readonly id: any;
    } ? TResult : ({
        id: DataType.Thing | string;
    } & TResult))>(data: TData | readonly TData[], options?: ClientRpcOptions | undefined): Promise<ActionResult<TResult>[]>;
    insert_relation<TResult extends Readonly<RecordData> = RecordData, TData extends Readonly<RecordData> = TResult>(table: DataType.Table | string, data?: TData | readonly TData[] | undefined, options?: ClientRpcOptions | undefined): Promise<RelateResult<TResult>[]>;
    insert_relation<TResult extends Readonly<RecordData> = RecordData, TData extends Readonly<NormalRecord> = (TResult extends {
        readonly id: any;
    } ? TResult : ({
        id: DataType.Thing | string;
    } & TResult))>(table: DataType.Table | string | null | undefined, data?: TData | readonly TData[] | undefined, options?: ClientRpcOptions | undefined): Promise<RelateResult<TResult>[]>;
    insert_relation<TResult extends Readonly<RecordData> = RecordData, TData extends Readonly<NormalRecord> = (TResult extends {
        readonly id: any;
    } ? TResult : ({
        id: DataType.Thing | string;
    } & TResult))>(data: TData | readonly TData[], options?: ClientRpcOptions | undefined): Promise<RelateResult<TResult>[]>;
    update<TResult extends Readonly<RecordData> = RecordData, TData extends Readonly<RecordData> = TResult>(table: DataType.Table | string, data?: TData | undefined, options?: ClientRpcOptions | undefined): Promise<ActionResult<TResult>[]>;
    update<TResult extends Readonly<RecordData> = RecordData, TData extends Readonly<RecordData> = TResult>(thing: DataType.Thing, data?: TData | undefined, options?: ClientRpcOptions | undefined): Promise<ActionResult<TResult>>;
    upsert<TResult extends Readonly<RecordData> = RecordData, TData extends Readonly<RecordData> = TResult>(table: DataType.Table | string, data?: TData | undefined, options?: ClientRpcOptions | undefined): Promise<ActionResult<TResult>[]>;
    upsert<TResult extends Readonly<RecordData> = RecordData, TData extends Readonly<RecordData> = TResult>(thing: DataType.Thing, data?: TData | undefined, options?: ClientRpcOptions | undefined): Promise<ActionResult<TResult>>;
    merge<TResult extends Readonly<RecordData> = RecordData, TData extends Readonly<RecordData> = TResult>(table: DataType.Table | string, data: TData, options?: ClientRpcOptions | undefined): Promise<ActionResult<TResult>[]>;
    merge<TResult extends Readonly<RecordData> = RecordData, TData extends Readonly<RecordData> = TResult>(thing: DataType.Thing, data: TData, options?: ClientRpcOptions | undefined): Promise<ActionResult<TResult>>;
    patch<TResult extends Readonly<RecordData> = RecordData>(table: DataType.Table | string, patches: readonly ReadonlyPatch[], options?: (ClientRpcOptions & {
        readonly diff?: false | undefined;
    }) | undefined): Promise<ActionResult<TResult>[]>;
    patch<TResult extends Readonly<RecordData> = RecordData>(thing: DataType.Thing, patches: readonly ReadonlyPatch[], options?: (ClientRpcOptions & {
        readonly diff?: false | undefined;
    }) | undefined): Promise<ActionResult<TResult>>;
    patch(table: DataType.Table | string, patches: readonly ReadonlyPatch[], options: ClientRpcOptions & {
        readonly diff: true;
    }): Promise<Patch[][]>;
    patch(thing: DataType.Thing, patches: readonly ReadonlyPatch[], options: ClientRpcOptions & {
        readonly diff: true;
    }): Promise<Patch[]>;
    delete<TResult extends Readonly<RecordData> = RecordData>(table: DataType.Table | string, options?: ClientRpcOptions | undefined): Promise<ActionResult<TResult>[]>;
    delete<TResult extends Readonly<RecordData> = RecordData>(thing: DataType.Thing, options?: ClientRpcOptions | undefined): Promise<ActionResult<TResult>>;
    version(options?: ClientRpcOptions | undefined): Promise<string>;
    run<T = unknown>(funcName: string, options?: RunOptions | undefined): Promise<T>;
    run<T = unknown>(funcName: string, args?: readonly unknown[] | undefined, options?: RunOptions | undefined): Promise<T>;
    /**
     * @experimental
     */
    graphql(query: string | {
        readonly query: string;
        readonly vars?: Readonly<RecordData> | undefined;
        readonly operation?: string | undefined;
    } | {
        readonly query: string;
        readonly vars?: Readonly<RecordData> | undefined;
        readonly operationName?: string | undefined;
    } | {
        readonly query: string;
        readonly variables?: Readonly<RecordData> | undefined;
        readonly operation?: string | undefined;
    } | {
        readonly query: string;
        readonly variables?: Readonly<RecordData> | undefined;
        readonly operationName?: string | undefined;
    }, options?: GraphqlOptions | undefined): Promise<string>;
    relate<TResult extends Readonly<RecordData> = RecordData, TData extends Readonly<RecordData> = TResult>(from: DataType.Thing | string | readonly (DataType.Thing | string)[], thing: string, to: DataType.Thing | string | readonly (DataType.Thing | string)[], data?: TData | undefined, options?: ClientRpcOptions | undefined): Promise<RelateResult<TResult>[]>;
    relate<TResult extends Readonly<RecordData> = RecordData, TData extends Readonly<RecordData> = TResult>(from: DataType.Thing | string | readonly (DataType.Thing | string)[], thing: DataType.Thing, to: DataType.Thing | string | readonly (DataType.Thing | string)[], data?: TData | undefined, options?: ClientRpcOptions | undefined): Promise<RelateResult<TResult>>;
}
//# sourceMappingURL=client.d.ts.map