/********************************************************************************
 * Copyright (c) 2015-2018 Contributors to the Eclipse Foundation
 *
 * See the NOTICE file(s) distributed with this work for additional
 * information regarding copyright ownership.
 *
 * This program and the accompanying materials are made available under the
 * terms of the Eclipse Public License v. 2.0 which is available at
 * http://www.eclipse.org/legal/epl-2.0.
 *
 * SPDX-License-Identifier: EPL-2.0
 *
 ********************************************************************************/


import {Injectable, EventEmitter} from '@angular/core';
import {Http} from '@angular/http';
import {map} from 'rxjs/operators';

import {MDMNotificationService} from '../core/mdm-notification.service';
import {PreferenceService, Scope} from '../core/preference.service';
import {QueryService} from '../tableview/query.service';
import {PropertyService} from '../core/property.service';
import {MDMItem} from '../core/mdm-item';

import { TranslateService } from '@ngx-translate/core';
import { TRANSLATE } from '../core/mdm-core.module';

declare function require(path: string): any;
const defaultNodeProvider = require('./defaultnodeprovider.json');

@Injectable()
export class NodeproviderService {

  public nodeProviderChanged: EventEmitter<any> = new EventEmitter<any>();
  private nodeproviders = [defaultNodeProvider];

  private activeNodeprovider: any = this.nodeproviders[0];

  constructor(private http: Http,
              private _prop: PropertyService,
              private queryService: QueryService,
              private preferenceService: PreferenceService,
              private notificationService: MDMNotificationService,
              private translateService: TranslateService) {
      this.loadNodeproviders();
  }

  setActiveNodeprovider(nodeprovider: any) {
    this.activeNodeprovider = nodeprovider;
    this.nodeProviderChanged.emit(this.activeNodeprovider);
  }

  getActiveNodeprovider() {
    return this.activeNodeprovider;
  }

  getNodeproviders() {
    return this.nodeproviders;
  }

  loadNodeproviders() {
   this.preferenceService.getPreferenceForScope(Scope.SYSTEM, 'nodeprovider.').pipe(
      map(prefs => prefs.map(p => JSON.parse(p.value))))
      .subscribe(
        nodeproviders => this.nodeproviders = nodeproviders,
        error => this.notificationService.notifyError(
          this.translateService.instant('navigator.nodeprovider.err-cannot-load-node-provider-from-settings'), error)
      );
  }

  getQueryForChildren(item: MDMItem) {
    return this.replace(this.getSubNodeprovider(item), item);
  }

  getSubNodeprovider(item: MDMItem) {
    let current = this.activeNodeprovider;
    do {
      if (current.type === item.type && current.children) {
        return current.children.query;
      } else {
        current = current.children;
      }
    }
    while (current);

    return current;
  }

replace(query: string, item: MDMItem) {
    return '/' + item.source + query.replace(/{(\w+)\.(\w+)}/g, function(match, type, attr) {

      if (type !== item.type) {
        this.notificationService.notifyWarn(
          this.translateService.instant(TRANSLATE('navigator.nodeprovider.err-unsupported-type'),
          <any>{'type': type, 'typeToUse': item.type}));
      }

      if (attr === 'Id') {
        return item.id;
      }
    });
}

  getPathTypes(type: string): string[] {
    let current = this.activeNodeprovider;
    let ancestorList: string[] = [];
    while (current) {
        ancestorList.push(current.type);
        if (current.type === type) {
          return ancestorList;
        }
        current = current.children;
   }
    return [];
  }
}
