<?php

namespace Tests\Feature;

use App\Models\AdminUser;
use App\Models\Experience;
use App\Modules\Admin\Libraries\ExperienceModule; 

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

use Laravel\Sanctum\Sanctum;

use Tests\TestCase;

class SystemLibraryExperienceTest extends TestCase
{
    use RefreshDatabase;

    private Experience $experience;

    /**
     * Set Up Test
     * 
     * @return void 
     */
    protected function setUp(): void
    {
        parent::setUp();

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

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

        $this->experience = Experience::factory()
            ->state(
                [
                    'name' => "Doctorate"
                ]
            )
            ->create();
    }

    /**
     * Test List Items
     * 
     * @return void 
     */
    public function test_list(): void
    {
        Experience::factory()->count(20)->create();

        $response = (new ExperienceModule())->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']) >= 10);
    }

    /**
     * Test View Item 
     * 
     * @return void 
     */
    public function test_view(): void
    {
        $response = (new ExperienceModule())->getDetails($this->experience->id);

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

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

        $this->assertTrue(count($data['data']) >= 1);
    
        $this->assertEquals('Doctorate', $data['data'][0]['name'], "Retrieved Item's name must be 'Doctorate'");
    }

    /**
     * Test Create Item
     * 
     * @return void 
     */
    public function test_create(): void
    {
        $response = (new ExperienceModule())->storeData(
            [
                "name" => "10 Years"
            ]
        );

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

        $this->assertDatabaseHas(
            Experience::class, 
            [
                "name" => "10 Years"
            ]
        );
    }

    /**
     * Test Update Item
     * 
     * @return void 
     */
    public function test_update(): void
    {
        $response = (new ExperienceModule())->updateData(
            [
                "name" => "Bachelors"
            ], 
            $this->experience->id 
        );

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

        $this->assertDatabaseHas(
            Experience::class,
            [
                "name" => "Bachelors"
            ]
        );
    }

    /**
     * Test Delete Item
     * 
     * @return void 
     */
    public function test_delete(): void
    {
        $currentTableCount = Experience::count();

        $response = (new ExperienceModule())->deleteData(
            $this->experience->id
        );

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

        $this->assertDatabaseCount('experiences', ($currentTableCount - 1));
    }
}
