import type { ApplicationContract } from '@ioc:Adonis/Core/Application';

/*
|--------------------------------------------------------------------------
| Provider
|--------------------------------------------------------------------------
|
| Your application is not ready when this file is loaded by the framework.
| Hence, the top level imports relying on the IoC container will not work.
| You must import them inside the life-cycle methods defined inside
| the provider class.
|
| @example:
|
| public async ready () {
|   const Database = this.app.container.resolveBinding('Adonis/Lucid/Database')
|   const Event = this.app.container.resolveBinding('Adonis/Core/Event')
|   Event.on('db:query', Database.prettyPrint)
| }
|
*/
export default class QueryBuilderProvider {
    constructor(protected app: ApplicationContract) {}

    public register() {
        // Register your own bindings
    }

    public async boot() {
        // All bindings are ready, feel free to use them
        const { ModelQueryBuilder } = this.app.container.resolveBinding('Adonis/Lucid/Database');

        ModelQueryBuilder.macro('pluck', async function (valueColumn: string, id?: string) {
            let rolesPluck = {};
            (await this).forEach((user, index) => {
                let idc;
                if (!id) {
                    idc = index;
                } else {
                    idc = user[id];
                }
                const value = user[valueColumn];
                // rolesPluck[idc] = user.name;
                rolesPluck[idc] = value;
            });
            return rolesPluck;
        });
    }

    public async ready() {
        // App is ready
    }

    public async shutdown() {
        // Cleanup, since app is going down
    }
}
