<?php

namespace App\Filament\Resources\CreditAuditLog\Schemas;

use App\Enums\CreditAuditEvent;
use App\Filament\Resources\Credits\CreditResource;
use App\Services\Audit\AuditPresenter;
use Filament\Infolists\Components\TextEntry;
use Filament\Infolists\Components\ViewEntry;
use Filament\Schemas\Components\Section;
use Filament\Schemas\Schema;

class CreditAuditLogInfolist
{
    public static function configure(Schema $schema): Schema
    {
        return $schema
            ->components([
                // ═════════════════════════════════════════════════════════
                // EVENTO — Qué pasó, quién, cuándo
                // ═════════════════════════════════════════════════════════
                Section::make('Evento')
                    ->schema([
                        TextEntry::make('action')
                            ->label('Acción')
                            ->badge()
                            ->formatStateUsing(fn (string $state): string => CreditAuditEvent::tryFrom($state)?->label() ?? ucfirst(str_replace('_', ' ', $state))
                            )
                            ->color(fn (string $state): string => CreditAuditEvent::tryFrom($state)?->color() ?? 'gray'
                            )
                            ->icon(fn (string $state): ?string => CreditAuditEvent::tryFrom($state)?->icon()
                            ),

                        TextEntry::make('action')
                            ->label('Resumen')
                            ->formatStateUsing(function (string $state, $record): string {
                                $event = CreditAuditEvent::tryFrom($state);
                                $data = is_array($record->data) ? $record->data : [];

                                return $event?->summary($data) ?? $state;
                            })
                            ->hiddenLabel()
                            ->columnSpanFull(),

                        TextEntry::make('user.name')
                            ->label('Usuario')
                            ->icon('heroicon-o-user'),

                        TextEntry::make('credit.id')
                            ->label('Crédito')
                            ->icon('heroicon-o-document-text')
                            ->url(fn ($record): string => CreditResource::getUrl('view', [
                                'record' => $record->credit_id,
                            ])),

                        TextEntry::make('created_at')
                            ->label('Fecha')
                            ->icon('heroicon-o-clock')
                            ->dateTime('d/m/Y H:i'),

                        // Motivo (solo si existe en data.input.reason)
                        TextEntry::make('data')
                            ->label('Motivo')
                            ->icon('heroicon-o-chat-bubble-left')
                            ->formatStateUsing(function ($state): ?string {
                                $data = is_array($state) ? $state : [];

                                return $data['input']['reason']
                                    ?? $data['input']['notes']
                                    ?? $data['reason']
                                    ?? $data['notes']
                                    ?? null;
                            })
                            ->hidden(function ($record): bool {
                                $data = is_array($record->data) ? $record->data : [];
                                $reason = $data['input']['reason']
                                    ?? $data['input']['notes']
                                    ?? $data['reason']
                                    ?? $data['notes']
                                    ?? null;

                                return $reason === null;
                            })
                            ->columnSpanFull(),
                    ])
                    ->columns(3),

                // ═════════════════════════════════════════════════════════
                // DATOS REGISTRADOS — Traducidos a lenguaje de negocio
                // ═════════════════════════════════════════════════════════
                Section::make('Datos registrados')
                    ->schema([
                        ViewEntry::make('translated_data')
                            ->view('filament.infolists.components.audit-data-block')
                            ->viewData([
                                'dataResolver' => fn ($record) => AuditPresenter::translateDataBlock(
                                    is_array($record->data) ? $record->data : []
                                ),
                            ])
                            ->columnSpanFull(),
                    ])
                    ->hidden(fn ($record): bool => empty($record->data)),

                // ═════════════════════════════════════════════════════════
                // DATOS TÉCNICOS — JSON original, colapsado
                // ═════════════════════════════════════════════════════════
                Section::make('Datos técnicos')
                    ->schema([
                        TextEntry::make('data')
                            ->label('JSON original')
                            ->formatStateUsing(fn ($state): string => self::stringifyJson($state))
                            ->placeholder('Sin datos adicionales')
                            ->columnSpanFull()
                            ->copyable()
                            ->copyMessage('JSON copiado al portapapeles'),
                    ])
                    ->collapsible()
                    ->collapsed()
                    ->hidden(fn ($record): bool => empty($record->data)),
            ]);
    }

    protected static function stringifyJson(mixed $state): string
    {
        if ($state === null) {
            return '';
        }

        if (is_string($state)) {
            return $state;
        }

        if (! is_array($state)) {
            return (string) $state;
        }

        return json_encode(
            $state,
            JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE
        ) ?: '';
    }
}
