<?php declare(strict_types=1);

namespace App\Tests\Feature\Controller;

use App\Controller\FoodVendorController;
use App\Entity\FoodOrder;
use App\Entity\FoodVendor;
use App\Entity\MenuItem;
use App\Entity\OrderItem;
use App\Form\FoodOrderType;
use App\Form\FoodVendorType;
use App\Repository\FoodOrderRepository;
use App\Repository\FoodVendorRepository;

use function describe;
use function pest;
use function sprintf;
use function test;

pest()
    ->beforeEach(function (): void {
        $this->setEntityClass(FoodVendor::class);
        $this->setPath('/food/vendor/');
        $this->repository = $this->manager->getRepository($this->entityClass);
    });

describe(FoodVendorController::class, function (): void {
    test('index', function (): void {
        $this->client->request('GET', $this->path);

        $this->assertResponseStatusCodeSame(200);
        $this->assertPageTitleContains('FoodVendor index');
    });

    test('new', function (): void {
        $this->assertSame(0, $this->repository->count([]));
        $this->client->request('GET', sprintf('%snew', $this->path));

        $this->assertResponseStatusCodeSame(200);

        $this->client->submitForm('Save', [
            'food_vendor[name]' => 'TestingNew',
        ]);

        $newVendor = $this->repository->findOneBy([
            'name' => 'TestingNew',
        ]);
        $this->assertInstanceof(FoodVendor::class, $newVendor);
        $this->assertSame(1, $this->repository->count([]));

    });

    test('show', function (): void {
        $fixture = new FoodVendor;
        $fixture->setName('My Title');
        $fixture->setMenuLink('https://example.com/');

        $this->manager->persist($fixture);
        $this->manager->flush();

        $crawler = $this->client->request('GET', sprintf('%s%s', $this->path, $fixture->getId()));

        $this->assertResponseIsSuccessful();

        $nameNode = $crawler->filter('td')
            ->last();
        $nameNode = $crawler->filter(
            '.table > tbody:nth-child(1) > tr:nth-child(1) > td:nth-child(2)'
        )->text();
        $menuLinkNode = $crawler->filter(
            '.table > tbody:nth-child(1) > tr:nth-child(2) > td:nth-child(2) > a:nth-child(1)'
        )->text();
        $this->assertSame('My Title', $nameNode);
        $this->assertSame('https://example.com/', $menuLinkNode);
    });

    test('show with menu items', function (): void {
        $fixture = new FoodVendor;
        $fixture->setName('My Title');

        $this->manager->persist($fixture);

        $this->manager->flush();

        $itemOne = new MenuItem;
        $itemOne->setName('Item One');

        $fixture->addMenuItem($itemOne);
        $this->manager->persist($itemOne);

        $itemTwo = new MenuItem;
        $itemTwo->setName('Item Two');
        $itemTwo->setFoodVendor($fixture);

        $fixture->addMenuItem($itemTwo);
        $this->manager->persist($itemTwo);

        $itemThree = new MenuItem;
        $itemThree->setName('Item Three');
        $itemThree->setFoodVendor($fixture);

        $fixture->addMenuItem($itemThree);
        $this->manager->persist($itemThree);

        $itemFour = new MenuItem;
        $itemFour->setName('Item Four');
        $itemFour->setFoodVendor($fixture);

        $fixture->addMenuItem($itemFour);
        $this->manager->persist($itemFour);

        $this->manager->flush();

        $crawler = $this->client->request('GET', sprintf('%s%s', $this->path, $fixture->getId()));

        $this->assertResponseIsSuccessful();
        $nameNode = $crawler->filter(
            '.table > tbody:nth-child(1) > tr:nth-child(1) > td:nth-child(2)'
        )->text();
        $this->assertSame('My Title', $nameNode);

        $itemNodes = $crawler->filter('li');

        $this->assertCount(4, $itemNodes);
    });

    test('edit', function (): void {
        $fixture = new FoodVendor;
        $fixture->setName('Value');
        $fixture->setMenuLink('Value');
        $fixture->setPhone('Value');

        $this->manager->persist($fixture);
        $this->manager->flush();

        $crawler = $this->client->request('GET', sprintf('%s%s/edit', $this->path, $fixture->getId()));
        $this->assertSame(
            $crawler->filter('#food_vendor_name')
                ->last()
                ->attr('value', ''),
            'Value'
        );
        $this->assertSame(
            $crawler->filter('#food_vendor_menuLink')
                ->last()
                ->attr('value', ''),
            'Value'
        );
        $this->assertSame(
            $crawler->filter('#food_vendor_phone')
                ->last()
                ->attr('value', ''),
            'Value'
        );

        $this->client->submitForm('Update', [
            'food_vendor[name]' => 'Something New',
            'food_vendor[menuLink]' => 'https://example.com/',
            'food_vendor[phone]' => '1234567890',
        ]);

        $this->assertResponseRedirects('/food/vendor/');

        $fixture = $this->repository->findAll();

        $this->assertSame('Something New', $fixture[0]->getName());
        $this->assertSame('https://example.com/', $fixture[0]->getMenuLink());
        $this->assertSame('1234567890', $fixture[0]->getPhone());
    });

})
    ->covers(
        FoodOrder::class,
        FoodVendor::class,
        FoodOrderRepository::class,
        MenuItem::class,
        OrderItem::class,
        FoodOrderType::class,
        FoodVendorRepository::class,
        FoodVendorController::class,
        FoodVendorType::class
    )

;