<?php

namespace App\Services;


use App\Models\OrderManagement\Order;
use App\Models\PaymentManagement\PaymentTransaction;
use Throwable;

class SaveOrderService{

    /**
     * @param PaymentTransaction|null $transaction
     * @return void
     * @throws Throwable
     */
    public function __invoke(PaymentTransaction $transaction = null){

        //si la transaction existe
        if (!blank($transaction) and $transaction instanceof PaymentTransaction){
            /*récupère la order du fbo*/
            $order =  $transaction->order; // [array]
            $payer = $transaction->payer; // [App\Models\User]

            $items =  $order['items'] ?? null; //les produits commandés
            $total =  $order['total'] ?? null;  //le recap de la commande

            $successReference = $transaction->success_reference ?? "";

            // si la commande existe dans la transaction
            if (!blank($items) and !blank($total) and !blank($successReference)){

                /*ajoute un nouvel attribut aux données de la commande
                  pour préciser qu'elle a été enregistré par le cron job*/
                    $total['saved_by_cron'] = true;

                    $orderDatas = ['items' => $items, 'order' => $total,];

                    //essaye d'enregistrer la commande
                    $orderResult = (new OrderService)->saveOrder($orderDatas , $payer);

                    //Commande enregistrée
                    if ($orderResult instanceof Order){
                        $orderId = $orderResult->ref_id;
                        echo (__("Order saved with ID : ':orderId'", ['orderId' => $orderId]));
                    }
                    else{ // c'est une exception
                        $orderResult = ['exception' => $orderResult['exception'] ,'message' => $orderResult['message']];
                    }
                    $transaction->update(['order_result' => $orderResult]);
            }

        }

    }

}
