/********************************************************************************
 * 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, Input, OnInit } from '@angular/core';

import { DialogService } from 'primeng/api';
import { Observable } from 'rxjs';

import { Attribute, MDMLink } from '@navigator/node';
import { ContextAttributeIdentifier } from '@details/model/details.model';

import { FileExplorerDialogComponent } from '../file-explorer-dialog/file-explorer-dialog.component';

@Component({
  selector: 'file-link-sequence-editor',
  templateUrl: './file-link-sequence-editor.component.html'
})
export class FileLinkSequenceEditorComponent implements OnInit {

  @Input() ident: ContextAttributeIdentifier;
  @Input() attribute: Attribute;

  public link: MDMLink;
  public links: MDMLink[];

  constructor(private dialogService: DialogService) { }

  ngOnInit() {
    if (this.attribute != undefined && this.attribute.value != undefined) {
      if (this.getValues() != undefined) {
        this.links = (this.getValues<MDMLink[]>()).map(l => Object.assign(new MDMLink(), l));
      }
    }

    setTimeout(() => {
      this.onShowFileExplorerDialog();
    });
  }

  private getValues<T>() {
    if (this.attribute != undefined && this.attribute.value != undefined) {
      const tmp = this.ident.contextGroup != undefined ? this.attribute.value[this.ident.contextGroup] : this.attribute.value;
      return tmp !== '' ? tmp : undefined;
    }
  }

  public onShowFileExplorerDialog() {
    let title = 'File upload wizard for ' + this.ident.contextComponent.name;
    if (this.attribute != undefined) {
      title += '.' + this.attribute.name;
    }

    const ref = this.dialogService.open(FileExplorerDialogComponent, {
      data: {
        contextDescribable: this.ident.contextDescribable,
        contextComponent: this.ident.contextComponent,
        attribute: this.attribute,
        contextGroup: this.ident.contextGroup,
        contextType: this.ident.contextType,
        readOnly: false
      },
      header: title,
      width: '70%'
    });
  }
}
