import {Component, Input, OnInit, ViewChild} from '@angular/core';
import {Product} from '../../models/product';
import {ApiService} from '../../services/api.service';
import {
    ChartComponent,
    ApexAxisChartSeries,
    ApexChart,
    ApexXAxis,
    ApexTitleSubtitle, ApexStroke
} from 'ng-apexcharts';
import {Price} from '../../models/price';
import {Vendor} from '../../models/vendor';

export type ChartOptions = {
    series: ApexAxisChartSeries;
    chart: ApexChart;
    xaxis: ApexXAxis;
    title: ApexTitleSubtitle;
    stroke: ApexStroke;
};

@Component({
    selector: 'app-product-details',
    templateUrl: './product-details.component.html',
    styleUrls: ['./product-details.component.css']
})
export class ProductDetailsComponent implements OnInit {
    @Input() productId: number;
    product: Product;
    lowestPrices: Price[];
    currentlyLowestPrice: Price;
    currentAmazonPrice: Price;
    vendors: Vendor[] = [];
    vendorMap = {};
    @ViewChild('chart') chart: ChartComponent;
    public chartOptions: ChartOptions;

    constructor(
        private apiService: ApiService
    ) {
    }

    ngOnInit(): void {
        this.getProduct();
        this.getVendors();
        this.getPrices();
    }

    getProduct(): void {
        this.apiService.getProduct(this.productId).subscribe(product => this.product = product);
    }

    getPrices(): void {
        // Lowest prices
        this.apiService.getLowestPrices(this.productId).subscribe(
            prices => {
                this.lowestPrices = prices;
                this.currentlyLowestPrice = prices[prices.length - 1];

                // Update charts
                this.getChartData();
            });

        // Amazon price
        this.apiService.getAmazonPrice(this.productId).subscribe(price => {
            this.currentAmazonPrice = price[0];
        });
    }

    getVendors(): void {
        this.apiService.getVendors().subscribe(vendors => {
            this.vendors = vendors;
            this.vendors.forEach(vendor => {
                this.vendorMap[vendor.vendor_id] = vendor;
            });
        });
    }

    getChartData(): void {
        const prices = [];
        const categs = [];
        this.lowestPrices?.forEach(price => {
            prices.push(price.price_in_cents / 100);
            categs.push(new Date(price.timestamp).toDateString());
        });

        this.chartOptions = {
            series: [
                {
                    name: 'Lowest Price',
                    data: prices
                }
            ],
            chart: {
                height: 350,
                type: 'area'
            },
            title: {
                text: 'Lowest price'
            },
            xaxis: {
                categories: categs
            },
            stroke: {
                curve: 'stepline'
            }
        };
    }

    getAmazonPriceDifference(): number {
        const amazonPrice = this.currentAmazonPrice?.price_in_cents;
        const lowestPrice = this.currentlyLowestPrice?.price_in_cents;

        const percentage = ((amazonPrice / lowestPrice) - 1) * 100;

        return Math.round(percentage);
    }
}
