import { IContext } from 'pip-services4-components-node';
import { ConfigParams } from 'pip-services4-components-node';
import { IReferences } from 'pip-services4-components-node';
import { FilterParams } from 'pip-services4-data-node';
import { PagingParams } from 'pip-services4-data-node';
import { DataPage } from 'pip-services4-data-node';
import { CommandableLambdaClient } from 'pip-services4-aws-node';
import { CompositeLogger } from 'pip-services4-observability-node'
import { CompositeCounters } from 'pip-services4-observability-node'

import { CounterV1 } from './CounterV1';
import { IPerfMonClientV1 } from './IPerfMonClientV1';

export class PerfMonCommandableLambdaClientV1 extends CommandableLambdaClient implements IPerfMonClientV1 {

    constructor(config?: any) {
        super('counters');

        if (config != null)
            this.configure(ConfigParams.fromValue(config));
    }
        
    public setReferences(references: IReferences) {
        super.setReferences(references);
        this._logger = new CompositeLogger();
        this._counters = new CompositeCounters();
    }

    public async readCounters(context: IContext, filter: FilterParams, paging: PagingParams): Promise<DataPage<CounterV1>> {
        return await this.callCommand(
            'read_counters',
            context,
            {
                filter: filter,
                paging: paging
            }
        );
    }

    public async writeCounter(context: IContext, counter: CounterV1): Promise<CounterV1> {
        return await this.callCommand(
            'write_counter',
            context,
            {
                counter: counter
            }
        );
    }

    public async writeCounters(context: IContext, counters: CounterV1[]): Promise<void> {
        return await this.callCommand(
            'write_counters',
            context,
            {
                counters: counters
            }
        );
    }

    public async clear(context: IContext): Promise<void> {
        return await this.callCommand(
            'clear',
            context,
            null
        );
    }
}
