/home/bdqbpbxa/dev-subdomains/admin.pixory.goodface.com.ua/src/api/product/controllers/product.ts
import { factories } from '@strapi/strapi'
import { ApplicationError } from '@strapi/utils/dist/errors';
import { ValidationError } from 'yup';
import { Configuration } from 'src/api/configuration/common/types/pricing';
import { getProductSchema } from '../common/schemas/get-product';
import { ExchangeRateService } from '../../exchange-rate/common/types/service';
import { Product } from '../common/types/product';
import { Service } from '../services/product';
import { User } from 'src/extensions/users-permissions/common/types/user';
import { UserService } from 'src/api/my-user/services/user';

export default factories.createCoreController('api::product.product', ({ strapi }) => ({
  async find(ctx) {
    try {
      const { query } = ctx as { query: { currency?: string } };
      let user: User;
      if (ctx.state.user) {
        const userService = new UserService(strapi);
        user = await userService.get(ctx.state.user?.id);
      }

      getProductSchema.validate(query)

      const configuration: Configuration = await strapi.db.query('api::configuration.configuration').findOne();
      
      const currency = user?.currency || query.currency || configuration.defaultCurrency;
      const products = await strapi.db.query('api::product.product').findMany({
        populate: { pricing: true }
      }) as Product[];
      
      let exchangeRate = 1;
      if (currency !== configuration.defaultCurrency) {
        const exchangeRateService = strapi.service('api::exchange-rate.exchange-rate') as ExchangeRateService;
        exchangeRate = await exchangeRateService.get(query.currency);

        if (!exchangeRate) {
          ctx.throw(400, `Currency ${query.currency} not supported`);
          return;
        }
        
      }
      const service = new Service(strapi);

      return Promise.all(products.map(async product => await service.transform(product, exchangeRate)));
    } catch (error) {
      if (error instanceof ValidationError) {
        ctx.throw(400, error.errors);
        return;
      }

      if (error instanceof ApplicationError) {
        ctx.throw(error.details?.status || 500, error.message);
        return;
      }

      strapi.log.error('Error fetching pricing:', error);
      ctx.throw(500, 'Internal server error');
    }
  }
}));