type SequentialCallback = (row: any, index: number) => void;

export const ISOLATION_READ_UNCOMMITTED: number[];
export const ISOLATION_READ_COMMITED_NO_WAIT: number[];
export const ISOLATION_READ_COMMITED: number[];
export const ISOLATION_REPEATABLE_READ: number[];
export const ISOLATION_SERIALIZABLE: number[];
export const ISOLATION_READ_COMMITED_READ_ONLY: number[];

export type Isolation = number[];

export interface Database {

    query(query: string, params?: any[], queryLimit?: number): Promise<any[]>;

    queryOne(query: string, params?: any[]): Promise<any>;

    execute(query: string, params?: any[], queryLimit?: number): Promise<any>;

    executeOne(query: string, params?: any[]): Promise<any[]>;

    sequentially(query: string, params?: any[], rowCallback?: SequentialCallback, asArray?: boolean): Promise<any>

}

export interface DirectDatabase extends Database {

    detach(): Promise<any>;

    transaction(): Promise<DirectTransaction>;

    transaction(isolation: Isolation): Promise<DirectTransaction>;
}

export interface Transaction extends Database {

}

export interface DirectTransaction extends Transaction {
    commit(): Promise<any>;

    rollback(): Promise<any>;
}

export interface Options {
    host?: string;
    port?: number;
    database?: string;
    user?: string;
    password?: string;
    lowercase_keys?: boolean;
    role?: string;
    pageSize?: number;
    encoding?: string;
    cacheQuery?: boolean;
}

export interface Connection {

    getDataBaseFromPool(usuario: number, descricao: string): Promise<DirectDatabase>;

    openDataBaseRead(usuario?: number, descricao?: string): Promise<Database>;

    openDataBaseWrite(usuario?: number, descricao?: string): Promise<Transaction>;

    openDataBaseImageRead(usuario?: number, descricao?: string): Promise<Database>;

    openDataBaseImageWrite(usuario?: number, descricao?: string): Promise<Transaction>;

}

export interface User {
    usuario: number
}

// noinspection JSUnusedGlobalSymbols
export interface Request {
    firebird: Connection,
    user?: User;
    originalUrl?: string
}

export function databaseParser(): Function;

export function attachPool(usuario: number, descricao: string): Promise<DirectDatabase>;

export function attachPoolImage(usuario: number, descricao: string): Promise<DirectDatabase>;

export function attachDataBase(options: Options): Promise<DirectDatabase>;

export function createDataBase(options: Options): Promise<DirectDatabase>;

export function dropDataBase(options: Options): Promise<void>;

export function poolStatus(): Promise<{
    dbinuse: number,
    internaldb: { count: number };
    pooldb: { count: number }
}>;


export interface GDSError {
    name: string;
    message: string;
    stack?: string;
    gdserrors?: {
        gdscode: number,
        params: string[],
        text: string
    }[];
}