<?php

namespace App\Enums;

use App\Support\Format;

enum PaymentAuditEvent: string
{
    case CREATED = 'created';

    case REVERSED = 'reversed';

    case UPDATED = 'updated';

    case DELETED = 'deleted';

    /**
     * Etiqueta legible para mostrar en UI.
     */
    public function label(): string
    {
        return match ($this) {
            self::CREATED => 'Pago registrado',
            self::REVERSED => 'Pago reversado',
            self::UPDATED => 'Pago actualizado',
            self::DELETED => 'Pago eliminado',
        };
    }

    /**
     * Clasificación del evento.
     * Todos los eventos de pago son financieros.
     */
    public function category(): string
    {
        return 'financial';
    }

    /**
     * Icono Heroicon para la acción.
     */
    public function icon(): string
    {
        return match ($this) {
            self::CREATED => 'heroicon-o-banknotes',
            self::REVERSED => 'heroicon-o-arrow-uturn-left',
            self::UPDATED => 'heroicon-o-pencil-square',
            self::DELETED => 'heroicon-o-x-circle',
        };
    }

    /**
     * Color Filament para badges y UI.
     */
    public function color(): string
    {
        return match ($this) {
            self::CREATED => 'success',
            self::REVERSED => 'danger',
            self::UPDATED => 'warning',
            self::DELETED => 'danger',
        };
    }

    /**
     * Resumen neutro basado exclusivamente en campos persistidos.
     *
     * Recibe el array de datos contextual (new_data, previous_data
     * o un merge según el caller). Solo usa campos presentes.
     */
    public function summary(array $data): string
    {
        $parts = [$this->label()];

        // Monto del pago (campo de primer nivel en PaymentAuditLog)
        if (isset($data['amount'])) {
            $parts[] = 'Monto: '.Format::money($data['amount']);
        }

        // Crédito asociado
        if (isset($data['credit_id'])) {
            $parts[] = 'Crédito #'.$data['credit_id'];
        }

        // Cuota asociada
        if (isset($data['installment_id'])) {
            $parts[] = 'Cuota #'.$data['installment_id'];
        }

        if (count($parts) === 1) {
            return $parts[0];
        }

        return $parts[0].' · '.implode(' · ', array_slice($parts, 1));
    }
}
