<?php

namespace App\Enums;

use App\Support\Format;

enum CreditAuditEvent: string
{
    case CREDIT_CREATED = 'credit_created';

    case CREDIT_EXTENDED = 'credit_extended';

    case CREDIT_EXTENDED_WITH_INTEREST = 'credit_extended_with_interest';

    case CREDIT_REFINANCED = 'credit_refinanced';

    case CREDIT_RESTRUCTURED = 'credit_restructured';

    case CREDIT_RENEWED = 'credit_renewed';

    case CREDIT_CLONED = 'credit_cloned';

    case CREDIT_CLONED_EDITABLE = 'credit_cloned_editable';

    case CREDIT_CANCELED = 'credit_canceled';

    case INSTALLMENTS_GENERATED = 'installments_generated';

    case INSTALLMENTS_REGENERATED = 'installments_regenerated';

    case CREDIT_EDITED = 'credit_edited';

    /** Retirado de la cartera operativa sin decidir aún si se cierra. */
    case CREDIT_ARCHIVED = 'credit_archived';

    /** Devuelto a la cartera operativa. */
    case CREDIT_UNARCHIVED = 'credit_unarchived';

    /**
     * Etiqueta legible para mostrar en UI.
     */
    public function label(): string
    {
        return match ($this) {
            self::CREDIT_CREATED => 'Crédito creado',
            self::CREDIT_EXTENDED => 'Crédito extendido',
            self::CREDIT_EXTENDED_WITH_INTEREST => 'Crédito extendido con réditos',
            self::CREDIT_REFINANCED => 'Crédito refinanciado',
            self::CREDIT_RESTRUCTURED => 'Crédito reestructurado',
            self::CREDIT_RENEWED => 'Crédito renovado',
            self::CREDIT_CLONED => 'Crédito clonado',
            self::CREDIT_CLONED_EDITABLE => 'Crédito clonado (editable)',
            self::CREDIT_CANCELED => 'Crédito cancelado',
            self::INSTALLMENTS_GENERATED => 'Cuotas generadas',
            self::INSTALLMENTS_REGENERATED => 'Cuotas regeneradas',
            self::CREDIT_EDITED => 'Crédito editado',
            self::CREDIT_ARCHIVED => 'Crédito archivado',
            self::CREDIT_UNARCHIVED => 'Crédito desarchivado',
        };
    }

    /**
     * Clasificación del evento: financial, structural o administrative.
     */
    public function category(): string
    {
        return match ($this) {
            self::CREDIT_EXTENDED,
            self::CREDIT_EXTENDED_WITH_INTEREST,
            self::CREDIT_REFINANCED,
            self::CREDIT_RESTRUCTURED,
            self::CREDIT_RENEWED => 'structural',

            self::CREDIT_CREATED,
            self::CREDIT_CANCELED,
            self::CREDIT_EDITED,
            self::CREDIT_CLONED,
            self::CREDIT_CLONED_EDITABLE,
            self::INSTALLMENTS_GENERATED,
            self::INSTALLMENTS_REGENERATED,
            self::CREDIT_ARCHIVED,
            self::CREDIT_UNARCHIVED => 'administrative',
        };
    }

    /**
     * Icono Heroicon para la acción.
     */
    public function icon(): string
    {
        return match ($this) {
            self::CREDIT_CREATED => 'heroicon-o-plus-circle',
            self::CREDIT_EXTENDED => 'heroicon-o-arrow-path',
            self::CREDIT_EXTENDED_WITH_INTEREST => 'heroicon-o-arrow-path',
            self::CREDIT_REFINANCED => 'heroicon-o-banknotes',
            self::CREDIT_RESTRUCTURED => 'heroicon-o-wrench-screwdriver',
            self::CREDIT_RENEWED => 'heroicon-o-arrow-path-rounded-square',
            self::CREDIT_CLONED,
            self::CREDIT_CLONED_EDITABLE => 'heroicon-o-document-duplicate',
            self::CREDIT_CANCELED => 'heroicon-o-x-circle',
            self::INSTALLMENTS_GENERATED,
            self::INSTALLMENTS_REGENERATED => 'heroicon-o-calculator',
            self::CREDIT_EDITED => 'heroicon-o-pencil-square',
            self::CREDIT_ARCHIVED => 'heroicon-o-archive-box',
            self::CREDIT_UNARCHIVED => 'heroicon-o-archive-box-arrow-down',
        };
    }

    /**
     * Color Filament para badges y UI.
     */
    public function color(): string
    {
        return match ($this) {
            self::CREDIT_CREATED => 'success',
            self::CREDIT_EXTENDED => 'info',
            self::CREDIT_EXTENDED_WITH_INTEREST => 'purple',
            self::CREDIT_REFINANCED => 'warning',
            self::CREDIT_RESTRUCTURED => 'info',
            self::CREDIT_RENEWED => 'success',
            self::CREDIT_CLONED,
            self::CREDIT_CLONED_EDITABLE => 'info',
            self::CREDIT_CANCELED => 'danger',
            self::INSTALLMENTS_GENERATED => 'gray',
            self::INSTALLMENTS_REGENERATED => 'gray',
            self::CREDIT_EDITED => 'warning',
            self::CREDIT_ARCHIVED => 'gray',
            self::CREDIT_UNARCHIVED => 'success',
        };
    }

    /**
     * Resumen neutro basado exclusivamente en campos persistidos.
     *
     * Solo concatena datos que existen en $data.
     * Si $data está vacío, retorna solo label().
     */
    public function summary(array $data): string
    {
        $parts = [$this->label()];
        $input = $data['input'] ?? [];

        // Monto registrado (si existe en input)
        if (isset($input['amount'])) {
            $parts[] = 'Monto: '.Format::money($input['amount']);
        }

        if (isset($input['additional_capital'])) {
            $parts[] = 'Capital adicional: '.Format::money($input['additional_capital']);
        }

        // Número de cuotas (si existe)
        $installments = $input['new_installments'] ?? $input['installments'] ?? $input['num_installments'] ?? null;
        if ($installments !== null) {
            $parts[] = $installments.' cuotas';
        }

        // Crédito generado (si existe)
        if (isset($data['new_credit_id'])) {
            $parts[] = '→ crédito #'.$data['new_credit_id'];
        }

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

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

    /**
     * Indica si el evento representa una operación estructural.
     *
     * @deprecated Usar category() === 'structural' en su lugar.
     */
    public function isStructuralOperation(): bool
    {
        return $this->category() === 'structural';
    }
}
