<?php

namespace Tests\Unit;

use Tests\TestCase;
use Illuminate\Support\Arr;
use Illuminate\Support\Collection;
use Illuminate\Pagination\LengthAwarePaginator;

use Tests\Unit\TagsTrait;

use App\Models\Tag;
use App\Models\PublicationList;
use App\Models\Blog;
use App\Models\PublicationLayout;

class PublicationListTest extends TestCase
{
    //use TagsTrait;

    public function getClassname()
    {
        return 'publication-list';
    }

    public function test_a_publication_lists_tags_are_always_included()
    {
        $content_element = $this->createContentElement(PublicationList::factory());
        $tag = Tag::factory()->create();
        $publication_list = $content_element->content;

        $this->assertInstanceOf(PublicationList::class, $publication_list);

        $publication_list->tags()->attach($tag, ['exclude' => false]);
        $publication_list->refresh();

        $this->assertEquals(1, $publication_list->tags->count());
        $tag = $publication_list->tags->first();

        $content_element->refresh();
        $publication_array = $content_element->content->toArray();

        $this->assertNotNull(Arr::get($publication_array, 'tags'));
        $this->assertEquals($tag->id, Arr::get($publication_array, 'tags')[0]['id']);
    }

    public function test_a_publication_list_has_a_publications_attribute()
    {
        $blog = Blog::factory()->create();
        $tag = Tag::factory()->create();
        $blog->addTag($tag);
        $blog->publish();

        $content_element = $this->createContentElement(PublicationList::factory()->blog());
        $publication_list = $content_element->content;

        $publication_list->tags()->attach($tag, ['exclude' => false]);
        $publication_list->refresh();

        $this->assertEquals('blog', $publication_list->type);

        $this->assertNotNull($publication_list->publications);
        $this->assertInstanceOf(LengthAwarePaginator::class, $publication_list->publications);
        //$this->assertEquals(1, count($publication_list->publications->items()));
        $this->assertTrue(collect($publication_list->publications->items())->contains('id', $blog->id));
    }

    public function test_a_publication_list_can_have_many_publication_layouts()
    {
        $content_element = $this->createContentElement(PublicationList::factory());
        $publication_list = $content_element->content;

        $publication_layout = PublicationLayout::factory()->create();

        $publication_list->publicationLayouts()->save($publication_layout);

        $publication_list->refresh();

        $this->assertNotNull($publication_list->publicationLayouts);
        $this->assertEquals(1, $publication_list->publicationLayouts->count());
        $this->assertInstanceOf(PublicationLayout::class, $publication_list->publicationLayouts->first());
        $this->assertEquals($publication_layout->id, $publication_list->publicationLayouts->first()->id);

        $this->assertNotNull($publication_layout->publicationList);
        $this->assertEquals($publication_list->id, $publication_layout->publicationList->id);
        $this->assertInstanceOf(PublicationList::class, $publication_layout->publicationList);
    }
}
