﻿import { Injectable } from '@angular/core';
import { Http, Headers, Response, RequestOptions } from "@angular/http";
import 'rxjs/Rx';
import { Observable } from "rxjs";
import { TfabricaCrudReport } from './tfabrica.crud.report.model';
import { TfabricaSharedService } from '../main/tfabrica.shared.service';

@Injectable()
export class TfabricaCrudService {

    constructor(
        private _http: Http,
        private _shared: TfabricaSharedService
    ) { }

    public initFromReport(report: TfabricaCrudReport) {
        this.setFields(report.fields);
        this.setFieldsToDisplay(report.fieldsToDisplay);
    }

    public readData(report: TfabricaCrudReport): Observable<TfabricaCrudReport> {

        let urlToCall = "/api/Report/ReadData";
        console.log("Start call service: " + urlToCall);

        let bodyString = JSON.stringify(report);
        let headers = new Headers({ 'Content-Type': 'application/json' }); // ... Set content type to JSON
        let options = new RequestOptions({ headers: headers }); // Create a request option

        return this._http.post(urlToCall, bodyString, options) // ...using post request
            .map((res) => this.extractReadData(res)) // ...and calling .json() on the response to return data
            .catch((err) => this.handleError(err)); //...errors if any
    }

    private extractReadData(res: Response) {
        console.log(res);
        if (res.status < 200 || res.status >= 300) {
            throw new Error('Bad response status: ' + res.status);
        }
        let reportData = new TfabricaCrudReport();
        reportData.setFromJson(res.json().report);
        return reportData;
    }

    private handleError(error: any) {
        console.error(error); // log to console instead
        let errMsg = error.message || 'Server error';
        console.error(errMsg); // log to console instead
        return Observable.throw(errMsg);
    }

    private setFieldsToDisplay(fields) {
        localStorage.setItem('fieldsToDisplay', JSON.stringify(fields));
    }

    public getFieldsToDisplay() {
        return JSON.parse(localStorage.getItem('fieldsToDisplay'));
    }

    public setFields(fields) {
        localStorage.setItem('fields', JSON.stringify(fields));
    }

    public getFields() {
        return JSON.parse(localStorage.getItem('fields'));
    }

    public setFilters(filters) {
        localStorage.setItem('filters', JSON.stringify(filters));
    }

    public getFilters() {
        return JSON.parse(localStorage.getItem('filters'));
    }


}