<?php

namespace Autogedal\TbiBank\Test\Unit;

use Autogedal\TbiBank\Model\ApprovalAccounting;
use Autogedal\TbiBank\Model\CallbackStatusUpdate;
use Magento\Framework\App\ResourceConnection;
use Magento\Framework\DB\Adapter\AdapterInterface;
use Magento\Framework\DB\Select;
use Magento\Sales\Model\Order;
use Magento\Sales\Model\OrderFactory;
use Magento\Sales\Model\ResourceModel\Order as OrderResource;
use PHPUnit\Framework\TestCase;

class CallbackStatusUpdateTest extends TestCase
{
    public function testLockedApprovedOrderIsNotMovedBackToWaiting(): void
    {
        $connection = $this->createMock(AdapterInterface::class);
        $select = $this->createMock(Select::class);
        foreach (['from', 'joinLeft', 'where'] as $method) {
            $select->method($method)->willReturnSelf();
        }
        $select->expects($this->once())->method('forUpdate')->with(true)->willReturnSelf();
        $connection->method('select')->willReturn($select);
        $connection->method('fetchAll')->willReturn([[
            'entity_id' => 42,
            'state' => 'pending',
            'status' => 'new',
            'payment_method' => 'fusionpay',
            'additional_information' => json_encode([
                ApprovalAccounting::MARKER => true,
            ]),
        ]]);
        $connection->method('getTableName')->willReturnArgument(0);
        $connection->expects($this->once())->method('beginTransaction');
        $connection->expects($this->once())->method('commit');
        $connection->expects($this->never())->method('rollBack');
        $connection->expects($this->once())->method('update')->with(
            'sales_order_grid',
            ['tbi_status' => 'In Progress'],
            ['entity_id = ?' => 42]
        );

        $resource = $this->createMock(ResourceConnection::class);
        $resource->method('getConnection')->willReturn($connection);
        $resource->method('getTableName')->willReturnArgument(0);

        $order = $this->createPartialMock(Order::class, ['getId']);
        $order->method('getId')->willReturn(42);
        $order->setState('pending')->setStatus('new');
        $factory = $this->createMock(OrderFactory::class);
        $factory->expects($this->once())->method('create')->willReturn($order);

        $orderResource = $this->createMock(OrderResource::class);
        $orderResource->expects($this->once())->method('load')->with($order, 42)->willReturnSelf();
        $orderResource->expects($this->once())->method('save')->with($order);

        (new CallbackStatusUpdate($resource, $factory, $orderResource))
            ->update('AGD-123', 'In Progress');

        $this->assertSame('In Progress', $order->getData('tbi_status'));
        $this->assertSame('pending', $order->getState());
        $this->assertSame('new', $order->getStatus());
    }
}
