import { map } from 'rxjs/operators';
import { convertToParamMap, Params } from '@angular/router';

import { BehaviorSubject } from 'rxjs';

export class ActivatedRouteStub {

  private _testParams?: any;
  private _testData?: any;
  // ActivatedRoute.params is Observable
  private subject?: BehaviorSubject<any> = new BehaviorSubject(this.testParams);
  private dataSubject?: BehaviorSubject<any> = new BehaviorSubject(this.testData);

  params = this.subject.asObservable();
  queryParams = this.subject.asObservable();
  paramMap = this.subject.asObservable().pipe(map((params: Params) => convertToParamMap(params)));
  queryParamMap = this.subject.asObservable().pipe(map((params: Params) => convertToParamMap(params)));
  data = this.dataSubject.asObservable();

  constructor(params?: Params, data?: any) {
    if (params) {
      this.testParams = params;
    } else {
      this.testParams = {};
    }
    if (data) {
      this.testData = data;
    } else {
      this.testData = {};
    }
  }

  // Test parameters
  get testParams() {
    return this._testParams;
  }

  set testParams(params: {}) {
    this._testParams = params;
    this.subject.next(params);
  }

  // Test data
  get testData() {
    return this._testParams;
  }

  set testData(data: {}) {
    this._testData = data;
    this.dataSubject.next(data);
  }

  // ActivatedRoute.snapshot.params
  get snapshot() {
    return {
      params: this.testParams,
      paramMap: convertToParamMap(this.params),
      queryParamMap: convertToParamMap(this.testParams),
      queryParams: {} as Params,
    };
  }
}