<?php

namespace App\Filament\Central\Resources;

use App\Filament\Central\Resources\PlanResource\Pages;
use App\Models\Central\Plan;
use Filament\Actions;
use Filament\Forms;
use Filament\Resources\Resource;
use Filament\Schemas;
use Filament\Schemas\Components\Utilities\Get;
use Filament\Schemas\Schema;
use Filament\Tables;
use Filament\Tables\Table;

class PlanResource extends Resource
{
    protected static ?string $model = Plan::class;

    protected static string|\BackedEnum|null $navigationIcon = 'heroicon-o-rectangle-stack';

    public static function getNavigationLabel(): string
    {
        return __('nav.label.Planuri');
    }

    protected static ?string $modelLabel = null;

    public static function getModelLabel(): string
    {
        return __('plan');
    }

    protected static ?string $pluralModelLabel = null;

    public static function getPluralModelLabel(): string
    {
        return __('planuri');
    }

    protected static ?int $navigationSort = 20;

    public const FEATURE_OPTIONS = [
        'kanban' => 'Kanban WO',
        'reports' => 'Rapoarte avansate',
        'ai' => 'Asistent AI',
        'pdf' => 'Generare PDF',
        'reverb' => 'WebSocket real-time',
        'api' => 'REST API + tokens',
        'multi_user' => 'Multi-user (>1 cont)',
        'white_label' => 'White-label complet',
        'priority_support' => 'Suport prioritar',
        'custom_domain' => 'Domeniu propriu',
    ];

    public static function form(Schema $schema): Schema
    {
        return $schema->components([
            Schemas\Components\Section::make(__('Identificare'))
                ->columns(2)
                ->schema([
                    Forms\Components\TextInput::make('slug')
                        ->required()->alphaDash()->unique(ignoreRecord: true)
                        ->dehydrateStateUsing(fn ($s) => strtolower((string) $s))
                        ->extraInputAttributes(['style' => 'text-transform:lowercase']),
                    Forms\Components\TextInput::make('name')->required()->maxLength(60),
                    Forms\Components\Toggle::make('is_active')->label(__('Activ'))->default(true),
                    Forms\Components\Toggle::make('is_public')->label(__('Public (afișat la signup)'))->default(true),
                    Forms\Components\Toggle::make('is_demo')
                        ->label(__('Demo (pentru demonstrații sales)'))
                        ->helperText(__('Plan ascuns public, folosit pentru tenant-i demo cu features deblocate.'))
                        ->default(false),
                    Forms\Components\TextInput::make('trial_days')
                        ->label(__('Perioadă trial (zile)'))
                        ->numeric()->placeholder(__('null = fără trial'))
                        ->helperText(__('Numărul de zile gratis după ce un tenant alege acest plan.')),
                ]),
            Schemas\Components\Section::make(__('Preț'))
                ->columns(3)
                ->schema([
                    Forms\Components\TextInput::make('price_monthly')->label(__('Preț lunar'))->numeric()->required()->suffix(fn (Get $get) => $get('currency') ?? 'MDL'),
                    Forms\Components\TextInput::make('price_yearly')->label(__('Preț anual'))->numeric()->helperText(__('De obicei 10× preț lunar (2 luni gratis).'))->suffix(fn (Get $get) => $get('currency') ?? 'MDL'),
                    Forms\Components\Select::make('currency')->options(['MDL' => 'MDL', 'EUR' => 'EUR', 'USD' => 'USD'])->default('MDL'),
                ]),
            Schemas\Components\Section::make(__('Funcționalități incluse'))
                ->columns(2)
                ->schema([
                    Forms\Components\CheckboxList::make('features')
                        ->options(self::FEATURE_OPTIONS)
                        ->columns(2)
                        ->columnSpanFull(),
                ]),
            Schemas\Components\Section::make(__('Limite'))
                ->columns(3)
                ->schema([
                    Forms\Components\TextInput::make('limits.max_users')->label(__('Max useri'))->numeric()->placeholder('∞'),
                    Forms\Components\TextInput::make('limits.max_clients')->label(__('Max clienți'))->numeric()->placeholder('∞'),
                    Forms\Components\TextInput::make('limits.max_vehicles')->label(__('Max mașini'))->numeric()->placeholder('∞'),
                    Forms\Components\TextInput::make('limits.max_work_orders_month')->label(__('Max fișe/lună'))->numeric()->placeholder('∞'),
                    Forms\Components\TextInput::make('limits.storage_mb')->label(__('Storage (MB)'))->numeric()->placeholder('∞'),
                    Forms\Components\TextInput::make('limits.ai_messages_month')->label(__('Mesaje AI/lună'))->numeric()->placeholder('∞'),
                ]),
        ]);
    }

    public static function table(Table $table): Table
    {
        return $table
            ->columns([
                Tables\Columns\TextColumn::make('name')
                    ->searchable()->sortable()
                    ->weight('bold')
                    ->description(fn ($record) => $record->is_demo ? '🎬 Demo' : ($record->trial_days ? "🎁 {$record->trial_days} zile trial" : null)),
                Tables\Columns\TextColumn::make('price_monthly')
                    ->money(fn ($record) => $record->currency)
                    ->label(__('Lunar'))
                    ->sortable(),
                Tables\Columns\TextColumn::make('price_yearly')
                    ->money(fn ($record) => $record->currency)
                    ->label(__('Anual')),
                Tables\Columns\TextColumn::make('companies_count')
                    ->counts('companies')
                    ->label(__('Abonați'))
                    ->badge()
                    ->color('primary'),
                Tables\Columns\TextColumn::make('features')
                    ->label(__('Funcționalități'))
                    ->formatStateUsing(fn ($s) => is_array($s) ? count($s) . ' incluse' : '—')
                    ->badge(),
                Tables\Columns\IconColumn::make('is_active')->boolean()->label(__('Activ')),
                Tables\Columns\IconColumn::make('is_public')->boolean()->label(__('Public')),
            ])
            ->actions([
                Actions\EditAction::make(),
                Actions\DeleteAction::make(),
            ])
            ->emptyStateHeading(__('Niciun plan definit'))
            ->emptyStateDescription(__('Creează planuri (ex: Free, Basic, Pro) și atribuie-le companiilor.'))
            ->defaultSort('price_monthly');
    }

    public static function getPages(): array
    {
        return [
            'index' => Pages\ListPlans::route('/'),
            'create' => Pages\CreatePlan::route('/create'),
            'edit' => Pages\EditPlan::route('/{record}/edit'),
        ];
    }
}
