<?php

namespace Tests\Browser\Components;

use Laravel\Dusk\Browser;
use Laravel\Dusk\Component as BaseComponent;

use Illuminate\Support\Arr;

use Tests\Browser\Components\Feedback;
use Tests\Browser\Components\Editor;
use Tests\Browser\Components\AddContentElement;

use App\Models\ContentElement;
use App\Models\PhotoBlock;

class ContentElements extends BaseComponent
{
    /**
     * Get the root selector for the component.
     */
    public function selector(): string
    {
        return '@content-elements-editor';
    }

    /**
     * Assert that the browser page contains the component.
     */
    public function assert(Browser $browser): void
    {
        $browser->assertVisible($this->selector());
    }

    public function createPhotoBlock(Browser $browser, $header = null, $body = null)
    {
        $browser->with(new AddContentElement(), function ($browser) {
            $browser->create('photo-block');
        })
            ->pause(1500);

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

        $raw = PhotoBlock::factory()->withText()->raw();

        if (!$header) {
            $header = Arr::get($raw, 'header');
        }

        if (!$body) {
            $body = Arr::get($raw, 'body');
        }

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

        return $browser;
    }
}
