/********************************************************************************
 * 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 { Component, OnInit, ViewChild, Input, OnDestroy } from '@angular/core';
import { FormGroup, FormControl, FormBuilder, FormArray, Validators } from '@angular/forms';
import { TranslateService } from '@ngx-translate/core';
import { DropdownModule } from 'primeng/dropdown';
import { TreeTableModule } from 'primeng/treetable';
import { TreeNode, MenuItem } from 'primeng/api';
import { ContextMenuModule } from 'primeng/contextmenu';
import { TreeTable, TreeTableToggler, DataTable } from 'primeng/primeng';
import { DialogModule } from 'primeng/dialog';
import { Observable, BehaviorSubject } from 'rxjs';

import { MDMNotificationService } from '../core/mdm-notification.service';
import { ExtSystemService } from './extsystem.service';
import { Node } from '../navigator/node';
import { NodeService } from '../navigator/node.service';

@Component( {
    selector: 'mdm-extsystem',
    templateUrl: './extsystem.component.html',
    styleUrls: ['./extsystem.component.css']
})
export class ExtSystemComponent implements OnInit, OnDestroy {

  // available external systems
  extSystems: Node[];
  bsExtSystems: BehaviorSubject<Node[]> = new BehaviorSubject<Node[]>(undefined);
  selectedEnvironment: Node;

  editorMode = false;
  selectedExtSystem: string = undefined;

  // dropdown selection
  environments: Node[];

  //  unknown -> remove
  scope: string;

  constructor(private extSystemService: ExtSystemService,
               private notificationService: MDMNotificationService,
    private translateService: TranslateService,
    private nodeService: NodeService) {

    this.bsExtSystems.subscribe(value => {
      this.extSystems = value;
    });
  }

  ngOnInit() {
    this.nodeService.getRootNodes().subscribe(
      envs => this.environments = envs,
      error => this.translateService.instant('basket.mdm-basket.err-cannot-load-sources')
        .subscribe(msg => this.notificationService.notifyError(msg, error)
    ));

    this.bsExtSystems.next(undefined);
  }

  ngOnDestroy() {
  }

  onEditModeChange(editMode: boolean) {
    this.editorMode = editMode;
  }

  onChangeSelectedExtSystem(extSystem: string) {
    this.selectedExtSystem = extSystem;
  }

  onChangeExtSystem(event: any) {
    this.extSystems = undefined;
    if (this.selectedEnvironment !== undefined) {
      this.scope = this.selectedEnvironment.sourceName;
    }
    this.extSystemService.getExtSystemForScope(this.scope).subscribe(es => this.bsExtSystems.next(es));
  }


  onPageSwitchToEdit() {
    this.onEditModeChange(true);
  }

  onPageBack() {
    this.onEditModeChange(false);
  }

}
