<?php

namespace Tests\Unit;

use Tests\TestCase;

use App\Models\Version;
use App\Models\Page;
use App\Models\Blog;
use App\Models\TextBlock;
use App\Models\User;

class VersionTest extends TestCase
{
    public function test_a_version_can_be_published()
    {
        $version = Version::factory()->for(Page::factory(), 'versionable')->create();
        $version->publish();

        $version->refresh();
        $this->assertNotNull($version->published_at);
    }

    public function test_a_version_belongs_to_a_page()
    {
        $version = Version::factory()->for(Page::factory(), 'versionable')->create();
        $this->assertInstanceOf(Page::class, $version->versionable);
    }

    public function test_a_version_belongs_to_a_blog()
    {
        $version = Version::factory()->for(Blog::factory(), 'versionable')->create();
        $this->assertInstanceOf(Blog::class, $version->versionable);
    }

    public function test_a_published_version_has_a_publisher()
    {
        $page = Page::factory()->create();
        $content_element = $this->createContentElement(TextBlock::factory(), $page);

        $user = User::find(1);
        $this->signIn($user);
        $this->enableEditing();

        $page->publish();

        $page->refresh();

        $this->assertNotNull($page->version->publisher_id);
        $publisher = $page->version->publisher;
        $this->assertInstanceOf(User::class, $publisher);
    }

    public function test_a_version_has_search_fields()
    {
        $fields = (new Version())->search_fields;

        $this->assertNotNull($fields);

        $this->assertTrue(collect($fields)->contains('name'));
        $this->assertTrue(collect($fields)->contains('title'));
        $this->assertTrue(collect($fields)->contains('slug'));
        $this->assertTrue(collect($fields)->contains('description'));
    }

    public function test_a_versions_redirect_can_be_parsed()
    {
        $version = Version::factory()->for(Page::factory(), 'versionable')->internalRedirect()->create();

        $this->signInAdmin();
        $this->enableEditing();

        $page = Page::find($version->redirect);
        $this->assertInstanceOf(Page::class, $page);
        $this->assertNotNull($page->publishedVersion);

        $this->disableEditing();
        auth()->logout();

        $this->assertNotNull($page->full_slug);
        $this->assertNotNull($version->redirect);

        $this->assertEquals('/'.$page->full_slug, $version->redirect);
    }
}
