import { inject, injectable, postConstruct } from 'inversify';
import { Disposable } from '@theia/core/lib/common/disposable';
import { StatusBarAlignment } from '@theia/core/lib/browser/status-bar/status-bar';
import {
    FrontendConnectionStatusService as TheiaFrontendConnectionStatusService,
    ApplicationConnectionStatusContribution as TheiaApplicationConnectionStatusContribution,
    ConnectionStatus
} from '@theia/core/lib/browser/connection-status-service';
import { ArduinoDaemonClientImpl } from '../../arduino-daemon-client-impl';

@injectable()
export class FrontendConnectionStatusService extends TheiaFrontendConnectionStatusService {

    @inject(ArduinoDaemonClientImpl)
    protected readonly daemonClient: ArduinoDaemonClientImpl;

    @postConstruct()
    protected init(): void {
        this.schedulePing();
        this.wsConnectionProvider.onIncomingMessageActivity(() => {
            // natural activity
            this.updateStatus(this.daemonClient.isRunning);
            this.schedulePing();
        });
    }

}

@injectable()
export class ApplicationConnectionStatusContribution extends TheiaApplicationConnectionStatusContribution {

    @inject(ArduinoDaemonClientImpl)
    protected readonly daemonClient: ArduinoDaemonClientImpl;

    protected onStateChange(state: ConnectionStatus): void {
        if (!this.daemonClient.isRunning && state === ConnectionStatus.ONLINE) {
            return;
        }
        super.onStateChange(state);
    }

    protected handleOffline(): void {
        const { isRunning } = this.daemonClient;
        this.statusBar.setElement('connection-status', {
            alignment: StatusBarAlignment.LEFT,
            text: isRunning ? 'Offline' : '$(bolt) CLI Daemon Offline',
            tooltip: isRunning ? 'Cannot connect to the backend.' : 'Cannot connect to the CLI daemon.',
            priority: 5000
        });
        this.toDisposeOnOnline.push(Disposable.create(() => this.statusBar.removeElement('connection-status')));
        document.body.classList.add('theia-mod-offline');
        this.toDisposeOnOnline.push(Disposable.create(() => document.body.classList.remove('theia-mod-offline')));
    }

}