<?php

namespace Modules\Menu\Tests;

class MenuOrdenerTest extends BaseMenuTest
{
    /**
     * @var \Modules\Menu\Services\MenuOrdener
     */
    protected $menuOrdener;

    public function setUp(): void
    {
        parent::setUp();
        $this->createMenu('main', 'Main Menu');
        $this->menuOrdener = app('Modules\Menu\Services\MenuOrdener');
    }

    /** @test */
    public function it_makes_item_child_of()
    {
        // Prepare
        $menu = $this->createMenu('main', 'Main Menu');
        $menuItem1 = $this->createMenuItemForMenu($menu->id, 1);
        $menuItem2 = $this->createMenuItemForMenu($menu->id, 2);
        $request = [
            1 => [
                'id' => $menuItem1->id,
                'children' => [
                    0 => [
                        'id' => $menuItem2->id,
                    ],
                ],
            ],
        ];
        $request = json_encode($request);

        // Run
        $this->menuOrdener->handle($request);

        // Assert
        $child = $this->menuItem->find($menuItem2->id);
        $this->assertEquals($menuItem1->id, $child->parent_id);
    }

    /** @test */
    public function it_makes_items_child_of_recursively()
    {
        // Prepare
        $menu = $this->createMenu('main', 'Main Menu');
        $menuItem1 = $this->createMenuItemForMenu($menu->id, 0);
        $menuItem2 = $this->createMenuItemForMenu($menu->id, 0, $menuItem1->id);
        $menuItem3 = $this->createMenuItemForMenu($menu->id, 1, $menuItem1->id);
        $request = [
            1 => [
                'id' => $menuItem1->id,
                'children' => [
                    0 => [
                        'id' => $menuItem2->id,
                        'children' => [
                            0 => [
                                'id' => $menuItem3->id,
                            ],
                        ],
                    ],
                ],
            ],
        ];
        $request = json_encode($request);

        // Run
        $this->menuOrdener->handle($request);

        // Assert
        $child = $this->menuItem->find($menuItem2->id);
        $this->assertEquals($menuItem1->id, $child->parent_id);
        $child2 = $this->menuItem->find($menuItem3->id);
        $this->assertEquals($menuItem2->id, $child2->parent_id);
    }

    /** @test */
    public function it_reorders_items()
    {
        // Prepare
        $menu = $this->createMenu('main', 'Main Menu');
        $menuItem1 = $this->createMenuItemForMenu($menu->id, 1);
        $menuItem2 = $this->createMenuItemForMenu($menu->id, 2);

        $request = [
            1 => [
                'id' => $menuItem2->id,
            ],
            2 => [
                'id' => $menuItem1->id,
            ],
        ];
        $request = json_encode($request);

        // Run
        $this->menuOrdener->handle($request);

        // Assert
        $item1 = $this->menuItem->find($menuItem1->id);
        $this->assertEquals(2, $item1->position);
        $item2 = $this->menuItem->find($menuItem2->id);
        $this->assertEquals(1, $item2->position);
    }

    /** @test */
    public function it_moves_items_to_root()
    {
        // Prepare
        $menu = $this->createMenu('main', 'Main Menu');
        $menuItem1 = $this->createMenuItemForMenu($menu->id, 0);
        $menuItem2 = $this->createMenuItemForMenu($menu->id, 1, $menuItem1->id);

        $request = [
            0 => [
                'id' => $menuItem1->id,
            ],
            1 => [
                'id' => $menuItem2->id,
            ],
        ];
        $request = json_encode($request);

        // Run
        $this->menuOrdener->handle($request);

        // Assert
        $item1 = $this->menuItem->find($menuItem1->id);
        $this->assertEquals(null, $item1->parent_id);
        $item2 = $this->menuItem->find($menuItem2->id);
        $this->assertEquals(null, $item2->parent_id);
    }
}
