<?php

namespace Tests\Browser\Components;

use Laravel\Dusk\Browser;
use Laravel\Dusk\Component as BaseComponent;
use Illuminate\Support\Str;
use Tests\Browser\Scroll;
use App\Models\ContentElement;

class AddContentElement extends BaseComponent
{
    public $index;

    public function __construct($index = 'last')
    {
        $this->index = $index;
    }

    /**
     * Get the root selector for the component.
     *
     * @return string
     */
    public function selector()
    {
        return '@add-content-element-'.$this->index;
    }

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

    public function create(Browser $browser, $type)
    {
        if ($this->index !== 'last') {
            Scroll::centerInView($browser, '@show-add-content-element-'.$this->index);

            $browser->click('@show-add-content-element-'.$this->index)
                ->pause(500);
        }

        $browser->waitFor('@add-'.$type, 10)
            ->pause(100)
            ->click('@add-'.$type)
            ->pause(1200)
            ->elsewhere(new Feedback(), function ($browser) use ($type) {
                $browser->assertFeedbackContains(Str::headline($type).' Saved');
            });
    }

    public function instance(Browser $browser, ContentElement $content_element)
    {
        $page = $content_element->pages()->first();
        $browser->waitFor('@add-instance', 10)
            ->pause(100)
            ->click('@add-instance')
            ->elsewhereWhenAvailable('@modal', function ($browser) use ($content_element, $page) {
                $browser->whenAvailable('@page-tree', function ($browser) use ($content_element, $page) {
                    $browser->waitFor('@page-list-'.$page->id)
                            ->click('@page-list-'.$page->id)
                            ->waitFor('@content-element-'.$content_element->id)
                            ->click('@content-element-'.$content_element->id);
                });
            })
            ->elsewhere(new Feedback(), function ($browser) use ($content_element) {
                $browser->assertFeedbackContains(Str::headline($content_element->type).' Saved');
            });
    }
}
