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';
import { LoadingSpinnerComponent } from '../../dialogs/loading-spinner/loading-spinner.component';

@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 {
  column: string;

  @Input()
  globalSearchFilter: GlobalSearchFilter;
  oldNotification: Notification = null;
  incidentIdChange: boolean = true;


  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';
  }
}

