<?php

declare(strict_types=1);

namespace Tests\Feature;

use App\Models\Company;
use App\Models\Credit;
use App\Models\Installment;
use Illuminate\Foundation\Testing\DatabaseTransactions;
use Illuminate\Support\Facades\DB;
use PHPUnit\Framework\Attributes\Test;
use Tests\TestCase;

/**
 * #128 — Las columnas monetarias de `credits`/`installments` deben ser
 * DECIMAL(12,2). En (10,2) el tope era 99.999.999,99; un valor ≥100M truncaba
 * (MySQL no estricto) o lanzaba. Aquí se persiste un valor > ese tope y se
 * verifica que se guarda exacto (prueba de que la columna es (12,2)).
 */
class MoneyColumnPrecisionTest extends TestCase
{
    use DatabaseTransactions;

    #[Test]
    public function credit_and_installment_money_columns_store_values_above_the_old_10_2_ceiling(): void
    {
        $company = Company::factory()->create();

        // 150M > tope de decimal(10,2) (99.999.999,99) y < tope de (12,2).
        $credit = Credit::factory()->create([
            'company_id' => $company->id,
            'status' => Credit::STATUS_ACTIVE,
            'amount' => 150000000.00,
        ]);

        $installment = Installment::factory()->create([
            'company_id' => $company->id,
            'credit_id' => $credit->id,
            'installment_number' => 1,
            'principal_amount' => 130000000.00,
            'interest_amount' => 20000000.00,
            'total_amount' => 150000000.00,
            'principal_balance_after' => 0,
            'amount_paid' => 150000000.00,
        ]);

        // Lectura cruda desde la BD (evita cualquier cast del modelo).
        $this->assertSame('150000000.00', (string) DB::table('credits')->where('id', $credit->id)->value('amount'));
        $this->assertSame('150000000.00', (string) DB::table('installments')->where('id', $installment->id)->value('total_amount'));
        $this->assertSame('130000000.00', (string) DB::table('installments')->where('id', $installment->id)->value('principal_amount'));
        $this->assertSame('150000000.00', (string) DB::table('installments')->where('id', $installment->id)->value('amount_paid'));
    }
}
