/********************************************************************************
 * Copyright (c) 2015-2020 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, Output, EventEmitter, OnChanges, SimpleChanges, OnInit } from '@angular/core';
import {FormGroup} from '@angular/forms';
import {Condition, Operator, OperatorUtil} from './filter.service';
import {Node} from '../navigator/node';

import {QueryService} from '../tableview/query.service';
import {AutoComplete} from 'primeng/primeng';

import {MDMNotificationService} from '../core/mdm-notification.service';

import {TranslateService} from '@ngx-translate/core';
import { DatePipe } from '@angular/common';
import { NavigatorService } from '@navigator/navigator.service';


@Component({
  selector: '[search-condition]',
  templateUrl: 'search-condition.component.html',
  styleUrls: ['search-condition.component.css'],
})
export class SearchConditionComponent implements OnChanges, OnInit {

  private readonly multiValueOperators = [Operator.LIKE, Operator.EQUALS, Operator.NOT_EQUALS];

  @Input() env: string;
  @Input() condition: Condition;
  @Input() form: FormGroup;
  @Input() disabled: boolean;
  @Input() selectedEnvs: Node[];
  @Input() defaultSourceName: string;
  @Output() onRemove = new EventEmitter<Condition>();

  suggestions: string[];
  displayedSuggestions: string[] = [];
  lastQuery: string;

  // date values for two input fields
  dateValue: Date;
  dateValueEnd: Date;

  // string values for two input fields
  stringValueStart: string = '';
  stringValueEnd: string = '';

  public isBinaryOperator = false;
  public isHandlingMultipleValues = false;

  constructor(private queryService: QueryService,
              private notificationService: MDMNotificationService,
              private translateService: TranslateService,
              private datePipe: DatePipe,
              private navigatorService: NavigatorService) { }

  ngOnInit() {
    // set default operator if empty and evaluates operator properties like multiple input, binary eg.
    this.setOperator(this.condition.operator === undefined ? Operator.EQUALS : this.condition.operator);
  }

  ngOnChanges(changes: SimpleChanges) {
    if (changes['selectedEnvs'] && this.condition.valueType === 'string') {
      this.setAutoCompleteValues();
    }

    if (changes['condition']) {
      // set initial date to today, otherwise primeNg calender breaks on undefined input.
      if (this.condition.valueType === 'date') {
        if (this.condition.value === undefined || this.condition.value[0] === undefined) {
          this.dateValue = new Date();
          this.dateValue.setHours(0, 0, 0, 0);
        } else {
          this.dateValue = new Date(this.condition.value[0]);
        }
        this.setDateValue(this.dateValue, 0);
        if (this.condition.value === undefined || this.condition.value[1] === undefined) {
          this.dateValueEnd = new Date();
          this.dateValueEnd.setHours(0, 0, 0, 0);
          this.dateValueEnd.setDate(this.dateValueEnd.getDate() + 1)
        } else {
          this.dateValueEnd = new Date(this.condition.value[1]);
        }
        this.setDateValue(this.dateValue, 1);
      }
    }
  }

  onAutocompleteBlur(event: Event, htmlElement: AutoComplete) {
    this.onEnter(undefined, htmlElement);
  }

  onEnter(e: Event, autoComplete: AutoComplete) {
    if(this.isHandlingMultipleValues) {
      let hl = autoComplete.highlightOption;
      if (hl == undefined && this.lastQuery != undefined  && this.lastQuery !== '' || hl != undefined && this.displayedSuggestions.find(s => s === hl) == undefined) {
        if (autoComplete.value[autoComplete.value.length - 1] === hl) {
          autoComplete.value.pop();
        }
        autoComplete.selectItem(this.lastQuery);
        this.lastQuery = '';
      } else if (hl != undefined && this.displayedSuggestions.find(s => s === hl) != undefined) {
        autoComplete.selectItem(this.displayedSuggestions.find(s => s === hl));
        this.lastQuery = '';
      }
      autoComplete.highlightOption = undefined;
    } else {
      this.condition.value = [this.stringValueStart, this.stringValueEnd];
    }
    this.displayedSuggestions = [];
  }

  setAutoCompleteValues() {
    this.queryService.suggestValues(this.env === 'Global' ?
        this.selectedEnvs.map(env => env.sourceName) :
        [this.env], this.condition.type, this.condition.attribute)
      .subscribe(
        values => this.suggestions = Array.from(new Set<string>(values)),
        error => this.notificationService.notifyError(
          this.translateService.instant('search.search-condition.err-cannot-initialize-autocompletion'), error)
      );
  }

  updateSuggestions(e: any) {
    if (this.suggestions) {
    this.displayedSuggestions =
      [...this.suggestions.filter(sug => sug.toLowerCase().indexOf(e.query.toLowerCase()) > -1).slice(0, 10)];
    }
    this.lastQuery = e.query;
  }

  getOperators() {
    return OperatorUtil.values();
  }

  getOperatorName(op: Operator) {
    return OperatorUtil.toString(op);
  }

  setOperator(operator: Operator) {
    this.condition.operator = operator;
    this.isBinaryOperator = operator === Operator.BETWEEN;
    this.isHandlingMultipleValues = this.multiValueOperators.some(op => op === operator);
    this.adjustInput();
  }

  private adjustInput() {
    if (this.condition.valueType === 'string') {
      if (!this.isHandlingMultipleValues) {
        this.stringValueStart = this.condition.value[0];
        this.stringValueEnd = this.condition.value[1];
      } else {
        this.condition.value = this.condition.value.filter(v => v != undefined);
      }
    }
  }

  setValue(value: string) {
    this.condition.value = [value];
  }

  setValues(value: string[]) {
    this.condition.value = value;
  }

  setDateValue(value: Date, index: number) {
    if (this.condition.value == undefined) {
      this.condition.value = [];
    }
    this.condition.value[index] = this.datePipe.transform(value, 'yyyy-MM-dd' + 'T' + 'HH:mm:ss');
  }

  remove() {
    this.onRemove.emit(this.condition);
  }
}
