<?php

declare(strict_types=1);

namespace App\DTOs;

use Carbon\Carbon;

/**
 * DTO para operación de Extensión con Réditos Adicionales (Prórroga con Intereses).
 *
 * Esta operación permite EXTENDER un crédito que YA TIENE PAGOS DE CAPITAL,
 * aplicando intereses adicionales sobre el saldo pendiente.
 *
 * DIFERENCIA CON EXTENSIÓN SIMPLE:
 * - Extensión simple: Solo redistribuye saldo en más cuotas (NO permite pagos de capital)
 * - Extensión con intereses: Recalcula interés sobre saldo pendiente (SÍ permite pagos de capital)
 *
 * ECUACIÓN FINANCIERA:
 *   saldo_pendiente = suma(cuotas_pendientes.remaining_amount)
 *   nuevo_interes = saldo_pendiente * tasa_interes * meses_adicionales
 *   nuevo_total = saldo_pendiente + nuevo_interes
 *   cash_out = 0 (no hay desembolso)
 *
 * CASO DE USO: Cliente Yulisa Rodriguez (Credit #53)
 * - Capital original: 500,000
 * - Total a pagar: 700,000 (10 cuotas × 70,000)
 * - Pagado: 6 cuotas = 420,000
 * - Pendiente: 4 cuotas = 280,000
 * - Solicita: 1 mes adicional con nuevos intereses
 */
readonly class ExtendWithInterestData extends CreditOperationData
{
    /**
     * Número de meses/períodos adicionales de interés a aplicar.
     * Ejemplo: 1 mes adicional = se calcula interés por 1 mes sobre el saldo.
     */
    public int $additionalInterestPeriods;

    /**
     * Si se desea cambiar la tasa de interés (opcional).
     * Si es null, se usa la tasa original del crédito.
     */
    public ?string $newInterestRate;

    public function __construct(
        int $creditId,
        int $newInstallmentsCount,
        int $additionalInterestPeriods = 1,
        ?string $newInterestRate = null,
        ?string $periodicity = null,
        ?Carbon $startDate = null,
        ?Carbon $firstDueDateOverride = null,
        ?int $dueDay1 = null,
        ?int $dueDay2 = null,
        ?string $reason = null,
    ) {
        $this->additionalInterestPeriods = max(0, $additionalInterestPeriods);
        $this->newInterestRate = $newInterestRate;

        parent::__construct(
            creditId: $creditId,
            newInstallmentsCount: $newInstallmentsCount,
            periodicity: $periodicity,
            startDate: $startDate ?? Carbon::today(),
            firstDueDateOverride: $firstDueDateOverride,
            dueDay1: $dueDay1,
            dueDay2: $dueDay2,
            reason: $reason,
        );
    }

    public function operationType(): string
    {
        return 'extension_with_interest';
    }

    public function toArray(): array
    {
        return array_merge(parent::toArray(), [
            'additional_interest_periods' => $this->additionalInterestPeriods,
            'new_interest_rate' => $this->newInterestRate,
        ]);
    }
}
