/home/bdqbpbxa/dev-subdomains/admin.pixory.goodface.com.ua/src/api/product/services/product.ts
import { ApplicationError } from '@strapi/utils/dist/errors';
import { Core } from "@strapi/strapi";
import { Product, ProductResponse } from "../common/types/product";
import { Service as PricingService } from "src/api/pricing/services/pricing";
import { round } from 'src/api/utils/math';
import { Configuration } from 'src/api/configuration/common/types/pricing';
import { getDiscountMultiplier } from 'src/api/pricing/common/utils/discount-multiplier';

export class Service {
  private readonly pricingService: PricingService;
  constructor(private readonly strapi: Core.Strapi) {
    this.pricingService = new PricingService(this.strapi);
  }

  async transform(product: Product, exchangeRate: number, pageCount?: number): Promise<ProductResponse> {
    const configuration = await this.strapi.query('api::configuration.configuration').findOne({
      populate: {
        defaultBookSetting: {
          populate: {
            bookType: true,
          }
        },
      },
    }) as Configuration
    pageCount = pageCount || configuration.defaultBookSetting.bookType.minPages;

    if (!product.pricing) {
      throw new ApplicationError(`Product service transform. Product ${product.id} does not have pricing data`);
    }
    const pricing = this.pricingService.transform(product.pricing, exchangeRate);
    const price = pricing.base + (pricing.perPage * pageCount);

    const discountMultiplier = pricing.discount ? getDiscountMultiplier(pricing.discount) : null;
    const discountedPrice = discountMultiplier ? price * discountMultiplier : null;

    return {
      ...product,
      pricing,
      price: round(price),
      discountedPrice: discountedPrice ? round(discountedPrice) : null,
    }
  }
}