import { Injectable } from '@angular/core';
import {
  Actions,
  createEffect,
  ofType,
} from '@ngrx/effects';
import {
  Action,
  Store,
} from '@ngrx/store';
import { of as observableOf } from 'rxjs';
import { map } from 'rxjs/operators';

import { AppState } from './app.reducer';
import { HostWindowResizeAction } from './shared/host-window.actions';
import { StoreActionTypes } from './store.actions';

@Injectable()
export class StoreEffects {

  replay = createEffect(() => this.actions.pipe(
    ofType(StoreActionTypes.REPLAY),
    map((replayAction: Action) => {
      // TODO: should be able to replay all actions before the browser attempts to
      // replayAction.payload.forEach((action: Action) => {
      //   this.store.dispatch(action);
      // });
      return observableOf({});
    })), { dispatch: false });

  resize = createEffect(() => this.actions.pipe(
    ofType(StoreActionTypes.REPLAY, StoreActionTypes.REHYDRATE),
    map(() => new HostWindowResizeAction(window.innerWidth, window.innerHeight)),
  ));

  constructor(private actions: Actions, private store: Store<AppState>) {

  }

}