<?php

declare(strict_types=1);

namespace Tests\Feature\Pwa;

use App\Models\Client;
use App\Models\Company;
use App\Models\Credit;
use App\Models\Plan;
use App\Models\Subscription;
use App\Models\User;
use Illuminate\Foundation\Testing\DatabaseTransactions;
use Illuminate\Support\Facades\Event;
use Laravel\Sanctum\Sanctum;
use PHPUnit\Framework\Attributes\Test;
use Spatie\Permission\Models\Role;
use Tests\TestCase;

/**
 * La PWA es offline-first: /api/pwa/credits debe devolver el conjunto COMPLETO de
 * créditos del cobrador para poder trabajar sin conexión. Un `->limit(100)` fijo en
 * `CreditController::index` truncaba silenciosamente la lista (un cobrador con 102
 * créditos activos solo veía 100, sin señal en `meta.total`), perdiendo datos en la
 * sincronización local. Este test fija que no hay tope de 100.
 */
class CreditListNoTruncationTest extends TestCase
{
    use DatabaseTransactions;

    #[Test]
    public function the_collector_credit_list_is_not_truncated_at_100(): void
    {
        Event::fake();
        Role::firstOrCreate(['name' => 'collector', 'guard_name' => 'web']);

        $plan = Plan::factory()->create(['has_pwa_access' => true]);
        $company = Company::factory()->create();
        Subscription::factory()->active()->create([
            'company_id' => $company->id,
            'plan_id' => $plan->id,
            'ends_at' => now()->addYear(),
        ]);

        $collector = User::factory()->create(['company_id' => $company->id]);
        $collector->assignRole('collector');
        $collector = $collector->fresh();

        $client = Client::factory()->create(['company_id' => $company->id]);

        // 101 créditos activos, hoja (sin hijos), asignados al cobrador → todos deben listarse.
        Credit::factory()->count(101)->create([
            'company_id' => $company->id,
            'client_id' => $client->id,
            'collector_user_id' => $collector->id,
            'created_by_user_id' => $collector->id,
            'status' => Credit::STATUS_ACTIVE,
            'amount' => 100_000,
            'installments_count' => 1,
            'periodicity' => 'monthly',
            'start_date' => now()->subDays(5),
            'due_date' => now()->addDays(25),
        ]);

        Sanctum::actingAs($collector);

        $response = $this->getJson('/api/pwa/credits')->assertStatus(200);

        $response->assertJsonCount(101, 'data');
        $this->assertSame(101, $response->json('meta.total'), 'meta.total debe reflejar el conteo real, no el tope');
    }
}
