<?php

namespace Tests\Browser\Components;

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

use Illuminate\Support\Str;

use Tests\Browser\Components\Feedback;

use App\Models\ContentElement;
use App\Models\Photo;

class PhotoUpload extends BaseComponent
{
    public $content_element;

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

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

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

    public function addPhoto(Browser $browser, Photo $existing_photo = null)
    {
        $browser->with('@add-photos', function ($browser) {
            $browser->click('@toggle-upload-form');
        });

        if ($existing_photo) {

            $browser->elsewhere('#app', function ($browser) {
                $browser->click('@debug');
            });

            $browser->elsewhereWhenAvailable('@modal', function ($browser) use ($existing_photo) {
                $browser->whenAvailable('@photo-container-'.$existing_photo->id, function($browser) use ($existing_photo) {
                    $browser->pause(250)
                        ->click('@photo-'.$existing_photo->id)
                        ->pause(250);
                })
                ->click('@add-images')
                ->pause(500);
            });
        } else {
            $browser->elsewhereWhenAvailable('@modal', function ($browser) {
                $browser->with('@file-uploads-form', function ($browser) {
                    $browser->waitFor('@upload-new-images');
                    //->click('@upload-new-images');
                });
            })
            ->attach($this->content_element->type.'-'.$this->content_element->uuid, __DIR__.'/../default.png');
        }

        $browser->pause(1500) // so that the debounce triggers
            ->elsewhere('#app', function ($browser) {
                $browser->with(new Feedback(), function ($browser) {
                    $browser->assertFeedbackContains(Str::headline($this->content_element->type).' Saved');
                });
            });
    }
}
