// SPDX-License-Identifier: Apache-2.0
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
    var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
    if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
    else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
    return c > 3 && r && Object.defineProperty(target, key, r), r;
};
var __metadata = (this && this.__metadata) || function (k, v) {
    if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
};
var __param = (this && this.__param) || function (paramIndex, decorator) {
    return function (target, key) { decorator(target, key, paramIndex); }
};
import EventEmitter from "../../../core/EventEmitter";
import Service from "../Service";
import { EventListenerNotFound } from "./error/EventListenerNotFound";
import { EventNotFound } from "./error/EventNotFound";
import { singleton } from "tsyringe";
import { inject } from "tsyringe";
let EventService = class EventService extends Service {
    events;
    emitters = {};
    constructor(events) {
        super();
        this.registerEvents(events);
    }
    registerEvents(events) {
        this.events = Object.keys(events).reduce((p, c) => ({ ...p, [c]: events }), {});
    }
    getEventEmitter(event) {
        if (!Object.keys(this.events).includes(event.toString())) {
            throw new EventNotFound(`WalletEvent (${String(event)}) not registered yet`);
        }
        if (!Object.keys(this.emitters).includes(event.toString())) {
            const type = this.events[event];
            this.emitters[event] = new EventEmitter();
        }
        // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
        return this.emitters[event];
    }
    on(event, listener) {
        if (!this.events[event])
            throw new EventListenerNotFound(event.toString());
        this.getEventEmitter(event).on(event, listener);
    }
    emit(event, ...args) {
        return this.getEventEmitter(event).emit(event, ...args);
    }
    eventNames() {
        return Object.keys(this.events);
    }
};
EventService = __decorate([
    singleton(),
    __param(0, inject("WalletEvents")),
    __metadata("design:paramtypes", [Object])
], EventService);
export default EventService;
