<?php

declare(strict_types=1);

namespace Tests\Feature\Filament;

use App\Filament\Resources\Users\Pages\CreateUser;
use App\Models\Company;
use App\Models\Plan;
use App\Models\Subscription;
use App\Models\User;
use Filament\Facades\Filament;
use Illuminate\Foundation\Testing\DatabaseTransactions;
use Livewire\Livewire;
use PHPUnit\Framework\Attributes\Test;
use Spatie\Permission\Models\Role;
use Tests\TestCase;

/**
 * En el panel /admin, crear un usuario por encima del cupo del plan debe
 * BLOQUEARSE y NOTIFICAR al admin (no crear el registro). Cierra el "recuerda
 * notificar al admin" del pedido de auditoría, en el punto de creación real.
 */
class CreateUserPlanLimitTest extends TestCase
{
    use DatabaseTransactions;

    protected function setUp(): void
    {
        parent::setUp();
        foreach (['super_admin', 'admin', 'collector'] as $r) {
            Role::firstOrCreate(['name' => $r, 'guard_name' => 'web']);
        }
        $super = User::factory()->create(['company_id' => null]);
        $super->assignRole('super_admin');
        $this->actingAs($super);
        Filament::setCurrentPanel(Filament::getDefaultPanel());
    }

    #[Test]
    public function creating_a_user_over_the_plan_cap_is_blocked_and_notifies_the_admin(): void
    {
        // Plan con tope de 2 usuarios; la empresa ya tiene 2 (al tope).
        $plan = Plan::factory()->create([
            'max_users' => 2, 'max_collectors' => 0, 'max_active_credits' => 0,
            'max_clients' => 0, 'max_monthly_volume' => 0,
        ]);
        $company = Company::factory()->create();
        Subscription::factory()->active()->create([
            'company_id' => $company->id, 'plan_id' => $plan->id, 'ends_at' => now()->addYear(),
        ]);
        User::factory()->count(2)->create(['company_id' => $company->id]);

        $email = 'tercero_'.uniqid().'@credify.test';

        Livewire::test(CreateUser::class)
            ->fillForm([
                'name' => 'Tercer Usuario',
                'email' => $email,
                'company_id' => $company->id,
                'roles' => [(int) Role::where('name', 'admin')->value('id')],
                'password' => 'clave-1234',
            ])
            ->call('create')
            ->assertNotified('Límite del plan alcanzado');

        $this->assertDatabaseMissing('users', ['email' => $email]);
    }

    #[Test]
    public function creating_a_user_under_the_cap_succeeds(): void
    {
        // Mismo plan (tope 2) pero solo 1 usuario → el 2.º entra sin problema.
        $plan = Plan::factory()->create([
            'max_users' => 2, 'max_collectors' => 0, 'max_active_credits' => 0,
            'max_clients' => 0, 'max_monthly_volume' => 0,
        ]);
        $company = Company::factory()->create();
        Subscription::factory()->active()->create([
            'company_id' => $company->id, 'plan_id' => $plan->id, 'ends_at' => now()->addYear(),
        ]);
        User::factory()->create(['company_id' => $company->id]); // 1/2

        $email = 'segundo_'.uniqid().'@credify.test';

        Livewire::test(CreateUser::class)
            ->fillForm([
                'name' => 'Segundo Usuario',
                'email' => $email,
                'company_id' => $company->id,
                'roles' => [(int) Role::where('name', 'admin')->value('id')],
                'password' => 'clave-1234',
            ])
            ->call('create')
            ->assertHasNoFormErrors();

        $this->assertDatabaseHas('users', ['email' => $email, 'company_id' => $company->id]);
    }
}
