// NG imports
import { Component, Input, Output, EventEmitter } from '@angular/core';

// Components
import { AddedToCartDialogComponent } from '@k-core/modules/shared/components/added-to-cart-dialog/cmp.added-to-cart-dialog'

// Material
import { MatDialog } from '@angular/material'

// Services
import { HelperService }               from '@k-services/svc.helper'
import { BasketService }               from '@k-services/svc.basket'
import { ProductService }              from '@k-services/svc.product'

// Libraries
import 'rxjs/add/operator/toPromise'

@Component({
    moduleId: module.id+ '',
    selector: 'add-to-cart',
    templateUrl: './template.add-to-cart.pug',
    styleUrls: ['./structure.add-to-cart.scss','./visual.add-to-cart.scss']
})

export class AddToCartComponent {

    @Input('sku') sku:string
    @Input('quantity') quantity:number
    @Input('isInStock') stockStatus: boolean
    @Input('product') values: any
    @Input('options') options: any
    @Input('canAdd') canAdd: boolean

    @Output() output = new EventEmitter<boolean>();
    @Output('productAdded') productAdded = new EventEmitter<boolean>()

    accepted: boolean = false
    timeout: any
    whitelist: string[] = ['color', 'sku', 'size', 'ean']
    
    constructor (
        private _dialog: MatDialog,
        private _helper: HelperService,
        private _basket: BasketService,
        private _product: ProductService
    ) {
        _basket.basket$.subscribe((response) => {

            let amountInBasket: number;

            for(let basket of response) {
                if(basket.id == this.sku) {
                    this.checkQuantity(basket.quantity)
                }
            }
        })
    }


    /**
     * Adds product to cart
     * 
     * @param product - Product Sku
     * @param quantity - Quantity, set to 1 as default
     */
    addProduct(product: any, quantity: number = 1) {



        let attributes: any = {
            name: this.values.name,
            image: this.values.images[0],
            sku: product.sku
        }
        
        

        if(!!this.options) {
            attributes.options = this._helper.mapToObject(this.options)
        }

        this.values.attributes.filter((attribute) => {
            if(this.whitelist.includes(attribute.code)) {
                attributes[attribute.code] = attribute.formattedValue
            }
        })

        this._basket.addProduct('-sku--'+product, quantity, attributes)
            .subscribe((response) => {
                if(response == 'success') {

                    this.accepted = true
                    this.productAdded.emit(true)
                    if(this.timeout)
                        clearTimeout(this.timeout)
        
                    this.timeout = setTimeout(() => {
                        this.accepted = false
                    }, 1500)
        
        
                    // Show dialog
                    this._dialog.open(AddedToCartDialogComponent)
                }
            })
    }


    /**
     * Check for quantity in basket vs quantity from ***_service***
     * 
     * @param quantityInBasket 
     */
    checkQuantity(quantityInBasket: number) {

        let result;

        this._product.getQuantity(this.sku).then((response) => {

            if(quantityInBasket < response)
                result = true
            else
                result = false
    
            this.output.emit( result )
        })  
    }
}