<?php

declare(strict_types=1);

namespace App\Filament\Resources\Plans\Schemas;

use Filament\Forms\Components\ColorPicker;
use Filament\Forms\Components\Textarea;
use Filament\Forms\Components\TextInput;
use Filament\Forms\Components\Toggle;
use Filament\Schemas\Components\Section;
use Filament\Schemas\Schema;

class PlanForm
{
    public static function configure(Schema $schema): Schema
    {
        return $schema
            ->components([
                Section::make('Precios')
                    ->description('Se muestran en la página de precios del sitio. Puedes cambiarlos cuando quieras — no son fijos.')
                    ->icon('heroicon-o-banknotes')
                    ->schema([
                        TextInput::make('price')
                            ->label('Precio mensual')
                            ->helperText('En COP, sin puntos ni decimales. Ej: 249000')
                            ->numeric()
                            ->minValue(0)
                            ->step(1)
                            ->prefix('$')
                            ->required(),

                        TextInput::make('annual_price')
                            ->label('Precio anual')
                            ->helperText('Opcional. Si lo defines, el sitio calcula el % de ahorro vs. pagar 12 meses.')
                            ->numeric()
                            ->minValue(0)
                            ->step(1)
                            ->prefix('$'),

                        TextInput::make('currency_code')
                            ->label('Moneda')
                            ->default('COP')
                            ->maxLength(3)
                            ->required(),
                    ])
                    ->columns(3),

                Section::make('Presentación')
                    ->description('Cómo se ve el plan en el sitio público.')
                    ->icon('heroicon-o-identification')
                    ->schema([
                        TextInput::make('name')
                            ->label('Nombre')
                            ->required()
                            ->maxLength(255),

                        TextInput::make('slug')
                            ->label('Slug (identificador interno)')
                            ->helperText('Lo usa el sistema para referenciar el plan (p. ej. "basic"). No se puede cambiar en planes existentes.')
                            ->required()
                            ->rule('alpha_dash')
                            ->maxLength(255)
                            ->unique(ignoreRecord: true)
                            ->disabled(fn (string $operation): bool => $operation === 'edit')
                            ->dehydrated(),

                        TextInput::make('badge_text')
                            ->label('Etiqueta')
                            ->helperText('Ej: "Más popular". Vacío = sin etiqueta.')
                            ->maxLength(50),

                        ColorPicker::make('badge_color')
                            ->label('Color de la etiqueta'),

                        Textarea::make('description')
                            ->label('Descripción')
                            ->rows(2)
                            ->maxLength(500)
                            ->columnSpanFull(),

                        TextInput::make('sort_order')
                            ->label('Orden en el sitio')
                            ->helperText('Menor aparece primero.')
                            ->numeric()
                            ->minValue(0)
                            ->default(0)
                            ->required(),
                    ])
                    ->columns(2),

                Section::make('Límites del plan')
                    ->description('0 = ilimitado. Se aplican al crear usuarios/clientes/créditos, tanto en el panel como en la app.')
                    ->icon('heroicon-o-adjustments-horizontal')
                    ->schema([
                        TextInput::make('max_users')
                            ->label('Usuarios')
                            ->numeric()->minValue(0)->default(0)->required(),

                        TextInput::make('max_collectors')
                            ->label('Cobradores')
                            ->numeric()->minValue(0)->default(0)->required(),

                        TextInput::make('max_clients')
                            ->label('Clientes')
                            ->numeric()->minValue(0)->default(0)->required(),

                        TextInput::make('max_active_credits')
                            ->label('Créditos activos')
                            ->numeric()->minValue(0)->default(0)->required(),

                        TextInput::make('max_monthly_volume')
                            ->label('Volumen mensual')
                            ->helperText('Monto máximo desembolsado al mes (COP). 0 = ilimitado.')
                            ->numeric()->minValue(0)->step(1)->prefix('$')->default(0)->required(),
                    ])
                    ->columns(3),

                Section::make('Funcionalidades')
                    ->description('Qué incluye el plan.')
                    ->icon('heroicon-o-sparkles')
                    ->schema([
                        Toggle::make('has_pwa_access')->label('App móvil (PWA)'),
                    ])
                    ->columns(3),

                Section::make('Publicación')
                    ->description('Controla si el plan aparece en el sitio y si acepta prueba gratis.')
                    ->icon('heroicon-o-globe-alt')
                    ->schema([
                        Toggle::make('is_public')
                            ->label('Visible en el sitio')
                            ->helperText('Aparece en la página de precios y en el registro público.'),

                        Toggle::make('is_active')
                            ->label('Activo')
                            ->helperText('Si se desactiva, no se puede contratar ni aparece disponible.')
                            ->default(true),

                        Toggle::make('is_trial_available')
                            ->label('Permite prueba gratis'),

                        TextInput::make('trial_days')
                            ->label('Días de prueba')
                            ->numeric()->minValue(0)->default(14)->required(),
                    ])
                    ->columns(2),
            ]);
    }
}
