import {Gateway, GatewayClient, GatewayMessage} from '@interopio/gateway-server/gateway-ent';
import {GatewayServer} from '@interopio/gateway-server';

export class ServerDelegate implements Gateway {
    private server?: GatewayServer.Server;

    constructor(private readonly config: GatewayServer.ServerConfig) {
    }

    async connect(cb: (client: GatewayClient, msg: GatewayMessage) => void): Promise<GatewayClient> {
        if (!this.server) {
            throw new Error(`not started`);
        }
        const client = await this.server.gateway.connect((c, m) => cb(c as unknown as GatewayClient, m as GatewayMessage));
        return client as unknown as GatewayClient;
    }

    info(): { endpoint: string } {
        return this.server?.gateway.info() as { endpoint: string };
    }

    async start(): Promise<Gateway> {
        if (!this.server) {
            this.server = await GatewayServer.Factory(this.config);
        }
        return this;
    }

    async stop(): Promise<Gateway> {
        await this.server?.close();
        delete this.server;
        return this;
    }
}
