/********************************************************************************
 * 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 { Pipe, PipeTransform } from '@angular/core';
import { TranslateService } from '@ngx-translate/core';
import { Observable, of } from 'rxjs';
import { Attribute, MDMLink, ContextGroup } from '../navigator/node';

@Pipe({name: 'attributeValue'})
export class AttributeValuePipe implements PipeTransform {

  constructor(private translateService: TranslateService) {}

  transform(attr: Attribute, contextGroup?: ContextGroup) {
    let display = new Observable<string>();

    if (attr != undefined && attr.value != undefined) {

      const value = contextGroup != undefined ? attr.value[contextGroup] : attr.value;

      if (value != undefined) {
        switch (attr.dataType) {
          case 'FILE_LINK':
            const link: MDMLink = Object.assign(new MDMLink(), value);
            display = of(link.getFileName());
            break;
          case 'FILE_LINK_SEQUENCE':
            const links = value as MDMLink[];
            if (links != undefined) {
              switch (links.length) {
                case 0:
                  display = this.translateService.get('navigator.attribute-value.msg-no-files-attached');
                  break;
                case 1:
                  display = this.translateService.get('navigator.attribute-value.msg-one-file-attached');
                  break;
                default:
                  display = this.translateService.get('navigator.attribute-value.msg-x-files-attached', {numberOfFiles: links.length});
              }
            }
            break;
          default:
            display = of(value);
        }
      }
    }
    return display;
  }
}
