<?php

namespace Tests\Feature\Api\Event;

use App\Enums\GuestNotificationAudience;
use App\Models\Event;
use App\Models\GuestNotification;
use App\Models\Tenant;
use App\Services\EventJoinTokenService;
use Illuminate\Foundation\Testing\RefreshDatabase;
use Tests\TestCase;

class GuestNotificationCenterTest extends TestCase
{
    use RefreshDatabase;

    public function test_guest_can_fetch_notifications(): void
    {
        $tenant = Tenant::factory()->create();
        $event = Event::factory()->for($tenant)->create(['status' => 'published']);

        GuestNotification::factory()->create([
            'tenant_id' => $tenant->id,
            'event_id' => $event->id,
            'title' => 'Broadcast',
        ]);

        GuestNotification::factory()->create([
            'tenant_id' => $tenant->id,
            'event_id' => $event->id,
            'title' => 'Target',
            'audience_scope' => GuestNotificationAudience::GUEST,
            'target_identifier' => 'device-123',
        ]);

        $token = app(EventJoinTokenService::class)->createToken($event)->plain_token;

        $response = $this->withHeaders([
            'X-Device-Id' => 'device-123',
        ])->getJson("/api/v1/events/{$token}/notifications");

        $response->assertOk();
        $response->assertJsonPath('meta.unread_count', 2);
        $response->assertJsonCount(2, 'data');
        $response->assertJsonFragment(['title' => 'Target']);
    }

    public function test_guest_can_mark_notification_read(): void
    {
        $tenant = Tenant::factory()->create();
        $event = Event::factory()->for($tenant)->create(['status' => 'published']);
        $notification = GuestNotification::factory()->create([
            'tenant_id' => $tenant->id,
            'event_id' => $event->id,
        ]);

        $token = app(EventJoinTokenService::class)->createToken($event)->plain_token;

        $response = $this->withHeaders([
            'X-Device-Id' => 'device-abc',
        ])->postJson("/api/v1/events/{$token}/notifications/{$notification->id}/read");

        $response->assertOk();
        $response->assertJsonPath('status', 'read');

        $this->assertDatabaseHas('guest_notification_receipts', [
            'guest_notification_id' => $notification->id,
            'guest_identifier' => 'device-abc',
            'status' => 'read',
        ]);
    }

    public function test_guest_cannot_access_notification_from_other_event(): void
    {
        $tenant = Tenant::factory()->create();
        $event = Event::factory()->for($tenant)->create(['status' => 'published']);
        $otherEvent = Event::factory()->for($tenant)->create(['status' => 'published']);

        $notification = GuestNotification::factory()->create([
            'tenant_id' => $tenant->id,
            'event_id' => $otherEvent->id,
        ]);

        $token = app(EventJoinTokenService::class)->createToken($event)->plain_token;

        $response = $this->withHeaders([
            'X-Device-Id' => 'device-999',
        ])->postJson("/api/v1/events/{$token}/notifications/{$notification->id}/read");

        $response->assertStatus(404);
    }
}
