/**
 * 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, EventEmitter, Input, OnInit, Output} from '@angular/core';
import {FetchRequest} from '../../services/domain/paging/fetch-request.model';
import {Observable} from 'rxjs/Observable';
import {Employee} from '../../services/office/domain/employee.model';
import {OfficeService} from '../../services/office/office.service';
import {EmployeePage} from '../../services/office/domain/employee-page.model';

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

  @Input() title: string;

  @Input() preSelection: string[];

  @Input() multiple = true;

  @Output() onSelectionChange: EventEmitter<any> = new EventEmitter();

  employees: Observable<Employee[]>;

  constructor(private officeService: OfficeService) {}

  ngOnInit(): void {
    this.onSearch();
  }

  onSearch(searchTerm?: string): void {
    const fetchRequest: FetchRequest = {
      page: {
        pageIndex: 0,
        size: 5
      },
      searchTerm
    };
    this.employees = this.officeService.listEmployees(fetchRequest).map((employeePage: EmployeePage) => employeePage.employees);
  }

  selectionChange(selections: string[]): void {
    this.onSelectionChange.emit(selections);
  }

}
