<?php

declare(strict_types=1);

namespace App\DTOs;

use Carbon\Carbon;

/**
 * DTO base para todas las operaciones de crédito.
 * Inmutable y validado desde construcción.
 */
abstract readonly class CreditOperationData
{
    public function __construct(
        public int $creditId,
        public int $newInstallmentsCount,
        public ?string $periodicity = null,
        public ?Carbon $startDate = null,
        public ?Carbon $firstDueDateOverride = null,
        public ?int $dueDay1 = null,
        public ?int $dueDay2 = null,
        public ?string $reason = null,
    ) {}

    /**
     * Tipo de operación para logs y auditoría.
     */
    abstract public function operationType(): string;

    /**
     * Convierte a array para persistencia.
     */
    public function toArray(): array
    {
        return [
            'credit_id' => $this->creditId,
            'new_installments_count' => $this->newInstallmentsCount,
            'periodicity' => $this->periodicity,
            'start_date' => $this->startDate?->toDateString(),
            'first_due_date_override' => $this->firstDueDateOverride?->toDateString(),
            'due_day_1' => $this->dueDay1,
            'due_day_2' => $this->dueDay2,
            'reason' => $this->reason,
        ];
    }
}
