import { Injectable } from '@angular/core';

import { Observable, Subject } from 'rxjs';

import { RPCSubscriber } from '@loafer/ng-rpc';
import { LoggerService } from '@loafer/ng-logger';

import { Probe } from '@overflow/commons-typescript/model/probe';

export interface ProbeNotify {
  method: string;
  params: Probe;
}

export class ProbeSubscriberSubject extends Subject<ProbeNotify> {

}

@Injectable()
export class ProbeSubscriber {
  private probeSubscriberSubject: ProbeSubscriberSubject;

  public constructor(
    private loggerService: LoggerService,
  ) {
    this.probeSubscriberSubject = null;
  }

  public observable(): Observable<ProbeNotify> {
    if (null === this.probeSubscriberSubject) {
      this.probeSubscriberSubject = new ProbeSubscriberSubject();
    }
    return this.probeSubscriberSubject.asObservable();
  }

  private publish(method: string, params: any): void {
    this.probeSubscriberSubject.next({ method: method, params: params });
  }

  @RPCSubscriber({method: 'ProbeService.onConnect'})
  public onConnect(probe: Probe): void {
    this.loggerService.debug('ProbeService.onConnect probe:', probe);

    this.publish('ProbeService.onConnect', probe);
  }

  @RPCSubscriber({method: 'ProbeService.onDisconnect'})
  public onDisconnect(probe: Probe): void {
    this.loggerService.debug('ProbeService.onDisconnect noAuthProbe:', probe);

    this.publish('ProbeService.onDisconnect', probe);
  }
}