<?php

namespace App\Filament\Resources\Payments\Schemas;

use App\Filament\Resources\Credits\Support\CreditContextTabsBuilder;
use App\Models\Credit;
use Filament\Forms\Components\DatePicker;
use Filament\Forms\Components\Select;
use Filament\Forms\Components\TextInput;
use Filament\Schemas\Components\Section;
use Filament\Schemas\Components\Utilities\Get as GetSchema;
use Filament\Schemas\Schema;
use Illuminate\Database\Eloquent\Builder;

class PaymentForm
{
    public static function configure(Schema $schema): Schema
    {
        return $schema->components([
            /*=========================================================
            | CARD 1: FORMULARIO DE PAGO
            =========================================================*/
            Section::make('Registrar pago')
                ->description('Completa la información del pago para aplicarlo al crédito.')
                ->columnSpan('full')
                ->columns(2)
                ->schema([
                    Select::make('company_id')
                        ->label('Compañía')
                        ->relationship('company', 'name')
                        ->preload()
                        ->searchable()
                        ->hidden(fn () => ! auth()->user()?->isSuperAdmin())
                        ->default(fn () => auth()->user()?->isSuperAdmin()
                            ? null
                            : auth()->user()?->company_id
                        )
                        ->required()
                        ->live(),

                    Select::make('credit_id')
                        ->label('Crédito')
                        ->relationship(
                            name: 'credit',
                            titleAttribute: 'id',
                            modifyQueryUsing: function (Builder $query, GetSchema $get) {
                                $user = auth()->user();
                                $companyId = $get('company_id') ?? $user?->company_id;

                                if ($user?->isSuperAdmin()) {
                                    if ($companyId) {
                                        $query->where('company_id', $companyId);
                                    }

                                    return;
                                }

                                $query->where('company_id', $user?->company_id);
                            }
                        )
                        ->default(fn () => request()->integer('credit_id'))
                        ->disabled(fn () => request()->has('credit_id'))
                        ->hidden(fn () => request()->has('credit_id'))
                        ->required()
                        ->live(),

                    TextInput::make('amount')
                        ->label('Monto del pago (COP)')
                        ->numeric()
                        ->inputMode('decimal')
                        ->minValue(1)
                        ->required()
                        ->default(function (GetSchema $get) {
                            $creditId = (int) ($get('credit_id') ?? request()->integer('credit_id'));
                            if ($creditId <= 0) {
                                return null;
                            }

                            $credit = Credit::find($creditId);
                            if (! $credit) {
                                return null;
                            }

                            $next = $credit->installments()
                                ->whereIn('status', ['pending', 'partial_paid', 'overdue'])
                                ->orderBy('due_date')
                                ->first();

                            return $next
                                ? max(0, (float) $next->total_amount - (float) $next->amount_paid)
                                : null;
                        }),

                    DatePicker::make('payment_date')
                        ->label('Fecha del pago')
                        ->default(now())
                        ->required(),

                    Select::make('payment_method')
                        ->label('Método de pago')
                        ->options([
                            'transfer' => 'Transferencia',
                            'cash' => 'Efectivo',
                        ])
                        ->default('transfer')
                        ->required()
                        ->native(false),
                ]),

            /*=========================================================
            | CARD 2: CONTEXTO DEL CRÉDITO (TABS REUSABLES)
            =========================================================*/
            CreditContextTabsBuilder::make(),
        ]);
    }
}
