<?php

namespace Tests\Browser;

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

use App\Models\Page;
use App\Models\User;
use App\Models\PhotoBlock;
use App\Models\TextBlock;
use App\Models\ContentElement;
use App\Models\Photo;

use Tests\Browser\Pages\Login;
use Tests\Browser\Components\Feedback;
use Tests\Browser\Components\AddContentElement;
use Tests\Browser\Components\PhotoUpload;
use Tests\Browser\Components\Editor;
use Tests\Browser\Scroll;

class PhotoTest extends DuskTestCase
{
    use WithFaker;

    public function test_a_photo_is_loaded_when_it_comes_on_screen()
    {
        $this->browse(function ($browser) {
            $page = Page::factory()->create();
            $user = User::factory()->create();
            $user->createPermission('publish', $page);

            $browser->visit(new Login())
                ->loginAndEditPage($page, $user)
                ->waitFor('@content-elements-editor')
                ->with(new AddContentElement(), function ($browser) {
                    $browser->create('text-block');
                })->pause(1500);

            $content_element = ContentElement::all()->last();

            $header = $this->faker->sentence(3);
            $body = $this->faker->paragraph(100);

            $browser->with('@content-element-'.$content_element->id, function ($browser) use ($header, $body, $content_element) {
                $browser->waitFor('@header')
                        ->type('@header', $header)
                        ->within(new Editor('body', $content_element->id), function ($browser) use ($body) {
                            $browser->typeInEditor($body);
                        });
            })
            ->pause(1300) // so that the debounce triggers
            ->within(new Feedback(), function ($browser) {
                $browser->assertFeedbackContains('Text Block Saved');
            });

            $browser->with(new AddContentElement(), function ($browser) {
                $browser->create('photo-block');
            })->pause(1500);

            $content_element2 = ContentElement::all()->last();

            $browser->with(new PhotoUpload($content_element2), function ($browser) {
                $browser->addPhoto();
            })
            ->pause(1500);

            $photo = Photo::all()->last();

            $browser->click('@publish-page')
                ->acceptDialog()
                ->within(new Feedback(), function ($browser) {
                    $browser->assertFeedbackContains('Page Published');
                })
                ->clickAndWaitForReload('@editing-button')
                ->assertNotPresent('@page-editor');

            $browser->driver->executeScript('window.scrollTo({ left: 0, top: document.body.scrollHeight, behavior: "smooth" });');

            $browser->waitFor('@content-element-'.$content_element2->id)
                ->assertSee($header)
                ->assertSee($body)
                ->assertSourceHas('photo-container-'.$photo->id);
            //->assertSourceMissing('photo-'.$photo->id);

            Scroll::centerInView($browser, '@content-element-'.$content_element2->id);

            $browser->pause(1000)
                ->assertSourceHas('photo-'.$photo->id)
                ->assertVisible('@photo-'.$photo->id);
        });
    }

    public function test_a_photo_can_be_enlarged()
    {
        $this->browse(function ($browser) {
            $page = Page::factory()->create();
            $user = User::factory()->create();
            $user->createPermission('publish', $page);

            $browser->visit(new Login())
                ->loginAndEditPage($page, $user)
                ->waitFor('@content-elements-editor')
                ->with(new AddContentElement(), function ($browser) {
                    $browser->create('photo-block');
                })->pause(1500);

            $content_element = ContentElement::all()->last();

            $browser->with(new PhotoUpload($content_element), function ($browser) {
                $browser->addPhoto();
            })
            ->pause(1500);

            $photo = Photo::all()->last();

            $browser->whenAvailable('@form-photo-'.$photo->id, function ($browser) use ($photo) {
                $browser->click('@enlarge');
            })->pause(1500);

            $photo->refresh();
            $this->assertTrue($photo->enlarge);

            $browser->with(new PhotoUpload($content_element), function ($browser) {
                $browser->addPhoto();
            })
            ->pause(1500);

            $photo2 = Photo::all()->last();

            $browser->whenAvailable('@form-photo-'.$photo2->id, function ($browser) use ($photo2) {
                $browser->click('@enlarge');
            })->pause(1500);

            $browser->click('@publish-page')
                ->acceptDialog()
                ->within(new Feedback(), function ($browser) {
                    $browser->assertFeedbackContains('Page Published');
                })
                ->clickAndWaitForReload('@editing-button')
                ->assertNotPresent('@page-editor')
                ->click('@photo-'.$photo->id)
                ->waitFor('@photo-viewer')
                ->with('@photo-viewer', function ($browser) use ($photo, $photo2) {
                    $browser->waitFor('@photo-'.$photo->id)
                            ->click('@next-photo')
                            ->pause(500)
                            ->waitFor('@photo-'.$photo2->id)
                            ->click('@prev-photo')
                            ->pause(500)
                            ->waitFor('@photo-'.$photo->id)
                            ->click('@close');
                })
                ->pause(500)
                ->assertMissing('@photo-viewer');
        });
    }
}
