// import {Injectable, OnInit} from "@angular/core";
// import {Observable} from "rxjs/Observable";
// import {Observer} from "rxjs/Observer";
// import {DataBaseContext} from "./OdisseiaDatabase";
// import {WebApiService} from "./WebApiService";
// import {syncableTable} from "./OdisseiaDataBase/syncableTable";
// //React
// import "rxjs/add/operator/mergeMap";
// import "rxjs/add/operator/map";
// import "rxjs/add/operator/catch";
//
// /**
//  * Created by jd on 07/04/2016.
//  */
//
// interface SyncNotification
// {
//     isComplete:boolean;
//     total:number;
//     current:number;
//     hasError?:boolean;
//     status?:string;
// }
//
// @Injectable()
// export class SyncService implements OnInit
// {
//
//
//     ngOnInit():any
//     {
//         return undefined;
//     }
//
//     constructor(private db:DataBaseContext, private webApi:WebApiService)
//     {
//     }
//
//     private localChangesSinceLastSync = <T>(table:string, lastSyncDate:Date):Observable<Array<T>> =>
//     {
//         return Observable.create((observer:Observer<Array<T>>) =>
//         {
//             this.db.getStore<T>(table).find({"updatedAt": {$gt: lastSyncDate}}, (err, result:Array<T>) =>
//             {
//                 observer.next(result);
//                 observer.complete()
//             });
//         });
//     };
//
//
//     private lastTableSync = (table:string):Observable<Date> =>
//     {
//         return Observable.create((observer:Observer<Date>) =>
//         {
//             this.db.TableSync.find({"tableName": table}, (err, result) =>
//             {
//                 if (result.length > 0)
//                     observer.next(result[0].lastSync);
//                 else
//                     observer.next(new Date(2001, 1, 1));
//
//                 observer.complete()
//             });
//         });
//
//     };
//
//
//     private updateServer = (table:string, localChanges:Array<any>, lastSyncNumber:Date):Observable<any> =>
//     {
//         return this.webApi
//                    .Resource("api/" + table + "/Sync/{lastSync}")
//                    .Method("POST")
//                    .CanSendToken(false)
//                    .Parameters({lastSync: lastSyncNumber.toISOString()})
//                    .Content(localChanges)
//                    .Execute();
//     };
//
//
//     private updateLocal = (table:string, serverChanges:Array<syncableTable>):Observable<SyncNotification> =>
//     {
//         return Observable.create((observer:Observer<SyncNotification>) =>
//         {
//             //create a notification object
//             var notification:SyncNotification = {
//                 status: "Atualizando...",
//                 total: serverChanges.length,
//                 current: 0,
//                 isComplete: false
//             };
//
//             observer.next(notification);
//             var changeCount = 0;
//
//             serverChanges.forEach((item:syncableTable, i) =>
//             {
//
//                 changeCount += 1;
//                 notification.current = changeCount;
//
//                 //Para cada item que voltou do servidor...
//                 //procuramos na base local
//                 this.db.getStore(table).update({_id: item._id}, item, {upsert: true}, (err, result) =>
//                 {
//                     if (err)
//                     {
//                         console.log(err);
//                     }
//                     else
//                     {
//                         observer.next(notification);
//                     }
//                 });
//                 if (changeCount == serverChanges.length)
//                     observer.complete();
//
//
//             });
//
//         });
//
//
//     };
//
//
//     public SyncTable = (table:string):Observable<SyncNotification> =>
//     {
//         var currentSyncDAte = this.db.GetCurrentUtcDate();
//         var lastTableSyncNumber:Date = null;
//         var localChangesSinceLastSync:Array<any> = [];
//         var serverchangesSinceLastSync:Array<any> = [];
//
//
//         var syncTableSource = this.lastTableSync(table)
//                                   .mergeMap((data:Date) =>
//                                   {
//                                       lastTableSyncNumber = data;
//                                       return this.localChangesSinceLastSync(table, lastTableSyncNumber);
//                                   })
//                                   .mergeMap((results:Array<any>) =>
//                                   {
//                                       localChangesSinceLastSync = results;
//                                       return this.updateServer(table, localChangesSinceLastSync, lastTableSyncNumber);
//                                   })
//                                   .mergeMap((dataToUpdate:Array<any>)=>
//                                   {
//                                       serverchangesSinceLastSync = dataToUpdate;
//                                       return this.updateLocal(table, serverchangesSinceLastSync);
//                                   });
//
//
//         return syncTableSource;
//     }
//
//
// }