/home/bdqbpbxa/dev-subdomains/admin.pixory.goodface.com.ua/config/cron-tasks.ts
import { Core } from "@strapi/strapi";
import { OrderStatus } from "../src/api/order/common/enums/order-status";
import { Service as PeechoService } from "../src/api/order/common/peecho/services/peecho";
import { ItemDetails } from "../src/api/order/common/peecho/types/item-details";
import { Order } from "../src/api/order/common/types/order";
import { Address as PeechoAddress } from "../src/api/order/common/peecho/types/address";

const cron30Mins = '*/30 * * * *';
const orderCreationDelayInMinutes = 30;

export default {
  orderCreation: {
    task: async ({ strapi } : { strapi: Core.Strapi }) => {
      strapi.log.info('Running order creation task');

      const orders: Order[] = await strapi.db.query('api::order.order').findMany({
        where: { orderStatus: OrderStatus.SCHEDULED },
      });
      const now = new Date();
      for (let order of orders) {
        const createdAt = new Date(order.createdAt);
        const diffInMinutes = (now.getTime() - createdAt.getTime()) / (1000 * 60);
        if (diffInMinutes >= orderCreationDelayInMinutes) {
          order = await strapi.db.query('api::order.order').update({
            where: { id: order.id },
            data: { orderStatus: OrderStatus.OPEN },
            populate: {
              orderedProjects: {
                populate: {
                  project: {
                    populate: {
                      product: true,
                    }
                }
              },
              },
              shippingAddress: true,
              billingAddress: true,
              creator: true,
            }
          });
          const shippingAddress = {
            ...order.shippingAddress,
            state: order.shippingAddress.state?.code,
            countryCode: order.shippingAddress.country?.code,
          } as PeechoAddress;
          const billingAddress = {
            ...order.billingAddress,
            state: order.billingAddress.state?.code,
            countryCode: order.billingAddress.country?.code,
          } as PeechoAddress


          const peechoService = new PeechoService(strapi);
          const peechoOrderId = await peechoService.createOrder({
            currency: order.currency.toUpperCase(),
            itemDetails: order.orderedProjects.map((orderedProject) => ({
              title: orderedProject.project.title,
              offering_id: orderedProject.project.product.id,
              quantity: orderedProject.quantity,
              file_details: {
                /**
                 * @TODO Get file details from Printbox
                 **/ }
            })) as ItemDetails[],
            addressDetails: {
              emailAddress: order.creator.email,
              shippingAddress: shippingAddress,
              billingAddress: billingAddress,
            },
            orderRefference: order.id.toString(),
          });

          await strapi.db.query('api::order.order').update({
            where: { id: order.id },
            data: { peechoOrderId },
          });

          strapi.log.info(`Order ID ${order.id} status updated to OPEN`);
        }
      }

    },
    options: {
      rule: cron30Mins,
    }
  }
}