<?php

declare(strict_types=1);

namespace App\Filament\Widgets\SuperAdmin;

use App\Models\Plan;
use Filament\Tables\Columns\TextColumn;
use Filament\Tables\Table;
use Filament\Widgets\TableWidget as BaseWidget;
use Illuminate\Database\Eloquent\Builder;
use Illuminate\Support\Facades\Auth;

/**
 * Tabla de suscripciones por plan.
 *
 * Muestra cuántas suscripciones activas tiene cada plan
 * y el revenue que genera.
 */
class SubscriptionsByPlanTable extends BaseWidget
{
    protected static ?string $heading = 'Suscripciones por Plan';

    protected static ?int $sort = 4;

    protected int|string|array $columnSpan = 'full';

    /**
     * Solo visible para Super Admins.
     */
    public static function canView(): bool
    {
        return Auth::user()?->isSuperAdmin() ?? false;
    }

    public function table(Table $table): Table
    {
        return $table
            ->query(
                Plan::query()
                    ->withCount(['subscriptions as active_subscriptions' => function (Builder $query) {
                        $query->whereIn('status', ['active', 'trial', 'grace']);
                    }])
                    ->where('is_active', true)
                    ->orderByDesc('active_subscriptions')
            )
            ->columns([
                TextColumn::make('name')
                    ->label('Plan')
                    ->badge()
                    ->color(fn (Plan $record): string => $record->badge_color ?? 'gray'),

                TextColumn::make('price')
                    ->label('Precio')
                    ->money('COP')
                    ->sortable(),

                TextColumn::make('billing_cycle')
                    ->label('Ciclo')
                    ->badge()
                    ->formatStateUsing(fn (string $state): string => match ($state) {
                        'monthly' => 'Mensual',
                        'quarterly' => 'Trimestral',
                        'semiannual' => 'Semestral',
                        'annual' => 'Anual',
                        default => ucfirst($state),
                    })
                    ->color(fn (string $state): string => match ($state) {
                        'monthly' => 'gray',
                        'quarterly' => 'info',
                        'semiannual' => 'warning',
                        'annual' => 'success',
                        default => 'gray',
                    }),

                TextColumn::make('active_subscriptions')
                    ->label('Suscripciones')
                    ->numeric()
                    ->sortable(),

                TextColumn::make('mrr_contribution')
                    ->label('MRR Contribuido')
                    ->getStateUsing(function (Plan $record): float {
                        $cycleMonths = match ($record->billing_cycle) {
                            'monthly' => 1,
                            'quarterly' => 3,
                            'semiannual' => 6,
                            'annual' => 12,
                            default => 1,
                        };

                        return ($record->price / $cycleMonths) * $record->active_subscriptions;
                    })
                    ->money('COP')
                    ->sortable(),

                TextColumn::make('limits_summary')
                    ->label('Límites')
                    ->getStateUsing(function (Plan $record): string {
                        $limits = [];
                        if ($record->max_users) {
                            $limits[] = "{$record->max_users} usuarios";
                        }
                        if ($record->max_active_credits) {
                            $limits[] = "{$record->max_active_credits} créditos";
                        }
                        if ($record->max_clients) {
                            $limits[] = "{$record->max_clients} clientes";
                        }

                        return implode(' · ', $limits) ?: 'Ilimitado';
                    })
                    ->wrap(),
            ])
            ->paginated(false)
            ->defaultSort('active_subscriptions', 'desc');
    }
}
