<?php

declare(strict_types=1);

namespace App\Filament\Resources\Credits\Schemas;

use App\Filament\Resources\Clients\ClientResource;
use App\Filament\Resources\Credits\CreditResource;
use App\Models\Credit;
use App\Support\Format;
use Carbon\Carbon;
use Filament\Infolists\Components\TextEntry;
use Filament\Infolists\Components\ViewEntry;
use Filament\Schemas\Components\Section;
use Filament\Schemas\Components\Tabs;
use Filament\Schemas\Components\Tabs\Tab;
use Filament\Schemas\Schema;
use Filament\Support\Enums\FontWeight;
use Filament\Support\Enums\TextSize;

/**
 * Credit Infolist Schema - Redesigned for Decision-Oriented UX.
 *
 * DESIGN PRINCIPLES:
 * 1. "10 seconds to understand" - Key financial status visible immediately
 * 2. Visual hierarchy: State > KPIs > Actions > Details > History
 * 3. Clear color coding: Red=danger, Green=success, Yellow=warning
 * 4. Tables instead of RepeatableEntry for better data scanning
 */
class CreditInfolist
{
    public static function configure(Schema $schema): Schema
    {
        return $schema
            ->columns(1)
            ->inlineLabel(false)
            ->components([
                // ═══════════════════════════════════════════════════════════════════════
                // HERO SECTION: Financial Status at a Glance
                // ═══════════════════════════════════════════════════════════════════════
                Section::make()
                    ->schema([
                        // Status Badge - Large and Prominent
                        TextEntry::make('status_hero')
                            ->label('')
                            ->hiddenLabel()
                            ->state(fn (Credit $record) => strtoupper($record->getStatusLabel()))
                            ->badge()
                            ->color(fn (Credit $record) => $record->getStatusBadgeColor())
                            ->size(TextSize::Large)
                            ->weight(FontWeight::Bold)
                            ->columnSpan(1),

                        // Risk Indicator
                        TextEntry::make('risk_indicator')
                            ->label('')
                            ->hiddenLabel()
                            ->state(function (Credit $record): string {
                                $overdueCount = $record->installments()
                                    ->where('status', 'overdue')
                                    ->count();

                                if ($overdueCount > 0) {
                                    return "{$overdueCount} cuota(s) vencida(s)";
                                }

                                if ($record->status === Credit::STATUS_DELAYED) {
                                    return 'En mora';
                                }

                                if ($record->isClosed()) {
                                    return $record->status === Credit::STATUS_PAID
                                        ? 'Crédito completado'
                                        : 'Crédito cerrado';
                                }

                                return 'Al día';
                            })
                            ->icon(function (Credit $record): string {
                                $overdueCount = $record->installments()
                                    ->where('status', 'overdue')
                                    ->count();

                                if ($overdueCount > 0) {
                                    return 'heroicon-o-exclamation-triangle';
                                }

                                if ($record->status === Credit::STATUS_PAID) {
                                    return 'heroicon-o-check-circle';
                                }

                                return 'heroicon-o-check';
                            })
                            ->color(function (Credit $record): string {
                                $overdueCount = $record->installments()
                                    ->where('status', 'overdue')
                                    ->count();

                                if ($overdueCount > 0) {
                                    return 'danger';
                                }

                                if ($record->status === Credit::STATUS_DELAYED) {
                                    return 'warning';
                                }

                                return 'success';
                            })
                            ->columnSpan(3),
                    ])
                    ->columns(4)
                    ->extraAttributes(['class' => 'mb-2']),

                // ═══════════════════════════════════════════════════════════════════════
                // KPI CARDS: Key Financial Metrics
                // ═══════════════════════════════════════════════════════════════════════
                Section::make('Resumen Financiero')
                    ->description('Estado financiero del crédito')
                    ->icon('heroicon-o-chart-bar')
                    ->collapsible()
                    ->schema([
                        // Total Pendiente (Primary KPI)
                        TextEntry::make('remaining_balance')
                            ->label('TOTAL PENDIENTE')
                            ->formatStateUsing(fn ($state) => Format::money($state))
                            ->size(TextSize::Large)
                            ->weight(FontWeight::Bold)
                            ->color(fn ($state) => $state > 0 ? 'danger' : 'success')
                            ->icon('heroicon-o-currency-dollar'),

                        // Total Recaudado
                        TextEntry::make('total_paid')
                            ->label('TOTAL RECAUDADO')
                            ->state(fn (Credit $record) => $record->total_paid)
                            ->formatStateUsing(fn ($state) => Format::money($state))
                            ->size(TextSize::Large)
                            ->weight(FontWeight::Bold)
                            ->color('success')
                            ->icon('heroicon-o-check-circle'),

                        // Progress (Cuotas)
                        TextEntry::make('installments_progress')
                            ->label('CUOTAS')
                            ->state(fn (Credit $record) => sprintf(
                                '%d / %d',
                                $record->installments_paid_count,
                                $record->installments_count
                            ))
                            ->size(TextSize::Large)
                            ->weight(FontWeight::Bold)
                            ->color(fn (Credit $record) => $record->installments_pending_count === 0 ? 'success' : 'gray'
                            )
                            ->icon('heroicon-o-list-bullet'),

                        // Próximo Vencimiento
                        TextEntry::make('next_due_date')
                            ->label('PRÓXIMO VENCIMIENTO')
                            ->state(function (Credit $record): string {
                                $nextInstallment = $record->installments()
                                    ->whereIn('status', ['pending', 'partial_paid', 'overdue'])
                                    ->orderBy('due_date')
                                    ->first();

                                if (! $nextInstallment) {
                                    return 'Sin cuotas pendientes';
                                }

                                $dueDate = Carbon::parse($nextInstallment->due_date)->startOfDay();
                                $today = Carbon::today();
                                $diff = (int) $today->diffInDays($dueDate, false);

                                if ($diff < 0) {
                                    return $dueDate->format('d/m/Y').' (hace '.abs($diff).' días)';
                                }

                                if ($diff === 0) {
                                    return 'HOY';
                                }

                                return $dueDate->format('d/m/Y').' (en '.$diff.' días)';
                            })
                            ->size(TextSize::Large)
                            ->color(function (Credit $record): string {
                                $nextInstallment = $record->installments()
                                    ->whereIn('status', ['pending', 'partial_paid', 'overdue'])
                                    ->orderBy('due_date')
                                    ->first();

                                if (! $nextInstallment) {
                                    return 'success';
                                }

                                $dueDate = Carbon::parse($nextInstallment->due_date)->startOfDay();
                                $today = Carbon::today();
                                $diff = (int) $today->diffInDays($dueDate, false);

                                if ($diff < 0) {
                                    return 'danger'; // Vencido
                                }
                                if ($diff === 0) {
                                    return 'warning'; // Hoy
                                }

                                return 'gray'; // Futuro
                            })
                            ->icon('heroicon-o-calendar'),

                        // Progress Bar Visual
                        ViewEntry::make('progress_bar')
                            ->view('filament.infolists.components.credit-progress-bar')
                            ->columnSpanFull(),
                    ])
                    ->columns(4),

                // ═══════════════════════════════════════════════════════════════════════
                // CREDIT DETAILS: Collapsible Secondary Info
                // ═══════════════════════════════════════════════════════════════════════
                Section::make('Información del Crédito')
                    ->description('Detalles del crédito y cliente')
                    ->icon('heroicon-o-document-text')
                    ->collapsible()
                    ->collapsed(false)
                    ->schema([
                        // Código de crédito (numeración por empresa)
                        TextEntry::make('code')
                            ->label('Código')
                            ->badge()
                            ->color('gray')
                            ->icon('heroicon-m-hashtag'),

                        // Row 1: Client & Collector
                        TextEntry::make('client.name')
                            ->label('Cliente')
                            ->icon('heroicon-m-user')
                            ->weight(FontWeight::Medium)
                            ->url(fn (Credit $record) => $record->client
                                ? ClientResource::getUrl('view', ['record' => $record->client])
                                : null
                            ),

                        TextEntry::make('collector.name')
                            ->label('Cobrador')
                            ->icon('heroicon-m-user-circle')
                            ->placeholder('Sin asignar')
                            ->color(fn ($state) => $state ? 'gray' : 'warning'),

                        TextEntry::make('periodicity')
                            ->label('Periodicidad')
                            ->badge()
                            ->formatStateUsing(fn (?string $state) => match ($state) {
                                'daily' => 'Diaria',
                                'weekly' => 'Semanal',
                                'biweekly' => 'Quincenal',
                                'monthly' => 'Mensual',
                                default => $state ?? '-',
                            }),

                        TextEntry::make('collection_day')
                            ->label('Día de Cobro')
                            ->state(function (Credit $record): string {
                                return match ($record->periodicity) {
                                    'weekly' => match ((int) $record->due_day_1) {
                                        1 => 'Lunes',
                                        2 => 'Martes',
                                        3 => 'Miércoles',
                                        4 => 'Jueves',
                                        5 => 'Viernes',
                                        6 => 'Sábado',
                                        7 => 'Domingo',
                                        default => '—',
                                    },
                                    'biweekly' => $record->due_day_1 && $record->due_day_2
                                        ? "Días {$record->due_day_1} y {$record->due_day_2}"
                                        : '—',
                                    'monthly' => $record->due_day_1
                                        ? "Día {$record->due_day_1}"
                                        : '—',
                                    'daily' => 'Todos los días',
                                    default => '—',
                                };
                            })
                            ->badge()
                            ->color('info'),

                        // Row 2: Dates
                        TextEntry::make('start_date')
                            ->label('Fecha de Inicio')
                            ->date('d/m/Y')
                            ->icon('heroicon-o-calendar'),

                        TextEntry::make('due_date')
                            ->label('Vencimiento Final')
                            ->date('d/m/Y')
                            ->icon('heroicon-o-calendar')
                            ->color(function (Credit $record): string {
                                if (! $record->due_date) {
                                    return 'gray';
                                }

                                return $record->due_date->isPast() ? 'danger' : 'gray';
                            }),

                        // Row 3: Financial Terms
                        TextEntry::make('amount')
                            ->label('Capital Prestado')
                            ->formatStateUsing(fn ($state) => Format::money($state))
                            ->icon('heroicon-o-banknotes'),

                        TextEntry::make('interest_rate')
                            ->label('Tasa de Interés')
                            ->formatStateUsing(fn ($state) => $state.'%')
                            ->badge()
                            ->color('warning'),

                        TextEntry::make('total_receivable')
                            ->label('Total a Cobrar')
                            ->state(fn (Credit $record) => $record->total_receivable)
                            ->formatStateUsing(fn ($state) => Format::money($state))
                            ->weight(FontWeight::Bold),

                        TextEntry::make('installments_count')
                            ->label('Total Cuotas')
                            ->icon('heroicon-m-list-bullet'),
                    ])
                    ->columns(4),

                // ═══════════════════════════════════════════════════════════════════════
                // TABS: Detailed Information
                // ═══════════════════════════════════════════════════════════════════════
                Tabs::make('credit_details')
                    ->columnSpanFull()
                    ->tabs([
                        // Tab: Cronograma de Cuotas
                        Tab::make('Cronograma')
                            ->icon('heroicon-m-calendar-days')
                            ->badge(fn (Credit $record) => ($count = $record->installments()
                                ->where('status', 'overdue')
                                ->count()) > 0 ? $count : null)
                            ->badgeColor('danger')
                            ->schema([
                                ViewEntry::make('installments_table')
                                    ->view('filament.infolists.components.installments-table')
                                    ->columnSpanFull(),
                            ]),

                        // Tab: Historial de Pagos
                        Tab::make('Pagos')
                            ->icon('heroicon-m-banknotes')
                            ->badge(fn (Credit $record) => $record->payments()->count() ?: null)
                            ->badgeColor('success')
                            ->schema([
                                ViewEntry::make('payments_table')
                                    ->view('filament.infolists.components.payments-table')
                                    ->columnSpanFull(),
                            ]),

                        // Tab: Linaje (only if has parent or children)
                        Tab::make('Linaje')
                            ->icon('heroicon-m-share')
                            ->visible(fn (Credit $record) => $record->parent_credit_id !== null ||
                                $record->children()->exists()
                            )
                            ->badge(fn (Credit $record) => $record->children()->count() ?: null)
                            ->badgeColor('purple')
                            ->schema([
                                ViewEntry::make('credit_lineage')
                                    ->view('filament.infolists.components.credit-lineage')
                                    ->columnSpanFull(),
                            ]),

                        // Tab: Auditoría
                        Tab::make('Auditoría')
                            ->icon('heroicon-m-clipboard-document-list')
                            ->schema([
                                ViewEntry::make('audit_timeline')
                                    ->view('filament.infolists.components.audit-timeline')
                                    ->columnSpanFull(),
                            ]),
                    ]),

                // ═══════════════════════════════════════════════════════════════════════
                // TECHNICAL INFO: Collapsed by Default
                // ═══════════════════════════════════════════════════════════════════════
                Section::make('Información Técnica')
                    ->description('Datos técnicos y de auditoría')
                    ->icon('heroicon-o-cog-6-tooth')
                    ->collapsible()
                    ->collapsed()
                    ->schema([
                        TextEntry::make('id')
                            ->label('ID interno (técnico)')
                            ->badge()
                            ->color('gray'),

                        TextEntry::make('parent_credit_id')
                            ->label('Crédito Padre')
                            ->placeholder('Ninguno (crédito original)')
                            ->url(fn (Credit $record) => $record->parent_credit_id
                                ? CreditResource::getUrl('view', ['record' => $record->parent_credit_id])
                                : null
                            ),

                        TextEntry::make('creator.name')
                            ->label('Creado por')
                            ->icon('heroicon-m-user'),

                        TextEntry::make('created_at')
                            ->label('Fecha de Creación')
                            ->dateTime('d/m/Y H:i'),

                        TextEntry::make('updated_at')
                            ->label('Última Actualización')
                            ->dateTime('d/m/Y H:i'),
                    ])
                    ->columns(5),
            ]);
    }
}
