<?php

namespace Tests\Browser\Pages;

use Laravel\Dusk\Browser;
use Laravel\Dusk\Page;
use Illuminate\Support\Str;
use Facebook\WebDriver\WebDriverBy;

use Tests\ObjectsTrait;
use Tests\Browser\Components\Feedback;
use Tests\Browser\Components\PageSideMenu;

use App\Models\User;
use App\Models\Page as ContentPage;

class Login extends Page
{
    use ObjectsTrait;

    /**
     * Get the URL for the page.
     *
     * @return string
     */
    public function url()
    {
        return '/hub';
    }

    /**
     * Assert that the browser is on the page.
     *
     * @param  Browser  $browser
     * @return void
     */
    public function assert(Browser $browser)
    {
        //$browser->assertPathIs($this->url());
    }

    public function loginAndEdit(Browser $browser, User $user = null)
    {
        $community = ContentPage::whereHas('versions', function ($query) {
            $query->where('name', 'Community');
        })->first();
        $this->loginAndEditPage($browser, $community, $user);
    }

    public function loginAndEditPage(Browser $browser, ContentPage $page = null, User $user = null)
    {
        if (!$page) {
            $page = ContentPage::factory()->create();
        }

        if (!$user) {
            $user = User::factory()->create();
        }

        $user->addRole('pages-editor');
        $user->createPermission('update', $page);

        $this->loginUser($browser, $user);

        $slug = $this->getEditingValue($page, 'full_slug');

        //dump($slug);

        $browser->visit('/'.$slug.'?editing=true')
            ->waitFor('@editing-button')
            ->assertVue('editing', true, '@editing-button');
    }

    public function loginUser(Browser $browser, User $user, $url = 'hub')
    {
        $password = Str::random(8);
        $user->password = bcrypt($password);
        $user->save();

        $browser->pause(500);

        $logged_in = count($browser->driver->findElements(WebDriverBy::id('user-menu')));

        if ($logged_in) {
            $browser->click('@user-menu')
                    ->pause(250)
                    ->clickAndWaitForReload('@logout-button');
        }

        $browser->visit('/login?url=/'.$url)
            ->waitFor('@login-email')
            ->pause(500)
            ->type('@login-email', $user->email)
            ->type('@login-password', $password)
            ->pause(500)
            ->click('@submit-login-button')
            ->within(new Feedback(), function ($browser) {
                $browser->assertFeedbackContains('Login Successful');
            })
            //->loginAs($user) // may want to do this so that the test auth matches the browser auth?
            ->assertAuthenticatedAs($user);
    }
}
