
/*
 * Copyright 2017-present Open Networking Foundation

 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at

 * http://www.apache.org/licenses/LICENSE-2.0

 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */


import * as io from 'socket.io-client';
import * as _ from 'lodash';
import {Subject, Observable} from 'rxjs/Rx';
import {IXosAppConfig} from '../../../index';

export interface IWSEvent {
  model: string;
  skip_notification?: boolean;
  deleted?: boolean;
  msg: {
    changed_fields: string[],
    object?: any,
    pk?: number
  };
}

export interface IWSEventService {
  list(): Observable<IWSEvent>;
}

export class WebSocketEvent {

  static $inject = [
    'AppConfig',
    '$log'
  ];


  private _events: Subject<IWSEvent> = new Subject<IWSEvent>();
  private socket;
  constructor(
    private AppConfig: IXosAppConfig,
    private $log: ng.ILogService
  ) {
    // NOTE list of field that are not useful to the UI
    const ignoredFields: string[] = ['created', 'updated', 'backend_register'];

    this.socket = io(this.AppConfig.websocketClient);

    this.socket.on('remove', (data: IWSEvent): void => {
      this.$log.info(`[WebSocket] Received Remove Event for: ${data.model} [${data.msg.pk}]`, data);
      this._events.next(data);

      // TODO update observers of parent classes
    });

    this.socket.on('update', (data: IWSEvent): void => {

        if (data.msg.changed_fields.length === 0 || _.intersection(data.msg.changed_fields, ignoredFields).length === data.msg.changed_fields.length) {
          // NOTE means that the only updated fields does not change anything in the UI, so don't send events around
          return;
        }

        this.$log.info(`[WebSocket] Received Event for: ${data.model} [${data.msg.pk}]`, data);

        this._events.next(data);

        // NOTE update observers of parent classes
        if (data.msg.object.class_names && angular.isString(data.msg.object.class_names)) {
          const models = data.msg.object.class_names.split(',');
          let event: IWSEvent = angular.copy(data);
          _.forEach(models, (m: string) => {
            // send event only if the parent class is not the same as the model class
            if (event.model !== m && m !== 'object') {
              event.model = m;
              event.skip_notification = true;
              this._events.next(event);
            }
          });
        }

      });
    }
    list() {
      return this._events.asObservable();
    }
}
