import { PgDialect } from "../dialect.cjs";
import { PgBasePreparedQuery, PgQueryResultHKT, PgSession, PgTransactionConfig, PreparedQueryConfig } from "../session.cjs";
import { PgEffectDatabase } from "./db.cjs";
import { entityKind } from "../../entity.cjs";
import { Query, SQL } from "../../sql/sql.cjs";
import { MigrationConfig, MigrationMeta } from "../../migrator.cjs";
import { AnyRelations, EmptyRelations } from "../../relations.cjs";
import { WithCacheConfig } from "../../cache/core/types.cjs";
import * as Effect from "effect/Effect";
import { EffectCacheShape } from "../../cache/core/cache-effect.cjs";
import { SqlError } from "effect/unstable/sql/SqlError";
import { EffectTransactionRollbackError, MigratorInitError } from "../../effect-core/errors.cjs";
import { EffectLoggerShape } from "../../effect-core/logger.cjs";
import { QueryEffectHKTBase, QueryEffectKind } from "../../effect-core/query-effect.cjs";

//#region src/pg-core/effect/session.d.ts
declare class PgEffectPreparedQuery<T extends PreparedQueryConfig, TEffectHKT extends QueryEffectHKTBase = QueryEffectHKTBase> extends PgBasePreparedQuery {
  protected executor: (params?: unknown[]) => Effect.Effect<unknown, unknown, unknown>;
  readonly mode: 'arrays' | 'objects' | 'raw';
  private logger;
  protected cache: EffectCacheShape;
  protected queryMetadata: {
    type: 'select' | 'update' | 'delete' | 'insert';
    tables: string[];
  } | undefined;
  protected cacheConfig: WithCacheConfig | undefined;
  static readonly [entityKind]: string;
  constructor(executor: (params?: unknown[]) => Effect.Effect<unknown, unknown, unknown>, query: Query, mapper: ((rows: any[]) => any) | undefined, mode: 'arrays' | 'objects' | 'raw', logger: EffectLoggerShape, cache: EffectCacheShape, queryMetadata: {
    type: 'select' | 'update' | 'delete' | 'insert';
    tables: string[];
  } | undefined, cacheConfig: WithCacheConfig | undefined);
  execute(placeholderValues?: Record<string, unknown>): QueryEffectKind<TEffectHKT, T['execute']>;
}
declare abstract class PgEffectSession<TEffectHKT extends QueryEffectHKTBase = QueryEffectHKTBase, TQueryResult extends PgQueryResultHKT = PgQueryResultHKT, TRelations extends AnyRelations = EmptyRelations> extends PgSession {
  static readonly [entityKind]: string;
  constructor(dialect: PgDialect);
  abstract prepareQuery<T extends PreparedQueryConfig = PreparedQueryConfig>(query: Query, mode: 'arrays' | 'objects' | 'raw', name: string | boolean, mapper?: (rows: any[]) => any, queryMetadata?: {
    type: 'select' | 'update' | 'delete' | 'insert';
    tables: string[];
  }, cacheConfig?: WithCacheConfig): PgEffectPreparedQuery<T, TEffectHKT>;
  execute<T>(query: SQL): QueryEffectKind<TEffectHKT, T[]>;
  arrays<T>(query: SQL): QueryEffectKind<TEffectHKT, T[]>;
  objects<T>(query: SQL): QueryEffectKind<TEffectHKT, T[]>;
  abstract transaction<A, E, R>(transaction: (tx: PgEffectTransaction<TEffectHKT, TQueryResult, TRelations>) => Effect.Effect<A, E, R>, config?: PgTransactionConfig): Effect.Effect<A, E | SqlError, R>;
}
declare abstract class PgEffectTransaction<TEffectHKT extends QueryEffectHKTBase, TQueryResult extends PgQueryResultHKT, TRelations extends AnyRelations = EmptyRelations> extends PgEffectDatabase<TEffectHKT, TQueryResult, TRelations> {
  protected relations: TRelations;
  protected readonly nestedIndex: number;
  static readonly [entityKind]: string;
  constructor(dialect: PgDialect, session: PgEffectSession<TEffectHKT, any, any>, relations: TRelations, nestedIndex?: number, parseRqbJson?: boolean);
  rollback(): EffectTransactionRollbackError;
  setTransaction(config: PgTransactionConfig): Effect.Effect<void, TEffectHKT["error"], TEffectHKT["context"]>;
  abstract transaction<A, E, R>(transaction: (tx: PgEffectTransaction<TEffectHKT, TQueryResult, TRelations>) => Effect.Effect<A, E, R>): Effect.Effect<A, E | SqlError, R>;
}
declare const migrate: <TEffectHKT extends QueryEffectHKTBase>(migrations: MigrationMeta[], session: PgEffectSession<TEffectHKT, PgQueryResultHKT, EmptyRelations>, config: string | MigrationConfig) => Effect.Effect<undefined, MigratorInitError | SqlError | TEffectHKT["error"], TEffectHKT["context"]>;
//#endregion
export { PgEffectPreparedQuery, PgEffectSession, PgEffectTransaction, migrate };
//# sourceMappingURL=session.d.cts.map