import { Auth, GenericDatabaseReader, GenericDatabaseWriter, StorageActionWriter, StorageReader, StorageWriter } from "./index.js";
import { FunctionReference, FunctionReturnType, OptionalRestArgs } from "../server/api.js";
import { ObjectType, PropertyValidators } from "../values/validator.js";
import { Id } from "../values/value.js";
import { GenericDataModel, NamedTableInfo, TableNamesInDataModel, VectorIndexNames } from "./data_model.js";
import { Scheduler } from "./scheduler.js";
import { VectorSearchQuery } from "./vector_search.js";
import { Expand } from "../type_utils.js";
/**
 * A set of services for use within Convex mutation functions.
 *
 * The mutation context is passed as the first argument to any Convex mutation
 * function run on the server.
 *
 * If you're using code generation, use the `MutationCtx` type in
 * `convex/_generated/server.d.ts` which is typed for your data model.
 *
 * @public
 */
export interface GenericMutationCtx<DataModel extends GenericDataModel> {
    /**
     * A utility for reading and writing data in the database.
     */
    db: GenericDatabaseWriter<DataModel>;
    /**
     * Information about the currently authenticated user.
     */
    auth: Auth;
    /**
     * A utility for reading and writing files in storage.
     */
    storage: StorageWriter;
    /**
     * A utility for scheduling Convex functions to run in the future.
     */
    scheduler: Scheduler;
}
/**
 * A set of services for use within Convex query functions.
 *
 * The query context is passed as the first argument to any Convex query
 * function run on the server.
 *
 * This differs from the {@link MutationCtx} because all of the services are
 * read-only.
 *
 *
 * @public
 */
export interface GenericQueryCtx<DataModel extends GenericDataModel> {
    /**
     * A utility for reading data in the database.
     */
    db: GenericDatabaseReader<DataModel>;
    /**
     * Information about the currently authenticated user.
     */
    auth: Auth;
    /**
     * A utility for reading files in storage.
     */
    storage: StorageReader;
}
/**
 * A set of services for use within Convex action functions.
 *
 * The context is passed as the first argument to any Convex action
 * run on the server.
 *
 * If you're using code generation, use the `ActionCtx` type in
 * `convex/_generated/server.d.ts` which is typed for your data model.
 *
 * @public
 */
export interface GenericActionCtx<DataModel extends GenericDataModel> {
    /**
     * Run the Convex query with the given name and arguments.
     *
     * Consider using an {@link internalQuery} to prevent users from calling the
     * query directly.
     *
     * @param query - A {@link FunctionReference} for the query to run.
     * @param args - The arguments to the query function.
     * @returns A promise of the query's result.
     */
    runQuery<Query extends FunctionReference<"query", "public" | "internal">>(query: Query, ...args: OptionalRestArgs<Query>): Promise<FunctionReturnType<Query>>;
    /**
     * Run the Convex mutation with the given name and arguments.
     *
     * Consider using an {@link internalMutation} to prevent users from calling
     * the mutation directly.
     *
     * @param mutation - A {@link FunctionReference} for the mutation to run.
     * @param args - The arguments to the mutation function.
     * @returns A promise of the mutation's result.
     */
    runMutation<Mutation extends FunctionReference<"mutation", "public" | "internal">>(mutation: Mutation, ...args: OptionalRestArgs<Mutation>): Promise<FunctionReturnType<Mutation>>;
    /**
     * Run the Convex action with the given name and arguments.
     *
     * Consider using an {@link internalAction} to prevent users from calling the
     * action directly.
     *
     * @param action - A {@link FunctionReference} for the action to run.
     * @param args - The arguments to the action function.
     * @returns A promise of the action's result.
     */
    runAction<Action extends FunctionReference<"action", "public" | "internal">>(action: Action, ...args: OptionalRestArgs<Action>): Promise<FunctionReturnType<Action>>;
    /**
     * A utility for scheduling Convex functions to run in the future.
     */
    scheduler: Scheduler;
    /**
     * Information about the currently authenticated user.
     */
    auth: Auth;
    /**
     * A utility for reading and writing files in storage.
     */
    storage: StorageActionWriter;
    /**
     * Run a vector search on the given table and index.
     *
     * @param tableName - The name of the table to query.
     * @param indexName - The name of the vector index on the table to query.
     * @param query - A {@link VectorSearchQuery} containing the vector to query,
     * the number of results to return, and any filters.
     * @returns A promise of IDs and scores for the documents with the nearest
     * vectors
     */
    vectorSearch<TableName extends TableNamesInDataModel<DataModel>, IndexName extends VectorIndexNames<NamedTableInfo<DataModel, TableName>>>(tableName: TableName, indexName: IndexName, query: Expand<VectorSearchQuery<NamedTableInfo<DataModel, TableName>, IndexName>>): Promise<Array<{
        _id: Id<TableName>;
        _score: number;
    }>>;
}
/**
 * The default arguments type for a Convex query, mutation, or action function.
 *
 * Convex functions always take an arguments object that maps the argument
 * names to their values.
 *
 * @public
 */
export type DefaultFunctionArgs = Record<string, unknown>;
/**
 * The arguments array for a function that takes arguments.
 *
 * This is an array of a single {@link DefaultFunctionArgs} element.
 */
type OneArgArray<ArgsObject extends DefaultFunctionArgs = DefaultFunctionArgs> = [
    ArgsObject
];
/**
 * The arguments to a function that takes no arguments (just an empty array).
 */
type NoArgsArray = [];
/**
 * An array of arguments to a Convex function.
 *
 * Convex functions can take either a single {@link DefaultFunctionArgs} object or no
 * args at all.
 *
 * @public
 */
export type ArgsArray = OneArgArray | NoArgsArray;
/**
 * A type for the empty object `{}`.
 *
 * Note that we don't use `type EmptyObject = {}` because that matches every object.
 */
export type EmptyObject = Record<string, never>;
/**
 * Convert an {@link ArgsArray} into a single object type.
 *
 * Empty arguments arrays are converted to {@link EmptyObject}.
 */
type ArgsArrayToObject<Args extends ArgsArray> = Args extends OneArgArray<infer ArgsObject> ? ArgsObject : EmptyObject;
/**
 * A type representing the visibility of a Convex function.
 *
 * @public
 */
export type FunctionVisibility = "public" | "internal";
/**
 * Given a {@link FunctionVisibility}, should this function have `isPublic: true`
 * or `isInternal: true`?
 */
type VisibilityProperties<Visiblity extends FunctionVisibility> = Visiblity extends "public" ? {
    isPublic: true;
} : {
    isInternal: true;
};
/**
 * A mutation function that is part of this app.
 *
 * You can create a mutation by wrapping your function in
 * {@link mutationGeneric} or {@link internalMutationGeneric} and exporting it.
 *
 * @public
 */
export type RegisteredMutation<Visibility extends FunctionVisibility, Args extends DefaultFunctionArgs, Output> = {
    (ctx: GenericMutationCtx<any>, args: Args): Output;
    isConvexFunction: true;
    isMutation: true;
    isRegistered?: true;
} & VisibilityProperties<Visibility>;
/**
 * A query function that is part of this app.
 *
 * You can create a query by wrapping your function in
 * {@link queryGeneric} or {@link internalQueryGeneric} and exporting it.
 *
 * @public
 */
export type RegisteredQuery<Visibility extends FunctionVisibility, Args extends DefaultFunctionArgs, Output> = {
    (ctx: GenericQueryCtx<any>, args: Args): Output;
    isConvexFunction: true;
    isQuery: true;
    isRegistered?: true;
} & VisibilityProperties<Visibility>;
/**
 * An action that is part of this app.
 *
 * You can create an action by wrapping your function in
 * {@link actionGeneric} or {@link internalActionGeneric} and exporting it.
 *
 * @public
 */
export type RegisteredAction<Visibility extends FunctionVisibility, Args extends DefaultFunctionArgs, Output> = {
    (ctx: GenericActionCtx<any>, args: Args): Output;
    isConvexFunction: true;
    isAction: true;
    isRegistered?: true;
} & VisibilityProperties<Visibility>;
/**
 * An HTTP action that is part of this app's public API.
 *
 * You can create public HTTP actions by wrapping your function in
 * {@link httpActionGeneric} and exporting it.
 *
 * @public
 */
export type PublicHttpAction = {
    (ctx: GenericActionCtx<any>, request: Request): Response;
    isHttp: true;
    isRegistered?: true;
};
/**
 * The definition of a Convex query, mutation, or action function without
 * argument validation.
 *
 * Convex functions always take a context object as their first argument
 * and an (optional) args object as their second argument.
 *
 * This can be written as a function like:
 * ```js
 * import { query } from "./_generated/server";
 *
 * export const func = query(({ db }, { arg }) => {...});
 * ```
 * or as an object like:
 *
 * ```js
 * import { query } from "./_generated/server";
 *
 * export const func = query({
 *   handler: ({ db }, { arg }) => {...},
 * });
 * ```
 * See {@link ValidatedFunction} to add argument validation.
 *
 * @public
 */
export type UnvalidatedFunction<Ctx, Args extends ArgsArray, Output> = ((ctx: Ctx, ...args: Args) => Output) | {
    handler: (ctx: Ctx, ...args: Args) => Output;
};
/**
 * The definition of a Convex query, mutation, or action function with argument
 * validation.
 *
 * Argument validation allows you to assert that the arguments to this function
 * are the expected type.
 *
 * Example:
 *
 * ```js
 * import { query } from "./_generated/server";
 * import { v } from "convex/values";
 *
 * export const func = query({
 *   args: {
 *     arg: v.string()
 *   },
 *   handler: ({ db }, { arg }) => {...},
 * });
 * ```
 *
 * **For security, argument validation should be added to all public functions in
 * production apps.**
 *
 * See {@link UnvalidatedFunction} for functions without argument validation.
 * @public
 */
export interface ValidatedFunction<Ctx, ArgsValidator extends PropertyValidators, Output> {
    /**
     * A validator for the arguments of this function.
     *
     * This is an object mapping argument names to validators constructed with
     * {@link values.v}.
     *
     * ```js
     * import { v } from "convex/values";
     *
     * const args = {
     *   stringArg: v.string(),
     *   optionalNumberArg: v.optional(v.number()),
     * }
     * ```
     */
    args: ArgsValidator;
    /**
     * The implementation of this function.
     *
     * This is a function that takes in the appropriate context and arguments
     * and produces some result.
     *
     * @param ctx - The context object. This is one of {@link QueryCtx},
     * {@link MutationCtx}, or {@link ActionCtx} depending on the function type.
     * @param args - The arguments object for this function. This will match
     * the type defined by the argument validator.
     * @returns
     */
    handler: (ctx: Ctx, args: ObjectType<ArgsValidator>) => Output;
}
/**
 * Internal type helper used by Convex code generation.
 *
 * Used to give {@link mutationGeneric} a type specific to your data model.
 * @public
 */
export type MutationBuilder<DataModel extends GenericDataModel, Visibility extends FunctionVisibility> = {
    <Output, ArgsValidator extends PropertyValidators>(func: ValidatedFunction<GenericMutationCtx<DataModel>, ArgsValidator, Output>): RegisteredMutation<Visibility, ObjectType<ArgsValidator>, Output>;
    <Output, Args extends ArgsArray = OneArgArray>(func: UnvalidatedFunction<GenericMutationCtx<DataModel>, Args, Output>): RegisteredMutation<Visibility, ArgsArrayToObject<Args>, Output>;
};
/**
 * Internal type helper used by Convex code generation.
 *
 * Used to give {@link queryGeneric} a type specific to your data model.
 * @public
 */
export type QueryBuilder<DataModel extends GenericDataModel, Visibility extends FunctionVisibility> = {
    <Output, ArgsValidator extends PropertyValidators>(func: ValidatedFunction<GenericQueryCtx<DataModel>, ArgsValidator, Output>): RegisteredQuery<Visibility, ObjectType<ArgsValidator>, Output>;
    <Output, Args extends ArgsArray = OneArgArray>(func: UnvalidatedFunction<GenericQueryCtx<DataModel>, Args, Output>): RegisteredQuery<Visibility, ArgsArrayToObject<Args>, Output>;
};
/**
 * Internal type helper used by Convex code generation.
 *
 * Used to give {@link actionGeneric} a type specific to your data model.
 * @public
 */
export type ActionBuilder<DataModel extends GenericDataModel, Visibility extends FunctionVisibility> = {
    <Output, ArgsValidator extends PropertyValidators>(func: ValidatedFunction<GenericActionCtx<DataModel>, ArgsValidator, Output>): RegisteredAction<Visibility, ObjectType<ArgsValidator>, Output>;
    <Output, Args extends ArgsArray = OneArgArray>(func: UnvalidatedFunction<GenericActionCtx<DataModel>, Args, Output>): RegisteredAction<Visibility, ArgsArrayToObject<Args>, Output>;
};
/**
 * Internal type helper used by Convex code generation.
 *
 * Used to give {@link httpActionGeneric} a type specific to your data model
 * and functions.
 * @public
 */
export type HttpActionBuilder = (func: (ctx: GenericActionCtx<any>, request: Request) => Promise<Response>) => PublicHttpAction;
export {};
//# sourceMappingURL=registration.d.ts.map