import { Injectable }           from '@angular/core';
import { Headers }        from '@angular/http';
import { HttpClient }       from '@angular/common/http'

import { HelperService }        from './svc.helper';
import { SharedService }        from './svc.shared';
import { Subject }              from 'rxjs/Subject';

import 'rxjs/add/operator/toPromise';


import { ProductType } from '../types/product';


@Injectable()
export class ProductService {

    constructor(
        private _http: HttpClient, 
        private _helper: HelperService,
        private _shared: SharedService
    ) { }

    // Vars
    productHelperSource = new Subject<Object[]>();
    productHelper$ = this.productHelperSource.asObservable();

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


    setProductFoldOut(title) {
        this.productHelperSource.next(title);
    }

    /**
     * Returnes a Promise of type <ProductType>
     * @param urlkey 
     */
    getProduct(urlkey:string): Promise<ProductType> {
        return this._http.get(this.productApi+'&urlkey='+urlkey+'&extend')
            .toPromise()
            .then((response: any) => {

                if(response.status == 'error') throw [response, urlkey]
                else {

                    let product = response.data.product;
    
                    // Set shared collection
                    this._shared.setCollection(product.categories)
    
                    // Set shared product name
                    this._shared.setProduct(product.name);
                    
                    // Return product data
                    return product as ProductType
                }

            })
            .catch((error) => {
                this._helper.logRequestError(error[0].data.errorMessage, 'GET', this.productApi+'&urlkey='+error[1]+'&extend', '@app-core/services/svc.product.ts')
                return Promise.reject(error.message || error)
            })
    }

    getQuantity(sku: any): Promise<any> {
        return this._http.get(this._helper.server + 'feed/get/nav-quantity' + this.key + '&sku=' + sku + '&noCache').toPromise()
            .then((response: any) => {
                return response.data.qty
            })
    }
}