/********************************************************************************
 * 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, OnDestroy, Injector } from '@angular/core';
import { FormGroup, Validators } from '@angular/forms';
import { NgbModalRef } from '@ng-bootstrap/ng-bootstrap';
import { Subject, Subscription } from 'rxjs';
import { Params } from '@angular/router';

import { MasterdataService } from '@masterdata/services/masterdata.service';
import { UserObject } from '@shared/model/UserObject';
import { FormUtil } from '@shared/utils/form.util';
import { RegionObject } from '@shared/model/RegionObject';
import { FunctionObject } from '@shared/model/FunctionObject';
import { OrganisationObject } from '@shared/model/OrganisationObject';
import { AbstractFormComponent } from '@shared/abstract/abstract-form/abstract-form.component';
import { DatepickerValidator } from '@shared/validators/datepicker.validator';
import { AuthenticationService } from '@core/services/authentication.service';

@Component({
  selector: 'ok-user',
  templateUrl: './user.component.html',
  styleUrls: ['./user.component.scss']
})
export class UserComponent extends AbstractFormComponent implements OnInit, OnDestroy {
  decisionModalRef: NgbModalRef;
  decision = new Subject<boolean>();

  modalAction = new Subject<string>();
  isModal = false;
  instanceId: number;
  organisationList: Array<OrganisationObject>;

  /**
   * Regions
   */
  sourceRegion: Array<any> = [];
  targetRegion: Array<any> = [];
  region$: Subscription;
  regionModalRef: NgbModalRef;

  sourceColumnDefsRegion = [
    { headerName: 'Regionsname', field: 'regionName' }
  ];
  targetColumnDefsRegion = [
    { headerName: 'Regionsname', field: 'regionName' }
  ];

  /**
   * Functions
   */
  sourceFunction: Array<FunctionObject> = [];
  targetFunction: Array<any> = [];
  functionData$: Subscription;
  functionModalRef: NgbModalRef;

  sourceColumnDefsFunction = [
    { headerName: 'Funktionsname', field: 'functionName' }
  ];
  targetColumnDefsFunction = [
    { headerName: 'Funktionsname', field: 'functionName' }
  ];

  param$: Subscription;
  user$: Subscription;
  organisation$: Subscription;
  constructor(
    public authService: AuthenticationService,
    private masterDataService: MasterdataService,
    private injector: Injector
  ) {
    super(injector);
  }

  ngOnInit() {
    if (this.isModal) {
      this.createFormModal();
    } else {
      this.createForm();
    }
    this.param$ = this.route.params.subscribe((params: Params) => {
      this.instanceId = params['id'];
      if (this.instanceId) {
        this.user$ = this.masterDataService.getUser(this.instanceId).subscribe(
          data => {
            data.date = {
              validFrom: this.ngbDateParserFormatter.parse(data.validFrom),
              validTo: this.ngbDateParserFormatter.parse(data.validTo)
            };
            this.form.patchValue(data);
            this.targetRegion = data.lsUserInRegions;
            this.targetFunction = data.lsUserFunctions;
            this.getRegionList();
            this.getFunctionList();
            this.getOrganisationList();
            if (data.organisation) {
              this.getOrganisationAndPatch(data.organisation.id);
            }
            this.form.controls.organisation.get('id').valueChanges.subscribe((changedValue) => {
              this.getOrganisationAndPatch(changedValue);
            });
          }
        );
      }
    });
  }

  getRegionList(): void {
    this.region$ = this.masterDataService.getRegionDataSelection().subscribe((regionRes: RegionObject[]) => {
      this.sourceRegion = FormUtil.getSubsetOfArray(regionRes, this.targetRegion, 'id', 'regionId');
    });
  }

  getFunctionList(): void {
    this.functionData$ = this.masterDataService.getFunctionDataSelection().subscribe((functionRes: FunctionObject[]) => {
      this.sourceFunction = FormUtil.getSubsetOfArray(functionRes, this.targetFunction, 'functionId', 'functionId');
    });
  }

  getOrganisationList(): void {
    this.organisation$ = this.masterDataService.getOrganisationDataSelection().subscribe((organisationRes: OrganisationObject[]) => {
      this.organisationList = organisationRes;
    });
  }

  getOrganisationAndPatch(id: number) {
    if (id) {
      this.organisation$ = this.masterDataService.getOrganisation(id).subscribe(
        (organisationRes: OrganisationObject) => {
          this.form.controls.organisation.get('address').patchValue(organisationRes.address);
        });
    } else {
      this.form.controls.organisation.get('address').reset();
    }
  }

  createForm() {
    this.form = this.fb.group({
      id: '',
      firstname: ['', Validators.required],
      lastname: ['', Validators.required],
      isCompany: false,
      organisation: this.createOrganisation(),
      businessContactData: this.createBusinessContact(),
      privateContactData: this.createPrivateContact(),
      privateAddress: this.createAddress(),
      date: this.fb.group({
        validFrom: ['', Validators.required],
        validTo: ['', Validators.required],
      }, { validator: [DatepickerValidator.dateRangeTo('')] }),
      modificationDate: '',
      notes: '',
      hrNumber: '',
      userKey: ''
    });
  }

  createFormModal() {
    this.form = this.fb.group({
      id: '',
      firstname: ['', Validators.required],
      lastname: ['', Validators.required],
      isCompany: false,
      date: this.fb.group({
        validFrom: ['', Validators.required],
        validTo: ['', [Validators.required, DatepickerValidator.dateRangeTo('validFrom')]],
      }, { validator: [DatepickerValidator.dateRangeTo('')] }),
      notes: '',
      hrNumber: '',
      userKey: ''
    });
  }
  /**
   * Save and Validation Methods
   */

  /**
   * Saves the current Form
   */
  saveUser() {
    if (this.form.controls.organisation) {
      this.form.controls.organisation.get('address').clearValidators();
    }
    if (FormUtil.validate(this.form)) {
      const userToSave = this.form.getRawValue();
      FormUtil.formatDates(userToSave, ['validFrom', 'validTo']);
      this.masterDataService.saveUser(userToSave).subscribe((res: UserObject) => {
        // neccessary due to canDeactivate guard
        FormUtil.markAsPristineAndUntouched(this.form);
        if (this.isModal) {
          this.router.navigate(['/stammdatenverwaltung/mitarbeiter', res.id]);
          this.modalAction.next('close');
        } else {
          this.router.navigate(['/stammdatenverwaltung/mitarbeiter']);
        }
      });
      return true;
    }
    return false;
  }

  /**
   * ****Helpermethods for creating the form****
   */

  /**
   * Creates the Formgroup BusinessContact
   */
  createBusinessContact() {
    return this.fb.group({
      id: '',
      phone: ['', Validators.required],
      cellphone: '',
      radiocomm: '',
      email: '',
      pager: '',
      isPrivate: false
    });
  }

  /**
   * Creates the Formgroup PrivateContact
   */
  createPrivateContact() {
    return this.fb.group({
      id: '',
      phone: ['', Validators.required],
      cellphone: '',
      isPrivate: true
    });
  }

  /**
   * Creates the Formgroup Organisation
   */
  createOrganisation() {
    const organisationControl: FormGroup = this.fb.group({
      id: ['', Validators.required],
      orgaName: '',
      address: this.createAddress(),
    });
    organisationControl.controls['address'].disable();
    return organisationControl;
  }

  /**
   * Creates the Formgroup Addresses
   */
  createAddress() {
    return this.fb.group({
      id: '',
      postcode: ['', Validators.required],
      community: ['', Validators.required],
      communitySuffix: '',
      street: ['', Validators.required],
      housenumber: ['', Validators.required],
      wgs84zone: '',
      latitude: '',
      longitude: ''
    });
  }

  /**
   * Sets the dates to default values
   */
  setDefaultDate(field: string) {
    FormUtil.setDefaultDate(this.form, field);
  }

  /**
   * MOVE FUNCTIONS REGION
   */

  moveToTargetRegion(dataToMove) {
    for (let i = 0; i < dataToMove.length; i++) {
      dataToMove[i].userId = this.instanceId;
      dataToMove[i].regionId = dataToMove[i].id;
      delete dataToMove[i].id;
    }
    this.masterDataService.addUserRegion(this.instanceId, dataToMove).subscribe((resRegionFunction: RegionObject[]) => {
      this.targetRegion = resRegionFunction;
      this.sourceRegion = FormUtil.getSubsetOfArray(this.sourceRegion, this.targetRegion, 'id', 'regionId');

      this.messageService.add({ severity: 'success', summary: 'Regionen wurden gespeichert', detail: '' });
    });
  }

  moveToSourceRegion(dataToMove) {
    this.masterDataService.deleteUserRegion(this.instanceId, dataToMove).subscribe((resRegionFunction: RegionObject[]) => {
      this.targetRegion = resRegionFunction;
      this.getRegionList();

      this.messageService.add({ severity: 'success', summary: 'Regionen wurden gespeichert', detail: '' });
    });
  }

  /**
 * MOVE FUNCTIONS FUNCTION
 */

  moveToTargetFunction(dataToMove) {
    this.masterDataService.addUserFunction(this.instanceId, dataToMove).subscribe((resFunctions: FunctionObject[]) => {
      this.targetFunction = resFunctions;
      this.sourceFunction = FormUtil.getSubsetOfArray(this.sourceFunction, this.targetFunction, 'functionId', 'functionId');

      this.messageService.add({ severity: 'success', summary: 'Funktionen wurden gespeichert', detail: '' });
    });
  }

  moveToSourceFunction(dataToMove) {
    this.masterDataService.deleteUserFunction(this.instanceId, dataToMove).subscribe((resFunctions: FunctionObject[]) => {
      this.targetFunction = resFunctions;
      this.getFunctionList();

      this.messageService.add({ severity: 'success', summary: 'Funktionen wurden gespeichert', detail: '' });
    });
  }

  close() {
    if (this.isModal) {
      this.modalAction.next('close');
    } else {
      this.router.navigate(['/stammdatenverwaltung/mitarbeiter']);
    }
  }

  ngOnDestroy() {
    if (this.param$) {
      this.param$.unsubscribe();
    }
    if (this.user$) {
      this.user$.unsubscribe();
    }
  }
}
