import { Injectable } from '@angular/core';
import { ActivatedRouteSnapshot, Resolve, RouterStateSnapshot } from '@angular/router';
import { Observable } from 'rxjs/Observable';
import { HttpClient } from '@angular/common/http';
import { BehaviorSubject } from 'rxjs/BehaviorSubject';
import { <%= Page %> } from './<%= pages %>.model';

@Injectable()
export class <%= Pages %>Service implements Resolve<any> {
    
    <%= pages %>: <%= Page %>[];
    on<%= Page %>Changed: BehaviorSubject<any> = new BehaviorSubject({});
    on<%= Page %>Selected: BehaviorSubject<any> = new BehaviorSubject({});

    constructor(private http: HttpClient) {}

     /**
     * Resolve
     * @param {ActivatedRouteSnapshot} route
     * @param {RouterStateSnapshot} state
     * @returns {Observable<any> | Promise<any> | any}
     */
    resolve(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): Observable<any> | Promise<any> | any {

        return new Promise((resolve, reject) => {
            Promise.all([ this.get<%= pages %>() ]).then(
                () => {
                    this.get<%= pages %>();  
                    resolve();
                },
                reject
            );
        });
    }

    get<%= pages %>(): Promise<any> {
        return new Promise((resolve, reject) => {
            this.http.get('api/<%= pages %>-data.json')
                .subscribe((response: any) => {
                    this.<%= pages %> = response;
                    this.<%= pages %> = this.<%= pages %>.map(<%= page %> => {
                        return new <%= Page %>(<%= page %>);
                    });                    
                    this.on<%= Page %>Changed.next(this.<%= pages %>);
                    resolve(response);
                }, reject);
        });
    }
}