import {ISqlite, Statement} from "sqlite";

export type RunResult = ISqlite.RunResult;
export type SqlType = ISqlite.SqlType;

export {Statement};

export interface TypedDatabase {
    /**
     * @see Database.on
     */
    on(event: string, listener: any): Promise<void>;

    /**
     * @see Database.run
     */
    run(sql: SqlType, ...params: any[]): Promise<RunResult>;

    /**
     * @see Database.get
     */
    get<T>(sql: SqlType, ...params: any[]): Promise<T | undefined>;

    /**
     * @see Database.each
     */
    each<T>(sql: SqlType, callback: (err: any, row: T) => void): Promise<number>;

    each<T>(sql: SqlType, param1: any, callback: (err: any, row: T) => void): Promise<number>;

    each<T>(sql: SqlType, param1: any, param2: any, callback: (err: any, row: T) => void): Promise<number>;

    each<T>(sql: SqlType, param1: any, param2: any, param3: any, callback: (err: any, row: T) => void): Promise<number>;

    each<T>(sql: SqlType, ...params: any[]): Promise<number>;

    /**
     * @see Database.all
     */
    all<T = never>(sql: SqlType, ...params: any[]): Promise<T[]>;

    /**
     * @see Database.exec
     */
    exec(sql: SqlType, ...params: any[]): Promise<void>;

    /**
     * @see Database.prepare
     */
    prepare(sql: SqlType, ...params: any[]): Promise<Statement>;
}