// angular
import { Injectable } from '@angular/core';
import { Http } from '@angular/http';
// libs
import 'rxjs/add/operator/map';
import 'rxjs/add/operator/catch';
// libs
import { Store } from '@ngrx/store';
// app
import { QueryAction, SetEntriesAction } from '../actions/loop-activity-message.action';
import { APIDispatcher, APIRequestOptions, ResponseBody } from '../utils/index';
import { LoopActivityMessage } from '../interfaces/loop-activity-message.interface';

@Injectable()
export class LoopActivityMessageService extends APIDispatcher {

    lastRequest: any = {
        currentPage: 0,
        requestSize: 10
    };

    constructor(public http: Http, public store: Store<any>) {
        super(http, store);
    }

    query(page: number = 0, size: number = 10, options: APIRequestOptions = {archived: false}) {
        this.get('ma_loop/api/v1/activity_message/fetch', page, size, options)
            .map(res => res.json())
            .subscribe((response: ResponseBody) => {
                this.loaded = true;
                this.lastRequest = response;
                this.lastRequest.currentPage = page;
                this.lastRequest.requestSize = size;
                this.store.dispatch(new QueryAction(response.content));
            });
    }

    acknowledge(message: LoopActivityMessage) {
        if(!message.acknowledged_at) {
            console.log('updating acknowledge');
            this.http.put('ma_loop/api/v1/activity_message/'+message.recipient_identity, {
                payload: { acknowledgedAt: new Date().getTime() }
            }).subscribe((response: any) => {
                this.resetEntries();
                this.lastRequest = response;
                this.lastRequest.currentPage = 1;
                this.query();
            });
        }
    }

    archive(message: LoopActivityMessage) {
        if(!message.archived_at) {
            console.log('updating archive');
            this.http.put('ma_loop/api/v1/activity_message/'+message.recipient_identity, {
                payload: {
                    acknowledgedAt: message.acknowledged_at || new Date().getTime(),
                    archivedAt: new Date().getTime()
                }
            }).subscribe();
        }
    }

    /**
     * Queries the next page from the back-end service, based on the previous request
     *
     *
     * @memberOf LoopActivityMessageService
     */
    getNextPage() {
        if(this.hasNext) {
            this.query(this.lastRequest.currentPage + 1, this.lastRequest.requestSize);
        }
    }

    /**
     * Resets the entries in the app-state slice for LoopActivityMessage
     *
     *
     * @memberOf LoopActivityMessageService
     */
    resetEntries() {
        this.loaded = false;
        this.lastRequest = undefined;
        this.store.dispatch(new SetEntriesAction([]));
    }

}

