<?php

namespace Tests\Unit;

use Tests\TestCase;

use App\Models\Page;
use App\Models\User;
use App\Utilities\Menu;
use Illuminate\Support\Collection;
use Illuminate\Support\Str;

class MenuTest extends TestCase
{
    public function test_a_menu_can_be_rendered()
    {
        $page = Page::factory()->create();
        $version = $page->getDraftVersion();
        $version->unlisted = 0;
        $version->save();
        $page->publish();
        $page->refresh();
        $name = $page->publishedVersion->name;

        // save the page to test cache clearing
        $this->signInAdmin();
        $page = (new Page)->savePage($page->toArray(), $page->id);

        $menu = Menu::getMenu();

        $this->assertNotNull(collect($menu)->firstWhere(function($m) use($name) {
            return $m['version']['name'] === $name;
        }));
    }

    public function test_the_page_tree_menu_can_be_loaded()
    {
        $home_page = Page::find(1);
        $menu = Menu::getMenu();
        $this->assertTrue(collect($menu)->contains('id', $home_page->pages->first()->id));
    }

    public function test_module_pages_can_be_loaded()
    {
        $modules = Menu::getModules();

        $this->assertInstanceOf(Collection::class, $modules);

        $this->assertEquals(0, $modules->count());

        $user = User::factory()->create();
        $this->signIn($user);

        $modules = Menu::getModules();
        $this->assertEquals(0, $modules->count());

        $user->addRole('livestreams-manager');
        $user->refresh();
        $this->assertTrue($user->hasRole('livestreams-manager'));
        $this->signIn($user);
        $modules = Menu::getModules();
        $this->assertEquals(1, $modules->count());
        $this->assertTrue($modules->contains('name', 'Livestreams'));

        $user->addRole('blogs-manager');
        $user->refresh();
        $this->signIn($user);
        $modules = Menu::getModules();
        $this->assertTrue($modules->contains('name', 'Blogs'));

        $user->addRole('inquiries-manager');
        $user->refresh();
        $this->signIn($user);
        $modules = Menu::getModules();
        $this->assertTrue($modules->contains('name', 'Inquiries'));

        $this->signInAdmin();
        $modules = Menu::getModules();
        $this->assertTrue($modules->contains('name', 'Livestreams'));
        $this->assertTrue($modules->contains('name', 'Blogs'));
        $this->assertTrue($modules->contains('name', 'Inquiries'));
        $this->assertTrue($modules->contains('name', 'Users'));
        $this->assertTrue($modules->contains('name', 'Page Permissions'));
        $this->assertTrue($modules->contains('name', 'Roles'));
        $this->assertTrue($modules->contains('name', 'Queue Monitor'));
    }

    /*
    public function the_community_menu_pages_can_be_collected()
    {
        $pages = Menu::getCommunityPages();

        $this->assertInstanceOf(Collection::class, $pages);
        $this->assertTrue($pages->count() > 0);
        $this->assertInstanceOf(Page::class, $pages->first());
        $this->assertNotNull(collect($pages->first()->toArray())->contains('published_version'));
    }
     */
}
