<?php

namespace App\Filament\Resources\Subscriptions\Schemas;

use App\Models\Subscription;
use Filament\Forms\Components\DatePicker;
use Filament\Forms\Components\Select;
use Filament\Forms\Components\TextInput;
use Filament\Schemas\Schema;
use Illuminate\Support\Facades\Auth;

class SubscriptionForm
{
    public static function configure(Schema $schema): Schema
    {
        $user = Auth::user();
        $isSuperAdmin = $user?->isSuperAdmin() ?? false; // Verifica si es Super Admin

        return $schema
            ->components([
                // Campo Company ID (visible solo para Super Admin)
                Select::make('company_id')
                    ->label('Compañía')
                    ->relationship('company', 'name')
                    ->required()
                    ->searchable()
                    ->preload()
                    ->default(fn () => ! $isSuperAdmin ? Auth::user()->company_id : null)
                    ->hidden(fn () => ! $isSuperAdmin),

                // Plan (FK real: plan_id). Antes se usaba `Select::make('plan')`, un
                // atributo inexistente que se descartaba al guardar → plan_id=null →
                // límites ilimitados (#125).
                Select::make('plan_id')
                    ->label('Plan')
                    ->relationship('plan', 'name')
                    ->required()
                    ->searchable()
                    ->preload(),

                // Ciclo de facturación (columna real `billing_cycle`; antes el select
                // de "plan" mezclaba estos valores y nunca llegaban a la columna).
                Select::make('billing_cycle')
                    ->label('Ciclo de Facturación')
                    ->required()
                    ->default(Subscription::BILLING_MONTHLY)
                    ->options([
                        Subscription::BILLING_MONTHLY => 'Mensual',
                        Subscription::BILLING_QUARTERLY => 'Trimestral',
                        Subscription::BILLING_SEMIANNUAL => 'Semestral',
                        Subscription::BILLING_ANNUAL => 'Anual',
                    ]),

                // Fecha de Inicio
                DatePicker::make('starts_at')
                    ->label('Fecha de Inicio')
                    ->required()
                    ->default(now()),

                // Fecha de Fin
                DatePicker::make('ends_at')
                    ->label('Fecha de Fin')
                    ->required()
                    ->minDate(fn ($get) => $get('starts_at')),

                // Estado: es lo que realmente controla el acceso (scopeActive/isActive/
                // hasActiveSubscription se basan en `status`, no en `is_active`). Antes el
                // form exponía un Toggle `is_active` inerte y no dejaba fijar el estado (#125).
                Select::make('status')
                    ->label('Estado')
                    ->required()
                    ->default(Subscription::STATUS_ACTIVE)
                    ->options([
                        Subscription::STATUS_TRIAL => 'Prueba',
                        Subscription::STATUS_ACTIVE => 'Activa',
                        Subscription::STATUS_GRACE => 'Gracia',
                        Subscription::STATUS_EXPIRED => 'Expirada',
                        Subscription::STATUS_CANCELED => 'Cancelada',
                        Subscription::STATUS_SUSPENDED => 'Suspendida',
                    ]),

                // PAGO — registro manual/offline (#165). No hay pasarela: el super_admin
                // registra aquí cuánto pagó la empresa por este período y la referencia
                // (transferencia/consignación). Es informativo/auditoría — no calcula ni
                // cobra nada; el acceso lo controla `status`, no estos campos.
                TextInput::make('amount_paid')
                    ->label('Monto pagado (COP)')
                    ->helperText('Cuánto pagó la empresa por este período. Registro manual — no hay cobro automático.')
                    ->numeric()
                    ->minValue(0)
                    ->prefix('$'),

                TextInput::make('payment_reference')
                    ->label('Referencia de pago')
                    ->helperText('N.º de transferencia/consignación o nota. Opcional.')
                    ->maxLength(100),
            ]);
    }
}
