const {faker} = require('@faker-js/faker');
const TableImporter = require('./TableImporter');
const {blogStartDate} = require('../utils/blog-info');

const sixWeeksLater = new Date(blogStartDate);
sixWeeksLater.setDate(sixWeeksLater.getDate() + (7 * 6));

class StripePricesImporter extends TableImporter {
    static table = 'stripe_prices';
    static dependencies = ['products', 'stripe_products'];

    constructor(knex, transaction) {
        super(StripePricesImporter.table, knex, transaction);
    }

    async import() {
        const stripeProducts = await this.transaction.select('id', 'stripe_product_id', 'product_id').from('stripe_products');
        this.products = await this.transaction.select('id', 'monthly_price', 'yearly_price').from('products');

        await this.importForEach(stripeProducts, 2);
    }

    setReferencedModel(model) {
        this.model = model;
        this.count = 0;
    }

    generate() {
        const count = this.count;
        this.count = this.count + 1;

        const relatedProduct = this.products.find(product => product.id === this.model.product_id);

        if (count === 1 && relatedProduct.monthly_price === null) {
            // Only single complimentary price (yearly)
            return null;
        }

        const billingCycle = {
            nickname: 'Monthly',
            interval: 'month',
            type: 'recurring',
            currency: 'usd',
            amount: relatedProduct.monthly_price
        };
        if (count === 1) {
            billingCycle.nickname = 'Yearly';
            billingCycle.interval = 'year';
            billingCycle.amount = relatedProduct.yearly_price;
        } else if (relatedProduct.monthly_price === null) {
            billingCycle.nickname = 'Complimentary';
            billingCycle.interval = 'year';
            billingCycle.amount = 0;
        }

        return Object.assign({}, {
            id: faker.database.mongodbObjectId(),
            stripe_price_id: faker.datatype.hexadecimal({
                length: 64,
                prefix: ''
            }),
            stripe_product_id: this.model.stripe_product_id,
            active: true,
            created_at: faker.date.between(blogStartDate, sixWeeksLater)
        }, billingCycle);
    }
}

module.exports = StripePricesImporter;
