<?php

namespace Autogedal\TbiBank\Plugin;

use Autogedal\TbiBank\Model\ApprovalAccounting;
use Autogedal\TbiBank\Model\ApprovalConfig;
use Autogedal\TbiBank\Model\CallbackAudit;
use Autogedal\TbiBank\Model\CallbackStatusUpdate;
use Magento\Framework\Phrase;
use TbiBank\FusionPay\Model\TbiStatusUpdate;

class ApprovalStatus
{
    public function __construct(
        private ApprovalAccounting $accounting,
        private ApprovalConfig $config,
        private CallbackStatusUpdate $callbackStatusUpdate
    )
    {
    }

    public function aroundUpdateStatus(
        TbiStatusUpdate $subject,
        callable $proceed,
        $orderId,
        $newStatus,
        $contractId = null,
        $message = null,
        $motive = null,
        $statusCode = null
    )
    {
        // Gateway supplies a Phrase. Match its source text, independent of the callback locale.
        $source = $newStatus instanceof Phrase ? $newStatus->getText() : (string) $newStatus;
        $approvedStatus = $this->config->getCallbackApprovedStatus();
        if ($approvedStatus === '' || $source !== $approvedStatus) {
            $arguments = [(string) $orderId, $source, $contractId];
            if ($statusCode !== null || $message !== null || $motive !== null) {
                $arguments = array_merge($arguments, [
                    CallbackAudit::COMMAND_UPDATE_STATUS,
                    $statusCode,
                    $message,
                    $motive,
                ]);
            }
            $this->callbackStatusUpdate->update(...$arguments);
            return null;
        }
        $arguments = [(string) $orderId, (string) $newStatus, $contractId];
        if ($statusCode !== null || $message !== null || $motive !== null) {
            $arguments = array_merge($arguments, [$statusCode, $message, $motive]);
        }
        $this->accounting->approve(...$arguments);
        return null;
    }
}
