import { Flug } from '../Modell/Flug';
import * as _ from 'underscore';
import { Observable } from 'rxjs/Rx'; // https://medium.com/@s_eschweiler/using-external-libraries-with-angular-2-87e06db8e5d1#.rlrsykkqw
import { FlugdatenProxy } from "./FlugdatenProxy.js"
import { Injectable } from '@angular/core';

@Injectable()
export class FlugService {

 flugSetO: Observable<Flug[]>;

 get flugSet(): Array<Flug> {
  return FlugService.flugSetStatic;
 }

 set flugSet(value: Array<Flug>) {
  FlugService.flugSetStatic = value;
 }

 private static flugSetStatic: Array<Flug>; // instanzübergreifender Cache

 constructor(private flugdatenProxy: FlugdatenProxy) {
 }


callback: (daten: Flug[]) => void;
 // getAll(): Observable<Flug[]> {
 //       return              this.flugdatenProxy.getAll()

 getAll(callback: (daten: Flug[]) => void) {
  this.callback = callback;
  console.log("getAll() 1");
  if (this.flugSet) { console.log("Daten im Cache!"); callback(this.flugSet); return; } // Wenn Daten im Cache, nix tun!
  this.flugdatenProxy.getAllAsObservable().subscribe(x => { this.flugSet = x; console.log("subscribe...", x); callback(x); });
 }

 getAllAsOversable(): Observable<any> {
  this.flugSetO = this.flugdatenProxy.getAllAsObservable();
  return this.flugSetO;
 }

 getByID(id: number) {

  var f = _.findWhere(this.flugSet, { FlugNr: id });
  console.log("Hole Flug: " + id, f);
  return f;
 }

 //     if (FlugService.flugset == null) {
 //        // nicht im Cache? Dann laden
 //  return this.flugdatenProxy.getAll();

 //         console.log("FlugService.getAll()1: ",FlugService.flugset);
 //  }

 //         }
 //  console.log("getAll()2: ",this.flugset);
 // console.log("getAll()3: " + FlugService.flugset.length);
 // FlugService.flugset = _.filter(FlugService.flugset, function (f: Flug) { return f.FlugNr > 110; });
 // // console.log("getAll()4: " + FlugService.flugset.length);
 // //   alert(_.size(this.flugset));
 // FlugService.flugsetO = Observable.from(FlugService.flugset);
 // // FlugService.flugset .forEach(element => {
 // //     console.log(element);
 // // });
 // // FlugService.flugsetO .forEach(element => {
 // //     console.log(element);
 // // });
 // // console.log(FlugService.flugsetO);
 // // return FlugService.flugsetO;
 // return FlugService.flugset;




 // getAllAsObserable(): Observable<Flug> {
 //     if (FlugService.flugset == null) {
 //         FlugService.flugset = new Array<Flug>();
 //         for (var i: number = 0; i < 20; i++) {
 //             var f = new Flug();
 //             f.FlugNr = 100 + i;
 //             f.Abflugort = "Rom";
 //             f.Zielort = "Berlin";
 //             f.Datum = new Date();
 //             f.FreiePlaetze = i;
 //             FlugService.flugset.push(f);
 //         }
 //     }
 //     FlugService.flugset = _.filter(FlugService.flugset, function (f: Flug) { return f.FlugNr > 110; });
 //     FlugService.flugsetO = Observable.from(FlugService.flugset);
 //     return FlugService.flugsetO;
 // }


 // RXJS Doku: https://xgrommx.github.io/rx-book/content/getting_started_with_rxjs/creating_and_querying_observable_sequences/querying_observable_sequences.html

 deleteById(id: number) {
  this.flugSet = _.without(this.flugSet, _.findWhere(this.flugSet, { 'FlugNr': id }));
  console.log("FlugService.delete(): " + this.flugSet.length);
 }

 delete(flug: Flug) {
  // this.flugSet.pop(); --> das würde UI mitkriegen, weil Array gleich geblieben ist

  this.flugSet = _.without(this.flugSet, flug); // das kriegt UI nicht mit!
  console.log("FlugService.delete(): " + this.flugSet.length);
  this.callback(this.flugSet);
  // FlugService.flugSetO.flatMap(x=>x).count().subscribe(x=>console.log("FlugService.delete()1: Anz Vorher=" + x));


  // if ( FlugService.flugSetO) FlugService.flugSetO.subscribe(x=> console.log("FlugService.delete()1: ",x));

  // FlugService.flugSetO = FlugService.flugSetO.flatMap(x=>x).filter(x=>x.FlugNr != flug.FlugNr).toArray();
  // FlugService.flugSetO.count().subscribe(x=>console.log("FlugService.delete()2: Anz Nachher=" + x));
 }
}