<?php

namespace App\Filament\Resources\Clients\Schemas;

use App\Models\Credit;
use Filament\Infolists\Components\ImageEntry;
use Filament\Infolists\Components\TextEntry;
use Filament\Schemas\Components\Grid;
use Filament\Schemas\Components\Group;
use Filament\Schemas\Components\Section;
use Filament\Schemas\Schema;
use Filament\Support\Enums\FontWeight;
use Filament\Support\Enums\TextSize;
use Illuminate\Support\Number;

class ClientInfolist
{
    public static function configure(Schema $schema): Schema
    {
        return $schema
            ->schema([
                // SECCIÓN: Información del Cliente
                Section::make('Información del Cliente')
                    ->icon('heroicon-o-user')
                    ->schema([
                        Grid::make(3)
                            ->schema([
                                // Avatar
                                ImageEntry::make('avatar')
                                    ->label('')
                                    ->state(fn ($record) => 'https://api.dicebear.com/7.x/initials/svg?seed='.urlencode($record->name)
                                    )
                                    ->circular()
                                    ->size(80)
                                    ->columnSpan(1),

                                // Datos principales
                                Group::make([
                                    TextEntry::make('name')
                                        ->label('Nombre completo')
                                        ->weight(FontWeight::Bold)
                                        ->size(TextSize::Large),

                                    TextEntry::make('identification')
                                        ->label('Identificación')
                                        ->icon('heroicon-o-identification'),

                                    TextEntry::make('phone')
                                        ->label('Teléfono')
                                        ->icon('heroicon-o-phone')
                                        ->url(fn ($state) => $state ? "tel:{$state}" : null),

                                    TextEntry::make('email')
                                        ->label('Correo electrónico')
                                        ->icon('heroicon-o-envelope')
                                        ->url(fn ($state) => $state ? "mailto:{$state}" : null),
                                ])->columnSpan(2),
                            ]),
                    ]),

                // SECCIÓN: Resumen de Créditos
                Section::make('Resumen de Créditos')
                    ->icon('heroicon-o-currency-dollar')
                    ->schema([
                        Grid::make(4)
                            ->schema([
                                TextEntry::make('active_credits')
                                    ->label('Créditos Activos')
                                    ->badge()
                                    ->color('success')
                                    ->getStateUsing(fn ($record) => $record->credits()
                                        ->whereIn('status', [
                                            Credit::STATUS_ACTIVE,
                                            Credit::STATUS_DELAYED,
                                            Credit::STATUS_OVERDUE,
                                        ])
                                        ->count()
                                    ),

                                TextEntry::make('total_credits')
                                    ->label('Total Créditos')
                                    ->badge()
                                    ->color('gray')
                                    ->getStateUsing(fn ($record) => $record->credits()->count()),

                                TextEntry::make('total_pending')
                                    ->label('Saldo Pendiente')
                                    ->color('danger')
                                    ->weight(FontWeight::Bold)
                                    ->getStateUsing(function ($record) {
                                        $total = $record->credits()
                                            ->whereIn('status', [
                                                Credit::STATUS_ACTIVE,
                                                Credit::STATUS_DELAYED,
                                                Credit::STATUS_OVERDUE,
                                            ])
                                            ->with('installments')
                                            ->get()
                                            ->sum(fn ($credit) => $credit->installments->sum(fn ($i) => max(0, $i->total_amount - $i->amount_paid)
                                            )
                                            );

                                        return Number::currency($total, 'COP', locale: 'es_CO');
                                    }),

                                TextEntry::make('overdue_amount')
                                    ->label('En Mora')
                                    ->color('danger')
                                    ->getStateUsing(function ($record) {
                                        $total = $record->credits()
                                            ->whereIn('status', [
                                                Credit::STATUS_DELAYED,
                                                Credit::STATUS_OVERDUE,
                                            ])
                                            ->with('installments')
                                            ->get()
                                            ->sum(fn ($credit) => $credit->installments
                                                ->where('due_date', '<', now())
                                                ->sum(fn ($i) => max(0, $i->total_amount - $i->amount_paid)
                                                )
                                            );

                                        return Number::currency($total, 'COP', locale: 'es_CO');
                                    }),
                            ]),
                    ]),

                // SECCIÓN: Detalles Adicionales
                Section::make('Detalles Adicionales')
                    ->icon('heroicon-o-information-circle')
                    ->collapsible()
                    ->collapsed()
                    ->schema([
                        Grid::make(3)
                            ->schema([
                                TextEntry::make('primaryAddress.address_line_1')
                                    ->label('Dirección Principal')
                                    ->icon('heroicon-o-map-pin')
                                    ->placeholder('Sin dirección registrada')
                                    ->columnSpan(2),

                                TextEntry::make('preferred_payment_method')
                                    ->label('Método de Pago Preferido')
                                    ->badge()
                                    ->formatStateUsing(fn (?string $state): string => match ($state) {
                                        'virtual' => 'Pago Virtual',
                                        'physical' => 'Pago Físico',
                                        default => 'No especificado',
                                    })
                                    ->color(fn (?string $state): string => match ($state) {
                                        'virtual' => 'primary',
                                        'physical' => 'warning',
                                        default => 'gray',
                                    }),

                                TextEntry::make('is_active')
                                    ->label('Estado')
                                    ->badge()
                                    ->formatStateUsing(fn (bool $state): string => $state ? 'Activo' : 'Inactivo'
                                    )
                                    ->color(fn (bool $state): string => $state ? 'success' : 'danger'
                                    ),

                                TextEntry::make('notes')
                                    ->label('Notas')
                                    ->columnSpan(2)
                                    ->placeholder('Sin notas'),

                                TextEntry::make('created_at')
                                    ->label('Cliente desde')
                                    ->dateTime('d/m/Y')
                                    ->icon('heroicon-o-calendar'),
                            ]),
                    ]),
            ]);
    }
}
