<?php

use App\Models\Activity;
use App\Models\User;
use Illuminate\Foundation\Testing\RefreshDatabase;
use Inertia\Testing\AssertableInertia as Assert;

uses(RefreshDatabase::class);

it('marks activity as read with patch request', function () {
    $user = User::factory()->create();
    $this->actingAs($user);

    // Create required related models (using the same approach as NotificationsUnreadFilterTest)
    $action = \App\Models\Action::factory()->create();
    $decision = \App\Models\Decision::factory()->create();
    $clientCase = \App\Models\ClientCase::factory()->create();

    // Create an activity
    $activity = Activity::query()->create([
        'due_date' => now()->toDateString(),
        'amount' => 100,
        'action_id' => $action->id,
        'decision_id' => $decision->id,
        'client_case_id' => $clientCase->id,
    ]);

    // Ensure no read record exists initially
    $this->assertDatabaseMissing('activity_notification_reads', [
        'user_id' => $user->id,
        'activity_id' => $activity->id,
    ]);

    // Send PATCH request to mark as read
    $response = $this->patch(route('notifications.activity.read'), [
        'activity_id' => $activity->id,
    ]);

    $response->assertRedirect();

    // Verify the read record was created
    $this->assertDatabaseHas('activity_notification_reads', [
        'user_id' => $user->id,
        'activity_id' => $activity->id,
    ]);
});

it('requires authentication', function () {
    // Create required related models
    $action = \App\Models\Action::factory()->create();
    $decision = \App\Models\Decision::factory()->create();
    $clientCase = \App\Models\ClientCase::factory()->create();

    $activity = Activity::query()->create([
        'due_date' => now()->toDateString(),
        'amount' => 100,
        'action_id' => $action->id,
        'decision_id' => $decision->id,
        'client_case_id' => $clientCase->id,
    ]);

    $response = $this->patch(route('notifications.activity.read'), [
        'activity_id' => $activity->id,
    ]);

    $response->assertStatus(302); // Redirect to login
});

it('validates activity_id parameter', function () {
    $user = User::factory()->create();
    $this->actingAs($user);

    // Test missing activity_id
    $response = $this->patch(route('notifications.activity.read'), []);
    $response->assertSessionHasErrors(['activity_id']);

    // Test invalid activity_id
    $response = $this->patch(route('notifications.activity.read'), [
        'activity_id' => 99999, // Non-existent ID
    ]);
    $response->assertSessionHasErrors(['activity_id']);
});

it('excludes read activities from unread notifications page', function () {
    $user = User::factory()->create();
    $this->actingAs($user);

    // Create required related models
    $action = \App\Models\Action::factory()->create();
    $decision = \App\Models\Decision::factory()->create();
    $clientCase = \App\Models\ClientCase::factory()->create();

    // Create two activities due today
    $activity1 = Activity::query()->create([
        'due_date' => now()->toDateString(),
        'amount' => 100,
        'action_id' => $action->id,
        'decision_id' => $decision->id,
        'client_case_id' => $clientCase->id,
    ]);

    $activity2 = Activity::query()->create([
        'due_date' => now()->toDateString(),
        'amount' => 200,
        'action_id' => $action->id,
        'decision_id' => $decision->id,
        'client_case_id' => $clientCase->id,
    ]);

    // Initially, both activities should appear in unread notifications
    $response = $this->get(route('notifications.unread'));
    $response->assertInertia(function (Assert $page) {
        $page->where('activities.total', 2);
    });

    // Mark first activity as read
    $this->patch(route('notifications.activity.read'), ['activity_id' => $activity1->id]);

    // Now only one activity should appear in unread notifications
    $response = $this->get(route('notifications.unread'));
    $response->assertInertia(function (Assert $page) {
        $page->where('activities.total', 1);
    });

    // Mark second activity as read
    $this->patch(route('notifications.activity.read'), ['activity_id' => $activity2->id]);

    // Now no activities should appear in unread notifications
    $response = $this->get(route('notifications.unread'));
    $response->assertInertia(function (Assert $page) {
        $page->where('activities.total', 0);
    });
});
