import { Component, Input, SimpleChanges, OnChanges } from '@angular/core';
import { AbstractListComponent } from '../abstract-list/abstract-list.component';
import { StringToDatePipe } from '../../common-components/pipes/string-to-date.pipe';
import { FormattedTimestampPipe } from '../../common-components/pipes/formatted-timestamp.pipe';
import { Notification } from '../../model/notification';
import { StatusEn } from '../../common/enums';
import { GlobalSearchFilter } from '../../model/global-search-filter';
import { MessageService, MessageDefines } from '../../services/message.service';
import { SearchResultService } from '../../services/search-result.service';
import { NotificationService } from '../../services/notification.service'; //TODO remove this from abstract list
import { ReminderService } from '../../services/reminder.service'; //TODO remove this from abstract list
import { DaterangepickerConfig } from 'ng2-daterangepicker'; //TODO remove this from abstract list
import { SessionContext } from '../../common/session-context';

@Component({
  selector: 'app-search-result-list',
  templateUrl: './search-result-list.component.html',
  styleUrls: ['./search-result-list.component.css', '../abstract-list/abstract-list.component.css'],
})
export class SearchResultListComponent extends AbstractListComponent implements OnChanges {

  @Input()
  globalSearchFilter: GlobalSearchFilter;
  oldNotification: Notification = null;
  sameIncidentId: boolean = false;

 
  spinCtrl: boolean = false;
  constructor(protected messageService: MessageService,
    protected searchResultService: SearchResultService,
    protected notificationService: NotificationService, protected reminderService: ReminderService,
    protected sessionContext: SessionContext,
    protected daterangepickerConfig: DaterangepickerConfig) {
    super(messageService, notificationService, reminderService, sessionContext, daterangepickerConfig)
  }

  public isStatusClassFinished(fkRefStatus: number): boolean {
    switch (fkRefStatus) {
      case StatusEn.done:
        return true;
      default:
        return false;
    }
  }

  getSearchResults(): void {
    this.searchResultService.getSearchResults(this.globalSearchFilter)
      .subscribe(resultNotifications => {
        this.setNotifications(resultNotifications);
        this.showSpinner = false;
      },
      error => {
        this.showSpinner = false;
        console.log(error);
        this.setError(error);
      }
      );
    this.showSpinner = true;
  }

  ngOnChanges(changes: SimpleChanges) {
    if (changes['globalSearchFilter'] !== undefined
      && changes['globalSearchFilter'].currentValue !== undefined) {
      this.getSearchResults();
    }
  }

  isBranchGas(branchId: number): boolean {
    return this.sessionContext.getBranchClassById(branchId) == 'gas';
  }

  isBranchPower(branchId: number): boolean {
    return this.sessionContext.getBranchClassById(branchId) == 'power';
  }

  isBranchWater(branchId: number): boolean {
    return this.sessionContext.getBranchClassById(branchId) == 'water';
  }

  isBranchHeating(branchId: number): boolean {
    return this.sessionContext.getBranchClassById(branchId) == 'heating';
  }

  isSameIncidentId(actualNotification: Notification): boolean {
    if (this.oldNotification == null || this.oldNotification == undefined || this.oldNotification.incidentId != actualNotification.incidentId) {
      this.oldNotification = actualNotification;
      this.sameIncidentId = false;
    }
    else {
      this.sameIncidentId = true;
    }
    return this.sameIncidentId;
  }
}
