/**
 * @since Wed Oct 03 2018
 * @author Charles Gouldmann - Klean
 * 
 * TODO: Change Http to HttpClient
 */

import { Injectable } from '@angular/core'
import { Http } from '@angular/http'

import 'rxjs/add/operator/toPromise'

// Services
import { HelperService }        from '@k-services/svc.helper'
import { SharedService }        from '@k-services/svc.shared'
import { CacheService }         from '@k-services/general/svc.cache'

// Testing
//import { dummyBlocks } from './dummyBlocks'

@Injectable()
export class BlockService {
    
    constructor(
        private _http: Http,
        private _helper: HelperService,
        private _shared: SharedService,
        private _cacheService : CacheService
    ) { }


    // ---- Variables ---- \\
    private key = this._helper.credentials
    private api = this._helper.server+'feed/get'
    private productApi = this.api + '/product' + this.key





    // ---- Functions ---- \\

    private handleError(error: any): Promise<any> {
        console.error('An error occurred', error)
        return Promise.reject(error.message || error)
    }


	/**
	 * Get All blocks or blocks by ID
	 * 
	 * @param blockId 
	 */
    getBlocks(blockId:string): Promise<any> {

		blockId = !!blockId ? '&block=' + blockId : ''

        return this._http.get(this._helper.server + 'feed/get/block' + this._helper.credentials + blockId)
            .toPromise()
            .then(function(response) {

                let data = response.json().data

                if(data.list) {
                    data = data.list.map(function(blocks, index) {               
                        return blocks;
                    })
                } else {
                    data = data.blocks
                }

                return data

                // For Testing
                // return dummyBlocks.data.list.map(function(blocks, index) {               
                //     return blocks;
                // })
            })
    }







    /**
     * Checks if product is already in cache and calls 
     * `getProduct()` if not. 
     * 
     * @borrows getProduct()
     */
    getRelatedProductsWithCache(urlkey: string): Promise<any> {
        let cachedProduct = this._cacheService.get('product-' + urlkey)

        return new Promise((resolve, reject) => {
            
            // Cache
            if(cachedProduct) {
                console.log('getting cached product')

                let relatedProducts = cachedProduct.related_products
                resolve(relatedProducts)
            }
            // Server
            else {
                console.log('getting product from server')

                this.getProduct(urlkey).then(response => {
                    let relatedProducts = response.related_products
                    this._cacheService.set('product-' + urlkey, relatedProducts)
                    
                    resolve(relatedProducts)
                })
            }
        });
    }


    getProduct(urlkey: string) {
        return this._http.get(this.productApi+'&urlkey='+urlkey+'&extend')
            .toPromise()
            .then(response => {

                // Return product data
                return response.json().data.product;
            })
            .catch(this.handleError);
    }


}