<?php

declare(strict_types=1);

namespace Tests\Feature\Filament;

use App\Filament\Resources\Credits\Pages\CreateCredit;
use App\Filament\Resources\Credits\Schemas\CreditForm;
use App\Models\Company;
use App\Models\CompanyFinancialSettings;
use App\Models\Plan;
use App\Models\Subscription;
use App\Models\User;
use Filament\Schemas\Schema;
use Illuminate\Foundation\Testing\DatabaseTransactions;
use PHPUnit\Framework\Attributes\Test;
use Spatie\Permission\Models\Role;
use Tests\TestCase;

/**
 * Regresión #68: el formulario Filament de crédito debe aplicar los límites por
 * empresa de CompanyFinancialSettings (igual que la PWA StoreCreditRequest), no
 * topes hardcodeados (monto sin max, tasa max 100, cuotas max 365).
 */
class CreditFormCompanyLimitsTest extends TestCase
{
    use DatabaseTransactions;

    #[Test]
    public function credit_form_uses_company_financial_settings_limits(): void
    {
        Role::firstOrCreate(['name' => 'admin', '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(),
        ]);

        // Límites NO-default para verificar que el form los lee.
        CompanyFinancialSettings::updateOrCreate(
            ['company_id' => $company->id],
            [
                'min_credit_amount' => '20000.00',
                'max_credit_amount' => '7777000.00',
                'min_interest_rate' => '5.00',
                'max_interest_rate' => '33.00',
                'min_installments' => 2,
                'max_installments' => 24,
                'allowed_periodicities' => ['weekly', 'monthly'],
            ],
        );

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

        $schema = CreditForm::configure(Schema::make(new CreateCredit));
        $fields = $schema->getFlatFields(withHidden: true);

        $this->assertEqualsWithDelta(7777000.0, $fields['amount']->getMaxValue(), 0.001);
        $this->assertEqualsWithDelta(20000.0, $fields['amount']->getMinValue(), 0.001);
        $this->assertEqualsWithDelta(33.0, $fields['interest_rate']->getMaxValue(), 0.001);
        $this->assertEqualsWithDelta(5.0, $fields['interest_rate']->getMinValue(), 0.001);
        $this->assertSame(24, (int) $fields['installments_count']->getMaxValue());
        $this->assertSame(2, (int) $fields['installments_count']->getMinValue());

        // Periodicidad: solo las permitidas por la empresa.
        $this->assertSame(
            ['weekly' => 'Semanal', 'monthly' => 'Mensual'],
            $fields['periodicity']->getOptions(),
        );
    }
}
