<?php

declare(strict_types=1);

namespace App\DTOs;

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

/**
 * DTO para operación de Reestructuración de crédito.
 *
 * Reestructuración: Modificación de condiciones SIN dinero nuevo.
 * Puede incluir: cambio de tasa, periodicidad, capitalización de intereses vencidos.
 */
readonly class RestructureCreditData extends CreditOperationData
{
    public Money $capitalizedInterest;

    public ?string $newInterestRate;

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

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

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