import {RunResult, SqlType, Statement, TypedDatabase} from "../../types";
import * as sqlite3 from "sqlite3";

export async function init(): Promise<void> {
}

export class MockDatabase implements TypedDatabase {
    constructor() {
    }

    async on(event: string, listener: any): Promise<void> {
    }

    async run(sql: SqlType, ...params: any[]): Promise<RunResult> {
        return {
            stmt: new Statement(new sqlite3.Statement()),
        };
    }

    async get<T = any>(sql: SqlType, ...params: any[]): Promise<T | undefined> {
        return undefined;
    }

    async each<T = any>(sql: SqlType, callback: (err: any, row: T) => void): Promise<number>;
    async each<T = any>(sql: SqlType, param1: any, callback: (err: any, row: T) => void): Promise<number>;
    async each<T = any>(sql: SqlType, param1: any, param2: any, callback: (err: any, row: T) => void): Promise<number>;
    async each<T = any>(sql: SqlType, param1: any, param2: any, param3: any, callback: (err: any, row: T) => void): Promise<number>;
    async each<T = any>(sql: SqlType, ...params: any[]): Promise<number>;
    async each(sql: SqlType, ...callback: (any)[]): Promise<number> {
        return 0;
    }

    async all<T>(sql: SqlType, ...params: any[]): Promise<T[]> {
        return [];
    }

    async exec(sql: SqlType, ...params: any[]): Promise<void> {
    }


    async prepare(sql: SqlType, ...params: any[]): Promise<Statement> {
        return new Statement(new sqlite3.Statement());
    }
}

export const db: MockDatabase = new MockDatabase();

export {TypedDatabase, Statement}