import { SQLiteAsyncPreparedQuery, SQLiteAsyncPreparedQueryConfig, SQLiteAsyncSession } from "./session.cjs";
import { entityKind } from "../../entity.cjs";
import { BuildSubquerySelection, JoinNullability, SelectMode, SelectResult } from "../../query-builders/select.types.cjs";
import { ColumnsSelection, SQLWrapper } from "../../sql/sql.cjs";
import { Assume } from "../../utils.cjs";
import { QueryPromise } from "../../query-promise.cjs";
import { RunnableQuery } from "../../runnable-query.cjs";
import { SQLiteSelectBase, SQLiteSelectBuilder } from "../query-builders/select.cjs";
import { SQLiteSelectHKTBase, SelectedFields } from "../query-builders/select.types.cjs";

//#region src/sqlite-core/async/select.d.ts
type SQLiteAsyncSelectExecute<T extends AnySQLiteAsyncSelect> = T['_']['result'];
type SQLiteAsyncSelectPrepare<T extends AnySQLiteAsyncSelect> = SQLiteAsyncPreparedQuery<SQLiteAsyncPreparedQueryConfig & {
  type: T['_']['resultType'];
  run: T['_']['runResult'];
  all: T['_']['result'];
  get: T['_']['result'][number] | undefined;
  values: any[][];
  execute: SQLiteAsyncSelectExecute<T>;
}>;
type SQLiteAsyncSelectBuilder<TSelection extends SelectedFields | undefined, TResultType extends 'sync' | 'async', TRunResult> = SQLiteSelectBuilder<TSelection, TRunResult, SQLiteAsyncSelectHKT & {
  resultType: TResultType;
}>;
type SQLiteAsyncSelect<TTableName extends string | undefined = string | undefined, TResultType extends 'sync' | 'async' = 'sync' | 'async', TRunResult = unknown, TSelection extends ColumnsSelection = Record<string, any>, TSelectMode extends SelectMode = SelectMode, TNullabilityMap extends Record<string, JoinNullability> = Record<string, JoinNullability>> = SQLiteAsyncSelectBase<TTableName, TResultType, TRunResult, TSelection, TSelectMode, TNullabilityMap, true, never>;
interface SQLiteAsyncSelectHKT extends SQLiteSelectHKTBase {
  _type: SQLiteAsyncSelectBase<this['tableName'], Assume<this['resultType'], 'sync' | 'async'>, this['runResult'], Assume<this['selection'], ColumnsSelection>, this['selectMode'], Assume<this['nullabilityMap'], Record<string, JoinNullability>>, this['dynamic'], this['excludedMethods'], Assume<this['result'], any[]>, Assume<this['selectedFields'], ColumnsSelection>>;
}
interface SQLiteAsyncSelectBase<TTableName extends string | undefined, TResultType extends 'sync' | 'async', TRunResult, TSelection extends ColumnsSelection, TSelectMode extends SelectMode = 'single', TNullabilityMap extends Record<string, JoinNullability> = (TTableName extends string ? Record<TTableName, 'not-null'> : {}), TDynamic extends boolean = false, TExcludedMethods extends string = never, TResult extends any[] = SelectResult<TSelection, TSelectMode, TNullabilityMap>[], TSelectedFields extends ColumnsSelection = BuildSubquerySelection<TSelection, TNullabilityMap>> extends SQLiteSelectBase<SQLiteAsyncSelectHKT & {
  resultType: TResultType;
}, TTableName, TRunResult, TSelection, TSelectMode, TNullabilityMap, TDynamic, TExcludedMethods, TResult, TSelectedFields>, QueryPromise<TResult> {
  readonly _: SQLiteSelectBase<SQLiteAsyncSelectHKT & {
    resultType: TResultType;
  }, TTableName, TRunResult, TSelection, TSelectMode, TNullabilityMap, TDynamic, TExcludedMethods, TResult, TSelectedFields>['_'] & {
    readonly resultType: TResultType;
  };
}
declare class SQLiteAsyncSelectBase<TTableName extends string | undefined, TResultType extends 'sync' | 'async', TRunResult, TSelection, TSelectMode extends SelectMode = 'single', TNullabilityMap extends Record<string, JoinNullability> = (TTableName extends string ? Record<TTableName, 'not-null'> : {}), TDynamic extends boolean = false, TExcludedMethods extends string = never, TResult = SelectResult<TSelection, TSelectMode, TNullabilityMap>[], TSelectedFields extends ColumnsSelection = BuildSubquerySelection<TSelection, TNullabilityMap>> extends SQLiteSelectBase<SQLiteAsyncSelectHKT & {
  resultType: TResultType;
}, TTableName, TRunResult, TSelection, TSelectMode, TNullabilityMap, TDynamic, TExcludedMethods, TResult, TSelectedFields> implements RunnableQuery<TResult, 'sqlite'>, SQLWrapper {
  static readonly [entityKind]: string;
  protected session: SQLiteAsyncSession<TResultType, TRunResult, any>;
  prepare(): SQLiteAsyncSelectPrepare<this>;
  run: ReturnType<this['prepare']>['run'];
  all: ReturnType<this['prepare']>['all'];
  get: ReturnType<this['prepare']>['get'];
  values: ReturnType<this['prepare']>['values'];
  execute(): Promise<SQLiteAsyncSelectExecute<this>>;
}
type AnySQLiteAsyncSelect = SQLiteAsyncSelectBase<any, any, any, any, any, any, any, any, any, any>;
//#endregion
export { AnySQLiteAsyncSelect, SQLiteAsyncSelect, SQLiteAsyncSelectBase, SQLiteAsyncSelectBuilder, SQLiteAsyncSelectExecute, SQLiteAsyncSelectHKT, SQLiteAsyncSelectPrepare };
//# sourceMappingURL=select.d.cts.map