<?php

namespace Tests\Feature;

use Illuminate\Foundation\Testing\DatabaseTransactions;
use Tests\Feature\Concerns\BuildsFeatureData;
use Tests\TestCase;

class AdminAdsFeatureTest extends TestCase
{
    use BuildsFeatureData;
    use DatabaseTransactions;

    private function loginAsAdmin(): void
    {
        $this->actingAs($this->createAdminUser());
    }

    public function test_admin_can_view_ads_index_and_create_page(): void
    {
        $this->loginAsAdmin();

        $this->get(route('admin.ads.index'))->assertOk();
        $this->get(route('admin.ads.create'))->assertOk();
    }

    public function test_admin_can_store_update_toggle_and_delete_ad(): void
    {
        $this->loginAsAdmin();

        $storeResponse = $this->post(route('admin.ads.store'), [
            'name' => 'Iklan Banner Atas',
            'description' => 'Deskripsi iklan',
            'position' => 'banner_top',
            'size' => '728x90',
            'code' => '<script>console.log("ad")</script>',
            'is_active' => '1',
            'sort_order' => 1,
        ]);

        $storeResponse->assertRedirect(route('admin.ads.index'));

        $ad = \App\Models\Ad::where('name', 'Iklan Banner Atas')->firstOrFail();

        $this->get(route('admin.ads.edit', $ad))->assertOk();

        $updateResponse = $this->put(route('admin.ads.update', $ad), [
            'name' => 'Iklan Banner Update',
            'description' => 'Deskripsi iklan update',
            'position' => 'banner_bottom',
            'size' => '468x60',
            'code' => '<div>updated-code</div>',
            'is_active' => '1',
            'sort_order' => 2,
        ]);

        $updateResponse->assertRedirect(route('admin.ads.index'));
        $this->assertDatabaseHas('ads', [
            'id' => $ad->id,
            'name' => 'Iklan Banner Update',
            'position' => 'banner_bottom',
            'sort_order' => 2,
        ]);

        $toggleResponse = $this->patch(route('admin.ads.toggle', $ad));
        $toggleResponse->assertRedirect(route('admin.ads.index'));
        $this->assertDatabaseHas('ads', [
            'id' => $ad->id,
            'is_active' => false,
        ]);

        $deleteResponse = $this->delete(route('admin.ads.destroy', $ad));
        $deleteResponse->assertRedirect(route('admin.ads.index'));
        $this->assertDatabaseMissing('ads', ['id' => $ad->id]);
    }
}
