<?php

namespace Tests\Feature;

use App\Models\Access;
use App\Models\AccessRole;
use App\Models\AdminUser;
use App\Models\Role; 
use App\Modules\Admin\Libraries\RoleModule;

use Illuminate\Foundation\Testing\RefreshDatabase;
use Illuminate\Foundation\Testing\WithFaker;

use Laravel\Sanctum\Sanctum;

use Tests\TestCase;

class SystemLibraryRoleTest extends TestCase
{
    use RefreshDatabase;

    private Role $role; 

    /**
     * Set Up Test
     * 
     * @return void 
     */
    protected function setUp(): void
    {
        //! php artisan test --filter SystemLibraryRoleTest 
        parent::setUp();

        $superAdmin = AdminUser::factory()->create();

        Sanctum::actingAs(
            $superAdmin,
            ['*']
        );

        $this->role = Role::factory()->create();
    }

    /**
     * Test List Items
     * 
     * @return void 
     */
    public function test_list(): void
    {
        $response = (new RoleModule())->getData([]);

        $this->assertTrue($response->status() == 200, "HTTP Status Code is 200");

        $data = $response->getData(true);

        $this->assertIsArray($data);
        $this->assertArrayHasKey('data', $data);
        $this->assertArrayHasKey('links', $data);
        $this->assertArrayHasKey('meta', $data);

        $this->assertTrue(count($data['data']) >= 0);
    }

    /**
     * Test View Item 
     * 
     * @return void 
     */
    public function test_view(): void
    {
        $role = Role::first(); 

        $response = (new RoleModule())->getDetails($role->id);

        $this->assertTrue($response->status() == 200, "HTTP Status Code is 200");

        $data = $response->getData(true);

        $this->assertTrue(count($data['data']) >= 1);

        $this->assertEquals($role->name, $role->name, "Retrieved Item's name must be {$role->name}");
    }

    /**
     * Test Update Item
     * 
     * @return void 
     */
    public function test_update(): void
    {
        $accessPage =  Access::factory()
            ->count(5)
            ->create(); 

        $accessPageIds = []; 

        foreach ($accessPage as $access)
        {
            array_push($accessPageIds, $access['id']);
        }

        $response = (new RoleModule())->updateData(
            [
                "name"   => 'test',
                "access" => $accessPageIds
            ],
            $this->role->id
        );

        $this->assertTrue($response->status() == 200, "HTTP Status Code is 200");

        $this->assertDatabaseHas(
            Role::class,
            [
                "id"   => $this->role->id,
                "name" => 'test'
            ]
        );

        foreach ($accessPage as $access) 
        {
            $this->assertDatabaseHas(
                AccessRole::class,
                [
                    "access_id" => $access['id'],
                    "role_id"   => $this->role->id
                ]
            );
        }
    }
}
