import { BSPlugin } from '@bs-core/shell';
import * as pg from 'pg';

type PostgreSqlConfig = {
    database: string;
    user: string;
    password: string;
    host?: string;
    port?: number;
    ssl?: boolean;
    old?: boolean;
};
type PostgreSqlCreateOptions = {
    client?: pg.PoolClient;
    id?: string;
};
type PostgreSqlReadOptions = {
    client?: pg.PoolClient;
    fields?: string[];
    criteria?: Record<string, any>;
    orderBy?: string[];
    descending?: boolean;
    groupBy?: string[];
    format?: "json" | "array";
    distinct?: boolean;
};
type PostgreSqlUpdateOptions = {
    client?: pg.PoolClient;
    criteria?: Record<string, any>;
};
type PostgreSqlDeleteOptions = {
    client?: pg.PoolClient;
    criteria?: Record<string, any>;
};
declare class PostgresSqlError {
    severity: string;
    code: string;
    detail: string;
    message: string;
    constructor(severity: string, code: string, detail: string, message: string);
}
declare class PostgreSql extends BSPlugin {
    private _pool;
    constructor(name: string, postgresqlConfig: PostgreSqlConfig);
    protected stop(): Promise<void>;
    private isServerReady;
    start(): Promise<boolean>;
    healthCheck(): Promise<boolean>;
    create(collection: string, fields: Record<string, any>, options?: PostgreSqlCreateOptions): Promise<any[]>;
    read(collection: string, readOptions?: PostgreSqlReadOptions): Promise<any[]>;
    update(collection: string, fields: Record<string, any>, updateOptions?: PostgreSqlUpdateOptions): Promise<number>;
    delete(collection: string, deleteOptions?: PostgreSqlDeleteOptions): Promise<number>;
    query(query: string, client?: pg.PoolClient): Promise<any[]>;
    exec(query: string, client?: pg.PoolClient): Promise<number>;
    connect(): Promise<pg.PoolClient>;
    release(client: pg.PoolClient): Promise<void>;
    begin(client: pg.PoolClient): Promise<void>;
    commit(client: pg.PoolClient): Promise<void>;
    rollback(client: pg.PoolClient): Promise<void>;
}

export { PostgreSql, PostgresSqlError };
export type { PostgreSqlConfig, PostgreSqlCreateOptions, PostgreSqlDeleteOptions, PostgreSqlReadOptions, PostgreSqlUpdateOptions };
