/**
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you under the Apache License, Version 2.0 (the
 * "License"); you may not use this file except in compliance
 * with the License.  You may obtain a copy of the License at
 *
 *   http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing,
 * software distributed under the License is distributed on an
 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 * KIND, either express or implied.  See the License for the
 * specific language governing permissions and limitations
 * under the License.
 */
import {Component, OnInit} from '@angular/core';
import {ActivatedRoute, Params, Router} from '@angular/router';
import {Employee} from '../services/office/domain/employee.model';
import {FetchRequest} from '../services/domain/paging/fetch-request.model';
import {TableData} from '../common/data-table/data-table.component';
import {Store} from '@ngrx/store';
import * as fromRoot from '../store';
import {Observable} from 'rxjs/Observable';
import {SEARCH} from '../store/employee/employee.actions';
import {OfficeService} from '../services/office/office.service';



@Component({
  selector: 'fims-center',
  templateUrl: './center.component.html'
})
export class CenterComponent implements OnInit {

  employeeData$: Observable<TableData>;

  loading$: Observable<boolean>;

  DataArray: any =[];
  
  
  columns: any[] = [
    { name: 'name', label: 'Name' },
    { name: 'accountNumber', label: 'Account #' },
    { name: 'id', label: 'External Id' },
    { name: 'status', label: 'Status' },
    { name: 'office', label: 'Office' }
  ];

  searchTerm: string;

  private lastFetchRequest: FetchRequest = {};

  constructor(private router: Router, private route: ActivatedRoute, private store: Store<fromRoot.State>, public data: OfficeService) {}

  ngOnInit(): void {

    this.employeeData$ = this.store.select(fromRoot.getEmployeeSearchResults)
      .map(employeePage => ({
        data: employeePage.employees,
        totalElements: employeePage.totalElements,
        totalPages: employeePage.totalPages
      }));

    this.loading$ = this.store.select(fromRoot.getEmployeeSearchLoading);

    this.route.queryParams.subscribe((params: Params) => {
      this.search(params['term']);
    });
    this.LoadTableData();
   
  }

  search(searchTerm: string): void {
    this.searchTerm = searchTerm;
    this.fetchEmployees();
  }

  rowSelect(row: Employee): void {
    this.router.navigate(['/detail']);
  }

  fetchEmployees(fetchRequest?: FetchRequest) {
    if (fetchRequest) {
      this.lastFetchRequest = fetchRequest;
    }

    this.lastFetchRequest.searchTerm = this.searchTerm;

    this.store.dispatch({ type: SEARCH, payload: this.lastFetchRequest });
  }

  LoadTableData(){
    this.data.allCenters().subscribe(
      data => {
        this.DataArray = data;
        console.log(data);
      }
    )
  }


}
