import { EventArguments } from "@dewesoft-web/ui/events";

export type EventHandler<T> = (control : EventEmitter<T>, event : T, args : EventArguments, onSuccess? : Function, onFailure? : Function) => void;

export class EventEmitter<T> {

    private eventHandlers : EventHandler<T>[];

    constructor() {
        this.eventHandlers = [];
    }

    addEventHandler(handler : EventHandler<T>) {
        if (!handler) {
            throw new Error("Event handler must be valid function");
        }
        this.eventHandlers.push(handler);
    }

    removeEventHandler(handler : EventHandler<T>) {
        const index = this.eventHandlers.indexOf(handler);

        if (index !== -1) {
            this.eventHandlers.splice(index, 1);
        }
    }

    protected triggerEvent(event : T, args : EventArguments, onSuccess? : Function, onFailure? : Function) {
        for (const handler of this.eventHandlers) {
            handler(this, event, args, onSuccess, onFailure);
        }
    }
}
