<?php

declare(strict_types=1);

namespace App\Filament\Resources\Incomes\Schemas;

use App\Enums\IncomeCategory;
use App\Filament\Resources\Payments\PaymentResource;
use Filament\Infolists\Components\IconEntry;
use Filament\Infolists\Components\TextEntry;
use Filament\Schemas\Components\Section;
use Filament\Schemas\Schema;
use Filament\Support\Enums\TextSize;

class IncomeInfolist
{
    public static function configure(Schema $schema): Schema
    {
        return $schema
            ->components([
                // ─────────────────────────────────────────────────
                // Informacion financiera principal
                // ─────────────────────────────────────────────────
                Section::make('Informacion del ingreso')
                    ->icon('heroicon-o-banknotes')
                    ->schema([
                        TextEntry::make('amount')
                            ->label('Monto')
                            ->icon('heroicon-o-currency-dollar')
                            ->money('COP', locale: 'es_CO')
                            ->size(TextSize::Large)
                            ->weight('bold')
                            ->color('success'),

                        TextEntry::make('category')
                            ->label('Categoria')
                            ->badge()
                            ->formatStateUsing(fn ($state) => $state instanceof IncomeCategory
                                ? $state->getLabel()
                                : (is_string($state) ? (IncomeCategory::tryFrom($state)?->getLabel() ?? $state) : '-')
                            )
                            ->color(fn ($state) => $state instanceof IncomeCategory
                                ? $state->getColor()
                                : 'gray'
                            )
                            ->icon(fn ($state) => $state instanceof IncomeCategory
                                ? $state->getIcon()
                                : 'heroicon-o-currency-dollar'
                            ),

                        TextEntry::make('method')
                            ->label('Metodo de pago')
                            ->badge()
                            ->formatStateUsing(fn ($state) => match ($state) {
                                'cash' => 'Efectivo',
                                'transfer' => 'Transferencia bancaria',
                                'card' => 'Tarjeta',
                                'mobile_money' => 'Billetera digital',
                                'other' => 'Otro',
                                default => $state ?? '-',
                            })
                            ->icon(fn ($state) => match ($state) {
                                'cash' => 'heroicon-o-banknotes',
                                'transfer' => 'heroicon-o-building-library',
                                'card' => 'heroicon-o-credit-card',
                                'mobile_money' => 'heroicon-o-device-phone-mobile',
                                default => 'heroicon-o-question-mark-circle',
                            }),

                        TextEntry::make('operation_date')
                            ->label('Fecha de operacion')
                            ->icon('heroicon-o-calendar')
                            ->date('d M Y'),

                        TextEntry::make('reference')
                            ->label('Referencia')
                            ->icon('heroicon-o-hashtag')
                            ->visible(fn ($record) => filled($record->reference))
                            ->copyable(),
                    ])
                    ->columns(2),

                // ─────────────────────────────────────────────────
                // Origen y trazabilidad
                // ─────────────────────────────────────────────────
                Section::make('Origen')
                    ->icon('heroicon-o-link')
                    ->schema([
                        TextEntry::make('origin_type')
                            ->label('Tipo de origen')
                            ->getStateUsing(fn ($record) => $record->payment_id
                                ? 'Ingreso por pago de cliente'
                                : ($record->getCategoryEnum()?->isCapitalTransaction()
                                    ? 'Transaccion de capital'
                                    : 'Ingreso operativo')
                            )
                            ->badge()
                            ->color(fn ($state) => match ($state) {
                                'Ingreso por pago de cliente' => 'success',
                                'Transaccion de capital' => 'info',
                                default => 'gray',
                            }),

                        TextEntry::make('payment.id')
                            ->label('Pago #')
                            ->icon('heroicon-o-receipt-percent')
                            ->visible(fn ($record) => (bool) $record->payment_id)
                            ->url(fn ($record) => $record->payment_id
                                ? PaymentResource::getUrl('view', ['record' => $record->payment_id])
                                : null
                            )
                            ->color('primary'),

                        TextEntry::make('credit.id')
                            ->label('Credito #')
                            ->icon('heroicon-o-document-text')
                            ->visible(fn ($record) => (bool) $record->credit_id),

                        TextEntry::make('credit.client.name')
                            ->label('Cliente')
                            ->icon('heroicon-o-user')
                            ->visible(fn ($record) => (bool) $record->credit_id),
                    ])
                    ->columns(2)
                    ->collapsible(),

                // ─────────────────────────────────────────────────
                // Impacto financiero
                // ─────────────────────────────────────────────────
                Section::make('Impacto financiero')
                    ->icon('heroicon-o-chart-bar')
                    ->schema([
                        IconEntry::make('affects_capital')
                            ->label('Afecta capital')
                            ->boolean(),

                        IconEntry::make('affects_profit')
                            ->label('Afecta utilidad')
                            ->boolean(),

                        TextEntry::make('financial_impact')
                            ->label('Resumen')
                            ->getStateUsing(fn ($record) => $record->getFinancialImpactSummary())
                            ->columnSpanFull(),

                        IconEntry::make('is_locked')
                            ->label('Bloqueado')
                            ->boolean()
                            ->trueIcon('heroicon-o-lock-closed')
                            ->falseIcon('heroicon-o-lock-open')
                            ->trueColor('danger')
                            ->falseColor('gray'),

                        TextEntry::make('lock_reason')
                            ->label('Razon de bloqueo')
                            ->visible(fn ($record) => $record->is_locked)
                            ->icon('heroicon-o-information-circle'),
                    ])
                    ->columns(3)
                    ->collapsible(),

                // ─────────────────────────────────────────────────
                // Notas
                // ─────────────────────────────────────────────────
                Section::make('Notas')
                    ->icon('heroicon-o-chat-bubble-left-ellipsis')
                    ->schema([
                        TextEntry::make('notes')
                            ->label('')
                            ->default('Sin notas')
                            ->columnSpanFull(),
                    ])
                    ->visible(fn ($record) => filled($record->notes))
                    ->collapsible(),

                // ─────────────────────────────────────────────────
                // Metadatos tecnicos
                // ─────────────────────────────────────────────────
                Section::make('Detalle tecnico')
                    ->icon('heroicon-o-code-bracket')
                    ->schema([
                        TextEntry::make('metadata')
                            ->label('Metadatos')
                            ->getStateUsing(function ($record): string {
                                $metadata = $record->metadata ?? [];

                                if (empty($metadata)) {
                                    return 'Sin metadatos adicionales.';
                                }

                                $lines = [];

                                if (isset($metadata['installments']) && is_array($metadata['installments'])) {
                                    $lines[] = '**Cuotas afectadas:** '.implode(', ', $metadata['installments']);
                                    unset($metadata['installments']);
                                }

                                foreach ($metadata as $key => $value) {
                                    $label = ucfirst(str_replace('_', ' ', $key));
                                    $val = is_array($value) ? json_encode($value, JSON_UNESCAPED_UNICODE) : $value;
                                    $lines[] = "**{$label}:** {$val}";
                                }

                                return implode("\n\n", $lines);
                            })
                            ->markdown()
                            ->columnSpanFull(),
                    ])
                    ->visible(fn ($record) => ! empty($record->metadata))
                    ->collapsible()
                    ->collapsed(),

                // ─────────────────────────────────────────────────
                // Auditoria
                // ─────────────────────────────────────────────────
                Section::make('Registro')
                    ->icon('heroicon-o-clock')
                    ->schema([
                        TextEntry::make('id')
                            ->label('ID'),

                        TextEntry::make('company.name')
                            ->label('Compania')
                            ->icon('heroicon-o-building-office'),

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

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

                        TextEntry::make('created_at')
                            ->label('Creado')
                            ->dateTime('d M Y, H:i'),

                        TextEntry::make('updated_at')
                            ->label('Actualizado')
                            ->dateTime('d M Y, H:i')
                            ->visible(fn ($record) => $record->updated_at?->ne($record->created_at)),
                    ])
                    ->columns(3)
                    ->collapsible()
                    ->collapsed(),
            ]);
    }
}
