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

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

export class MockDatabase implements TypedDatabase {
    // eslint-disable-next-line @typescript-eslint/no-empty-function
    constructor() {}

    // eslint-disable-next-line @typescript-eslint/no-unused-vars
    async on(event: string, listener: unknown): Promise<void> {
        return;
    }

    // eslint-disable-next-line @typescript-eslint/no-unused-vars
    async run(sql: SqlType, ...params: unknown[]): Promise<RunResult> {
        return {
            stmt: new Statement(new sqlite3.Statement()),
        };
    }

    async get<T = unknown>(
        // eslint-disable-next-line @typescript-eslint/no-unused-vars
        sql: SqlType,
        // eslint-disable-next-line @typescript-eslint/no-unused-vars
        ...params: unknown[]
    ): Promise<T | undefined> {
        return undefined;
    }

    async each<T = unknown>(
        sql: SqlType,
        callback: (err: unknown, row: T) => void
    ): Promise<number>;
    async each<T = unknown>(
        sql: SqlType,
        param1: unknown,
        callback: (err: unknown, row: T) => void
    ): Promise<number>;
    async each<T = unknown>(
        sql: SqlType,
        param1: unknown,
        param2: unknown,
        callback: (err: unknown, row: T) => void
    ): Promise<number>;
    async each<T = unknown>(
        sql: SqlType,
        param1: unknown,
        param2: unknown,
        param3: unknown,
        callback: (err: unknown, row: T) => void
    ): Promise<number>;
    // eslint-disable-next-line @typescript-eslint/no-unused-vars
    async each<T = unknown>(
        sql: SqlType,
        ...params: unknown[]
    ): Promise<number>;
    // eslint-disable-next-line @typescript-eslint/no-unused-vars
    async each(sql: SqlType, ...callback: unknown[]): Promise<number> {
        return 0;
    }

    // eslint-disable-next-line @typescript-eslint/no-unused-vars
    async all<T>(sql: SqlType, ...params: unknown[]): Promise<T[]> {
        return [];
    }

    // eslint-disable-next-line @typescript-eslint/no-unused-vars
    async exec(sql: SqlType, ...params: unknown[]): Promise<void> {
        return;
    }

    // eslint-disable-next-line @typescript-eslint/no-unused-vars
    async prepare(sql: SqlType, ...params: unknown[]): Promise<Statement> {
        return new Statement(new sqlite3.Statement());
    }
}

export const db: MockDatabase = new MockDatabase();

export { TypedDatabase, Statement };