import { DocumentByName, GenericQueryCtx, TableNamesInDataModel } from "convex/server";

//#region src/orm/query-context.d.ts
type InferCtxDataModel<TCtx extends GenericQueryCtx<any>> = TCtx extends GenericQueryCtx<infer DataModel> ? DataModel : never;
type DocByCtx<TCtx extends GenericQueryCtx<any>, TableName extends TableNamesInDataModel<InferCtxDataModel<TCtx>>> = DocumentByName<InferCtxDataModel<TCtx>, TableName>;
type QueryCtxWithOptionalOrmQueryTable<TCtx extends GenericQueryCtx<any>, TableName extends TableNamesInDataModel<InferCtxDataModel<TCtx>>> = TCtx & {
  orm?: {
    query?: { [K in TableName]?: {
      findFirst?: (...args: any[]) => unknown;
    } };
  };
};
type QueryCtxWithOrmQueryTable<TCtx extends GenericQueryCtx<any>, TableName extends TableNamesInDataModel<InferCtxDataModel<TCtx>>> = TCtx & {
  orm: {
    query: { [K in TableName]-?: {
      findFirst: (...args: any[]) => unknown;
    } };
  };
};
type OrmQueryByCtx<TCtx extends GenericQueryCtx<any>> = TCtx extends {
  orm: {
    query: infer TQuery;
  };
} ? TQuery : never;
type OrmQueryEntryByCtx<TCtx extends GenericQueryCtx<any>, TableName extends TableNamesInDataModel<InferCtxDataModel<TCtx>>> = TableName extends keyof OrmQueryByCtx<TCtx> ? NonNullable<OrmQueryByCtx<TCtx>[TableName]> : never;
type HasOrmFindFirstByCtx<TCtx extends GenericQueryCtx<any>, TableName extends TableNamesInDataModel<InferCtxDataModel<TCtx>>> = [OrmQueryEntryByCtx<TCtx, TableName>] extends [never] ? false : OrmQueryEntryByCtx<TCtx, TableName> extends {
  findFirst: (...args: any[]) => unknown;
} ? true : false;
type QueryCtxWithPreferredOrmQueryTable<TCtx extends GenericQueryCtx<any>, TableName extends TableNamesInDataModel<InferCtxDataModel<TCtx>>> = TCtx extends {
  orm: unknown;
} ? HasOrmFindFirstByCtx<TCtx, TableName> extends true ? TCtx : never : TCtx;
type OrmQueryRowByCtx<TCtx extends GenericQueryCtx<any>, TableName extends TableNamesInDataModel<InferCtxDataModel<TCtx>>> = OrmQueryEntryByCtx<TCtx, TableName> extends {
  _: {
    baseResult: infer TResult;
  };
} ? TResult : never;
type LookupByIdResultByCtx<TCtx extends GenericQueryCtx<any>, TableName extends TableNamesInDataModel<InferCtxDataModel<TCtx>>> = (TCtx extends {
  orm: unknown;
} ? OrmQueryRowByCtx<TCtx, TableName> : DocByCtx<TCtx, TableName>) | null;
declare function getByIdWithOrmQueryFallback<TCtx extends GenericQueryCtx<any>, TableName extends TableNamesInDataModel<InferCtxDataModel<TCtx>>>(ctx: QueryCtxWithPreferredOrmQueryTable<TCtx, TableName>, tableName: TableName, id: DocByCtx<TCtx, TableName>['_id']): Promise<LookupByIdResultByCtx<TCtx, TableName>>;
//#endregion
export { QueryCtxWithPreferredOrmQueryTable as a, QueryCtxWithOrmQueryTable as i, LookupByIdResultByCtx as n, getByIdWithOrmQueryFallback as o, QueryCtxWithOptionalOrmQueryTable as r, DocByCtx as t };