<?php

namespace Tests\Browser;

use Illuminate\Foundation\Testing\DatabaseMigrations;
use Illuminate\Foundation\Testing\WithFaker;
use Laravel\Dusk\Browser;
use Tests\DuskTestCase;

use Tests\Browser\Pages\Login;
use Tests\Browser\Components\Feedback;
use Tests\Browser\Components\AddContentElement;
use Tests\Browser\Components\Autocomplete;

use App\Models\Blog;
use App\Models\Page;
use App\Models\User;
use App\Models\Tag;
use App\Models\PhotoBlock;
use App\Models\ContentElement;
use App\Models\PublicationLayout;

class PublicationListTest extends DuskTestCase
{
    use WithFaker;

    public function test_a_publication_list_can_be_created()
    {
        $this->browse(function ($browser) {
            $tag = Tag::factory()->create();
            $blog = Blog::factory()->create();
            $blog_content_element = $this->createContentElement(PhotoBlock::factory()->withText(), $blog);
            $photo_block = $blog_content_element->content;
            $blog->addTag($tag);
            $blog->publish();

            $this->assertNotNull($photo_block->header);
            $this->assertNotNull($photo_block->body);

            $page = Page::factory()->create();
            $user = User::factory()->create();
            $user->createPermission('publish', $page);

            $browser->visit(new Login())
                ->loginAndEditPage($page, $user)
                ->assertAuthenticatedAs($user)
                ->waitFor('@content-elements-editor')
                ->with(new AddContentElement(), function ($browser) {
                    $browser->create('publication-list');
                });

            $content_element = ContentElement::all()->last();
            $header = $this->faker->sentence(3);

            $browser->with('@content-element-'.$content_element->id, function ($browser) use ($tag, $header) {
                $browser->waitFor('@header')
                    ->type('@header', $header)
                    ->with('@select-buttons-publication-list-type', function ($browser) {
                        $browser->click('@select-blog');
                    })
                    ->with(new Autocomplete('tags'), function ($browser) use ($tag) {
                        $browser->searchAndSelectMultiple($tag);
                    })
                    ->click('@add-thumbnail');
            })
                ->pause(1500)
                ->within(new Feedback(), function ($browser) {
                    $browser->assertFeedbackContains('Publication List Saved');
                });

            $publication_layout = PublicationLayout::all()->last();

            $content_element->refresh();
            $this->assertNotNull($blog->name);

            $browser->click('@publish-page')
                ->acceptDialog()
                ->within(new Feedback(), function ($browser) {
                    $browser->assertFeedbackContains('Page Published');
                })
                ->pause(1500)
                ->waitForReload(function ($browser) {
                    $browser->click('@editing-button');
                })
                ->waitFor('@editing-button')
                ->assertVue('editing', false, '@editing-button')
                ->waitFor('@content-element-'.$content_element->id)
                ->click('@debug')
                ->with('@content-element-'.$content_element->id, function ($browser) use ($tag, $header, $photo_block, $content_element, $blog) {
                    $browser->waitFor('@publication-list-header-'.$content_element->content->id)
                            ->assertSee($header)
                            ->waitFor('@publication-thumbnail-'.$blog->id)
                            ->with('@publication-thumbnail-'.$blog->id, function ($browser) use ($photo_block, $blog) {
                                $browser->assertSee($blog->name)
                                    ->assertSee(strip_tags($photo_block->body));
                            })
                            ->click('@publication-thumbnail-'.$blog->id);
                })
                ->waitForLocation('/'.$blog->full_slug)
                ->assertSee($photo_block->header)
                ->assertSee(strip_tags(substr($photo_block->body, 20)));
        });
    }
}
