<?php

declare(strict_types=1);

namespace Tests\Feature\Filament;

use App\Filament\Resources\Subscriptions\Pages\CreateSubscription;
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;

/**
 * #125 — El SubscriptionForm usaba `Select::make('plan')` (atributo inexistente),
 * que se descartaba al guardar → plan_id=null → límites ilimitados. Este test fija
 * que el form persiste `plan_id`, `billing_cycle` y `status` reales.
 */
class SubscriptionFormTest extends TestCase
{
    use DatabaseTransactions;

    #[Test]
    public function creating_a_subscription_persists_plan_id_billing_cycle_and_status(): void
    {
        Role::firstOrCreate(['name' => 'super_admin', 'guard_name' => 'web']);
        $super = User::factory()->create(['company_id' => null]);
        $super->assignRole('super_admin');
        $this->actingAs($super);
        Filament::setCurrentPanel(Filament::getDefaultPanel());

        $company = Company::factory()->create();
        $plan = Plan::factory()->create();

        Livewire::test(CreateSubscription::class)
            ->fillForm([
                'company_id' => $company->id,
                'plan_id' => $plan->id,
                'billing_cycle' => Subscription::BILLING_ANNUAL,
                'status' => Subscription::STATUS_TRIAL,
                'starts_at' => now()->toDateString(),
                'ends_at' => now()->addYear()->toDateString(),
            ])
            ->call('create')
            ->assertHasNoFormErrors();

        $this->assertDatabaseHas('subscriptions', [
            'company_id' => $company->id,
            'plan_id' => $plan->id,                       // antes quedaba null (#125)
            'billing_cycle' => Subscription::BILLING_ANNUAL,
            'status' => Subscription::STATUS_TRIAL,
        ]);
    }
}
