<?php

namespace Tests\Browser;

use Illuminate\Foundation\Testing\DatabaseMigrations;
use Illuminate\Foundation\Testing\WithFaker;
use Laravel\Dusk\Browser;
use Tests\DuskTestCase;

use App\Models\User;
use App\Models\Role;
use Tests\Browser\Pages\Login;
use Tests\Browser\Components\Autocomplete;
use Tests\Browser\Components\Feedback;

class RoleTest extends DuskTestCase
{
    use WithFaker;

    public function test_a_user_can_have_roles_assigned_and_removed()
    {
        $this->browse(function ($browser) {
            $admin = User::factory()->create();
            $admin->addRole('admin');
            $admin->refresh();

            $user = User::factory()->create();
            $role = Role::factory()->create();
            $name = $this->faker->name();

            $browser->visit(new Login())
                    ->loginUser($admin)
                    ->visit(route('roles.index'))
                    ->waitForRoute('roles.index')
                    ->waitFor('@role-'.$role->id)
                    ->click('@role-'.$role->id)
                    ->waitFor('@form-role-'.$role->id)
                    ->with('@form-role-'.$role->id, function ($browser) use ($name, $user) {
                        $browser->type('@name', $name)
                            ->with(new Autocomplete('role-users'), function ($browser) use ($user) {
                                $browser->searchAndSelectMultiple($user);
                            })
                            ->click('@save-role');
                    })
            ->within(new Feedback(), function ($browser) use ($name) {
                $browser->assertFeedbackContains($name.' Saved');
            });

            $role->refresh();
            $user->refresh();
            $this->assertTrue($role->users->contains('id', $user->id));
            $this->assertTrue($user->hasRole($role));

            $browser->pause(1000)
                ->click('@remove-users-'.$user->id)
                ->pause(500)
                ->within(new Feedback(), function ($browser) use ($name) {
                    $browser->assertFeedbackContains($name.' Saved');
                })
                ->pause(500);

            $role->refresh();
            $user->refresh();
            $this->assertFalse($role->users->contains('id', $user->id));
            $this->assertFalse($user->hasRole($role));
        });
    }
}
