/********************************************************************************
 * Copyright (c) 2015-2020 Contributors to the Eclipse Foundation
 *
 * See the NOTICE file(s) distributed with this work for additional
 * information regarding copyright ownership.
 *
 * 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 { Injectable } from '@angular/core';
import { Http, Response, Headers, RequestOptions } from '@angular/http';

import { PropertyService } from './property.service';

import { plainToClass } from 'class-transformer';
import { HttpErrorHandler } from './http-error-handler';
import { throwError as observableThrowError,  Observable } from 'rxjs';
import { mergeMap, map, catchError } from 'rxjs/operators';

export class Scope {
   public static readonly SYSTEM = 'SYSTEM';
   public static readonly SOURCE = 'SOURCE';
   public static readonly USER = 'USER';

   static toLabel(scope: string) {
     return scope.charAt(0).toUpperCase() + scope.slice(1).toLowerCase();
   }
}

export class Preference {
  scope: string;
  source?: string;
  user?: string;
  key: string;
  value: string;
  id: number;

  static sortByScope(p1: Preference, p2: Preference) {
    let getPriority = (scope: string) => {
      switch (scope) {
        case Scope.SYSTEM: return 1;
        case Scope.SOURCE: return 2;
        case Scope.USER: return 3;
        default: return 4;
      }
    };
    return getPriority(p1.scope) - getPriority(p2.scope);
  }

  constructor() {
      this.key = '';
  }
}

@Injectable()
export class PreferenceService {

  private prefEndpoint: string;

  constructor(private http: Http,
              private httpErrorHandler: HttpErrorHandler,
              private _prop: PropertyService) {
    this.prefEndpoint = _prop.getUrl('mdm/preferences');
  }

  getPreferenceForScope(scope: string, key?: string): Observable<Preference[]> {
      if (key == null) {
          key = '';
      }

      return this.http.get(this.prefEndpoint + '?scope=' + scope + '&key=' + key).pipe(
          map(response => plainToClass(Preference, response.json().preferences)),
          catchError(this.handleError));
  }

  getPreference(key?: string) {
      if (key == null) {
          key = '';
      }
      return this.http.get(this.prefEndpoint + '?key=' + key).pipe(
          map(response => plainToClass(Preference, response.json().preferences)),
          catchError(this.handleError));
  }

  savePreference(preference: Preference) {
    let headers = new Headers({ 'Content-Type': 'application/json' });
    let options = new RequestOptions({ headers: headers });

    return this.http.put(this.prefEndpoint, JSON.stringify(preference), options).pipe(
      catchError(this.handleError));
  }

  deletePreference(id: number) {
    return this.http.delete(this.prefEndpoint + '/' + id).pipe(
      catchError(this.handleError));
  }

  deletePreferenceByScopeAndKey(scope: string, key: string) {
    return this.getPreferenceForScope(scope, key).pipe(mergeMap(p => this.deletePreference(p[0].id)));
  }

  private handleError(e: Error | any) {
    if (e instanceof Response) {
      let response = <Response> e;
      if (response.status !== 200) {
        return observableThrowError('Could not request preferences! '
          + 'Please check if application server is running and preference database is configured correctly.');
      }
    }
    return this.httpErrorHandler.handleError(e);
  }
}
