<?php

namespace App\Filament\Resources\Incomes\Schemas;

use App\Enums\IncomeCategory;
use App\Models\User;
use Filament\Forms\Components\DatePicker;
use Filament\Forms\Components\Hidden;
use Filament\Forms\Components\KeyValue;
use Filament\Forms\Components\Select;
use Filament\Forms\Components\Textarea;
use Filament\Forms\Components\TextInput;
use Filament\Schemas\Components\Section;
use Filament\Schemas\Components\Utilities\Get as GetSchema;
use Filament\Schemas\Schema;
use Illuminate\Support\Facades\Auth;

class IncomeForm
{
    public static function configure(Schema $schema): Schema
    {
        $user = Auth::user();
        $isSuperAdmin = $user->hasRole('super_admin');
        $currentCompany = $isSuperAdmin ? null : $user->company_id;

        return $schema
            ->components([
                Section::make('Datos del ingreso')
                    ->description('Registra un ingreso operativo. Los ingresos de pagos se generan automáticamente.')
                    ->columns(2)
                    ->columnSpanFull()
                    ->schema([

                        /** COMPANY ID */
                        ! $isSuperAdmin
                            ? Hidden::make('company_id')
                                ->default($currentCompany)
                            : null,

                        Select::make('company_id')
                            ->label('Compañía')
                            ->relationship('company', 'name')
                            ->searchable()
                            ->preload()
                            ->required()
                            ->hidden(! $isSuperAdmin)
                            ->default($currentCompany),

                        /** FECHA DE OPERACIÓN */
                        DatePicker::make('operation_date')
                            ->label('Fecha de operación')
                            ->default(now())
                            ->required(),

                        /** MONTO */
                        TextInput::make('amount')
                            ->label('Monto')
                            ->numeric()
                            ->inputMode('decimal')
                            ->minValue(0.01)
                            ->required(),

                        /**
                         * CATEGORÍA
                         * Solo se muestran las categorías OPERATIVAS para creación manual.
                         * Las categorías 'payment' y 'overpayment' se generan automáticamente.
                         */
                        Select::make('category')
                            ->label('Categoría')
                            ->options(IncomeCategory::operationalOptions())
                            ->required()
                            ->reactive()
                            ->helperText('Solo ingresos operativos. Los pagos se generan automáticamente.'),

                        /** MÉTODO DE PAGO */
                        Select::make('method')
                            ->label('Método de pago')
                            ->options([
                                'cash' => 'Efectivo',
                                'transfer' => 'Transferencia bancaria',
                                'card' => 'Tarjeta',
                                'mobile_money' => 'Billetera digital',
                                'other' => 'Otro',
                            ])
                            ->searchable()
                            ->preload()
                            ->nullable(),

                        /** COBRADOR (OPCIONAL) */
                        Select::make('collector_user_id')
                            ->label('Cobrador / responsable')
                            ->options(function (GetSchema $get) use ($currentCompany) {
                                $company = $get('company_id') ?? $currentCompany;
                                if (! $company) {
                                    return [];
                                }

                                return User::query()
                                    ->where('company_id', $company)
                                    ->role(['collector', 'supervisor'])
                                    ->pluck('name', 'id');
                            })
                            ->searchable()
                            ->preload()
                            ->nullable(),

                        /** NOTAS / DESCRIPCIÓN */
                        Textarea::make('notes')
                            ->label('Descripción / notas')
                            ->rows(3)
                            ->nullable()
                            ->columnSpanFull(),

                        /** REFERENCIA (RECIBO, TRANSACCIÓN, etc.) */
                        TextInput::make('reference')
                            ->label('Referencia')
                            ->maxLength(255)
                            ->nullable(),

                        /** METADATA LIBRE (solo super admin, uso técnico) */
                        KeyValue::make('metadata')
                            ->label('Metadatos adicionales (técnicos)')
                            ->keyLabel('Clave')
                            ->valueLabel('Valor')
                            ->helperText('Uso interno del sistema.')
                            ->nullable()
                            ->columnSpanFull()
                            ->visible($isSuperAdmin),
                    ]),
            ]);
    }
}
