/********************************************************************************
 * Copyright © 2018 Mettenmeier GmbH.
 *
 * 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, OnInit, Injector, OnDestroy } from '@angular/core';
import { Validators } from '@angular/forms';

import { AbstractFormComponent } from '@shared/abstract/abstract-form/abstract-form.component';
import { PlanningService } from '@schedule/services/planning.service';
import { FormUtil } from '@shared/utils/form.util';
import { MasterdataService } from '@masterdata/services/masterdata.service';
import { ReportingService } from '@reporting/services/reporting.service';
import { StandbySearchList } from '@shared/model/StandbySearchList';
import { StandbySearchBranches } from '@shared/model/StandbySearchBranches';
import { StandbylistObject } from '@shared/model/StandbylistObject';

@Component({
  selector: 'ok-dashboard',
  templateUrl: './dashboard.component.html',
  styleUrls: ['./dashboard.component.scss']
})
export class DashboardComponent extends AbstractFormComponent implements OnInit, OnDestroy {
  rowData: any;
  searchList: StandbySearchList[];
  branches: StandbySearchBranches[] = [];
  standbylistSelectionData: StandbylistObject[];
  intervalRef;

  constructor(
    private planningService: PlanningService,
    private reportingService: ReportingService,
    private masterDataService: MasterdataService,
    private injector: Injector
  ) {
    super(injector);
  }

  ngOnInit() {
    this.createForm();
    FormUtil.setDefaultDate(this.form, 'dateIndex');
    this.getSearchList();
    this.getStandbyListData();
    this.search();
    this.form.get('locationId').valueChanges.subscribe((data) => {
      this.masterDataService.getLocation(data).subscribe((locationData) => {
        this.branches = this.convertToMultiSelect(locationData.lsLocationForBranches);
        this.search();
      });
    });
  }

  createForm() {
    let now = new Date();
    this.form = this.fb.group({
      dateIndex: ['', Validators.required],
      timeIndex: {
        hour: now.getHours(),
        minute: now.getMinutes(),
        second: now.getSeconds()
      },
      locationId: '',
      lsBranchSelected: [],
      listId: ''
    });

    this.intervalRef = setInterval(() => {
      now = new Date();
      this.form.patchValue({
        timeIndex:
        {
          hour: now.getHours(),
          minute: now.getMinutes(),
          second: now.getSeconds()
        }
      });
    }, 1000 * 60);
  }

  convertToMultiSelect(branches): StandbySearchBranches[] {
    return branches.map(elem => {
      return {
        label: elem.title,
        value: { id: elem.branchId, title: elem.title }
      };
    });
  }

  search() {
    if (FormUtil.validate(this.form)) {
      const formValue = this.form.getRawValue();
      FormUtil.formatDates(formValue, ['dateIndex']);
      this.planningService.searchCurrentStandby(formValue).subscribe((searchRes) => {
        this.rowData = searchRes;
      });
    }
  }

  getSearchList() {
    this.reportingService.getSearchList().subscribe((searchData) => {
      this.searchList = searchData;
    });
  }

  getStandbyListData() {
    this.masterDataService.getStandbyListDropdown().subscribe((standbylistRes: StandbylistObject[]) => {
      this.standbylistSelectionData = standbylistRes;
    });
  }

  setDefaultDate(field: string) {
    FormUtil.setDefaultDate(this.form, field);
  }

  ngOnDestroy() {
    clearInterval(this.intervalRef);
  }
}
