import { ReadinessManager } from '../src/index';
import type { ReadyCallback, ReadyAction, ActionsStatus } from '../src/types';
import type { ActionErrorHandler } from '../src/error';

export interface ReadinessManagerMock extends ReadinessManager {
    setReady: (isReady: boolean) => void;
    orchestrate: () => void;
}

/**
 * Test mock helper class.
 */
class ReadinessManagerMockImpl implements ReadinessManagerMock {
    private _ready = false;

    get ready(): boolean {
        return this._ready;
    }

    status(): ActionsStatus {
        return {} as ActionsStatus;
    }

    setReady(isReady: boolean): void {
        this._ready = isReady;
    }

    register(_name: string, _action: ReadyAction, _debug?: boolean): void {
        return undefined;
    }

    run(): ReadinessManager {
        return this;
    }

    orchestrate(): void {
        this._ready = true;
    }

    onReady(callback: ReadyCallback): ReadinessManager {
        callback();
        return this;
    }

    onActionReady(_name: string, callback: ReadyCallback): ReadinessManager {
        callback();
        return this;
    }

    onError(_errorHandler: ActionErrorHandler): ReadinessManager {
        return this;
    }
}

const manager: ReadinessManagerMock = new ReadinessManagerMockImpl();

export default manager;
