import {Database, Statement} from "sqlite";

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

export class MockStatement implements Statement {
    constructor() {}

    readonly changes: number = 0;
    readonly lastID: number = 0;
    readonly sql: string = "";

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

    async bind(): Promise<Statement>;
    async bind(...params: any[]): Promise<Statement>;
    async bind(...params: any[]): Promise<Statement> {
        return mockStatement();
    }

    async each(callback?: (err: Error, row: any) => void): Promise<number>;
    async each(...params: any[]): Promise<number>;
    async each(...callback: (((err: Error, row: any) => void) | any)[]): Promise<number> {
        return 0;
    }

    async finalize(): Promise<void> {}

    get(): Promise<any>;
    get(...params: any[]): Promise<any>;
    get<T>(): Promise<T>;
    get<T>(...params: any[]): Promise<T>;
    get(...params: any[]): any {
    }

    async reset(): Promise<Statement> {
        return mockStatement();
    }

    async run(): Promise<Statement>;
    async run(...params: any[]): Promise<Statement>;
    async run(...params: any[]): Promise<Statement> {
        return mockStatement();
    }
}

function mockStatement(): Statement {
    return new MockStatement();
}

export class MockDatabase implements Database {
    constructor() {}

    async close(): Promise<void> {}

    async run(...args: any): Promise<Statement> {
        return mockStatement();
    }

    async get(...args: any): Promise<any> {}

    async all(...args: any): Promise<any[]> {
        return [];
    }

    async exec(...args: any): Promise<Database> {
        return this;
    }

    async each(...args: any): Promise<number> {
        return 0;
    }

    async prepare(...args: any): Promise<Statement> {
        return mockStatement();
    }

    configure(...args: any): void {}

    async migrate(...args: any): Promise<Database> {
        return this;
    }

    on(...args: any): void {}
}

export const db: MockDatabase = new MockDatabase();

export {Database, Statement}