<?php
/**
 * Copyright © Magento, Inc. All rights reserved.
 * See COPYING.txt for license details.
 */
namespace Magento\Signifyd\Model;

use Magento\Framework\Api\SearchCriteriaBuilder;
use Magento\Framework\App\ObjectManager;
use Magento\Sales\Api\Data\OrderInterface;
use Magento\Sales\Api\OrderRepositoryInterface;
use Magento\Signifyd\Api\Data\CaseInterface;
use Magento\TestFramework\Helper\Bootstrap;

/**
 * Contains test methods for case management service
 */
class CaseManagementTest extends \PHPUnit\Framework\TestCase
{
    /**
     * @var CaseManagement
     */
    private $caseManagement;

    /**
     * @var ObjectManager
     */
    private $objectManager;

    protected function setup(): void
    {
        $this->objectManager = Bootstrap::getObjectManager();
        $this->caseManagement = $this->objectManager->get(CaseManagement::class);
    }

    /**
     * @covers \Magento\Signifyd\Model\CaseManagement::create
     * @magentoDataFixture Magento/Signifyd/_files/order_with_customer_and_two_simple_products.php
     */
    public function testCreate()
    {
        $order = $this->getOrder();
        $case = $this->caseManagement->create($order->getEntityId());

        self::assertNotEmpty($case->getEntityId());
        self::assertEquals(CaseInterface::STATUS_PENDING, $case->getStatus());
        self::assertEquals(CaseInterface::GUARANTEE_PENDING, $case->getGuaranteeDisposition());
    }

    /**
     * @covers \Magento\Signifyd\Model\CaseManagement::getByOrderId
     * @magentoDataFixture Magento/Signifyd/_files/case.php
     */
    public function testGetByOrderId()
    {
        $order = $this->getOrder();
        $case = $this->caseManagement->getByOrderId($order->getEntityId());

        self::assertEquals(CaseInterface::STATUS_PROCESSING, $case->getStatus());
        self::assertEquals(CaseInterface::DISPOSITION_GOOD, $case->getReviewDisposition());
        self::assertEquals('2016-12-12 15:17:17', $case->getCreatedAt());
        self::assertEquals('2016-12-12 19:23:16', $case->getUpdatedAt());
    }

    /**
     * Get stored order
     * @return OrderInterface
     */
    private function getOrder()
    {
        /** @var SearchCriteriaBuilder $searchCriteriaBuilder */
        $searchCriteriaBuilder = $this->objectManager->get(SearchCriteriaBuilder::class);
        $searchCriteria = $searchCriteriaBuilder->addFilter(OrderInterface::INCREMENT_ID, '100000001')
            ->create();

        $orderRepository = $this->objectManager->get(OrderRepositoryInterface::class);
        $orders = $orderRepository->getList($searchCriteria)
            ->getItems();

        /** @var OrderInterface $order */
        return array_pop($orders);
    }
}
