<?php

declare(strict_types=1);

namespace App\DTOs;

use App\ValueObjects\Money;
use Carbon\Carbon;
use InvalidArgumentException;

/**
 * DTO para operación de Refinanciación de crédito.
 *
 * Refinanciación: Nuevo crédito que INCLUYE deuda anterior + capital adicional.
 * HAY DESEMBOLSO de efectivo (solo el capital adicional).
 */
readonly class RefinanceCreditData extends CreditOperationData
{
    public Money $additionalCapital;

    public ?string $newInterestRate;

    public function __construct(
        int $creditId,
        int $newInstallmentsCount,
        Money|float|string $additionalCapital,
        ?string $newInterestRate = null,
        ?string $periodicity = null,
        ?Carbon $startDate = null,
        ?Carbon $firstDueDateOverride = null,
        ?int $dueDay1 = null,
        ?int $dueDay2 = null,
        ?string $reason = null,
    ) {
        // Validar capital adicional obligatorio
        $this->additionalCapital = $additionalCapital instanceof Money
            ? $additionalCapital
            : Money::of($additionalCapital);

        if ($this->additionalCapital->lessThanOrEqual(0)) {
            throw new InvalidArgumentException(
                'La refinanciación requiere capital adicional mayor a cero. '.
                'Si solo desea extender el plazo, use la operación de Extensión.'
            );
        }

        $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 'refinance';
    }

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