<?php

namespace Tests\Browser\Components;

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

use Illuminate\Support\Str;

class Autocomplete extends BaseComponent
{
    public $field;

    public function __construct($field)
    {
        $this->field = $field;
    }

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

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

    public function searchAndSelectMultiple(Browser $browser, $object, $characters = 6)
    {
        $this->searchAndSelect($browser, $object, $characters);

        $browser->within('@autocomplete-selected-items', function ($browser) use ($object) {
            $browser->assertSee($object->name ?? $object->search_label);
        });
    }

    public function searchAndSelectSingle(Browser $browser, $object, $characters = 6)
    {
        $this->searchAndSelect($browser, $object, $characters);
    }

    private function searchAndSelect(Browser $browser, $object, $characters = 6)
    {
        if (!$object->search_label) {
            $browser->fail('No search label for: '.get_class($object).':'.$object->id);
        }

        $browser->type('@autocomplete-search-'.$this->field, Str::substr($object->search_label, 0, $characters))
                ->waitFor('@autocomplete-search-results', 10)
                ->pause(250)
                ->waitFor('@search-result-'.$object->id)
                ->click('@search-result-'.$object->id)
                ->pause(250);
    }
}
