import { rhamtEvents } from 'raas-core';
import { RaasClient } from 'raas-client';

export interface EditorDelegate {
    onOptionChanged: rhamtEvents.TypedEvent<{id: string, option: string, value: any}>;
    onOptionAdded: rhamtEvents.TypedEvent<{option: string, value: any}>;
    onRaasClientChanged: rhamtEvents.TypedEvent<{host: string, port: number}>;
    onConnectRaasClient: rhamtEvents.TypedEvent<void>;
    onDisconnectRaasClient: rhamtEvents.TypedEvent<void>;
    onStartAnalaysis: rhamtEvents.TypedEvent<void>;
    onCancelAnalaysis: rhamtEvents.TypedEvent<void>;
    onCliChanged: rhamtEvents.TypedEvent<{id: string}>;
    onAddInstallation: rhamtEvents.TypedEvent<{location: string, name: string, version: string}>;
    onJavaHomeChanged: rhamtEvents.TypedEvent<{location: string}>;
    onDisposed: rhamtEvents.TypedEvent<void>;
    raasClientStarting(raasClient: RaasClient): void;
    raasClientConnected(raasClient: RaasClient): void;
    raasClientDisconnected(raasClient: RaasClient): void;
    unableToConnectRaasClient(raasClient: RaasClient): void;
    listen(): void;
}

export abstract class AbstractEditorDelegate implements EditorDelegate {
    onOptionChanged = new rhamtEvents.TypedEvent<{id: string, option: string, value: any}>();
    onOptionAdded = new rhamtEvents.TypedEvent<{option: string, value: any}>();
    onRaasClientChanged = new rhamtEvents.TypedEvent<{host: string, port: number}>();
    onConnectRaasClient = new rhamtEvents.TypedEvent<void>();
    onDisconnectRaasClient = new rhamtEvents.TypedEvent<void>();
    onStartAnalaysis = new rhamtEvents.TypedEvent<void>();
    onCancelAnalaysis = new rhamtEvents.TypedEvent<void>();
    onCliChanged = new rhamtEvents.TypedEvent<{id: string}>();
    onAddInstallation = new rhamtEvents.TypedEvent<{location: string, name: string, version: string}>();
    onJavaHomeChanged = new rhamtEvents.TypedEvent<{location: string}>();
    onDisposed = new rhamtEvents.TypedEvent<void>();
    abstract raasClientStarting(raasClient: RaasClient): void;
    abstract raasClientConnected(raasClient: RaasClient): void;
    abstract raasClientDisconnected(raasClient: RaasClient): void;
    abstract unableToConnectRaasClient(raasClient: RaasClient): void;
    abstract listen(): void;
}