<?php

declare(strict_types=1);

namespace App\Filament\Widgets;

use App\Filament\Resources\SubscriptionRequests\SubscriptionRequestResource;
use App\Models\SubscriptionRequest;
use Filament\Actions\Action;
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;

/**
 * Widget showing pending subscription requests for Super Admin dashboard.
 */
class PendingSubscriptionRequestsWidget extends BaseWidget
{
    protected static ?string $heading = 'Solicitudes de Suscripción Pendientes';

    protected static ?int $sort = 1;

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

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

    protected function getTableQuery(): Builder
    {
        return SubscriptionRequest::query()
            ->withoutGlobalScopes()
            ->pending()
            ->byPriority()
            ->with(['company', 'requestedBy', 'requestedPlan']);
    }

    public function table(Table $table): Table
    {
        return $table
            ->defaultPaginationPageOption(5)
            ->paginated([5, 10])
            ->emptyStateHeading('Sin solicitudes pendientes')
            ->emptyStateDescription('No hay solicitudes de suscripción esperando revisión.')
            ->emptyStateIcon('heroicon-o-check-circle')
            ->columns([
                TextColumn::make('company.name')
                    ->label('Empresa')
                    ->searchable()
                    ->description(fn ($record) => $record->requestedBy?->name),

                TextColumn::make('request_type_label')
                    ->label('Tipo')
                    ->badge()
                    ->color('info'),

                TextColumn::make('requested_value')
                    ->label('Solicita')
                    ->placeholder('-')
                    ->description(fn ($record) => $record->requestedPlan?->name),

                TextColumn::make('priority_label')
                    ->label('Prioridad')
                    ->badge()
                    ->color(fn ($record) => $record->priority_color),

                TextColumn::make('created_at')
                    ->label('Fecha')
                    ->since()
                    ->sortable(),
            ])
            ->actions([
                Action::make('view')
                    ->label('Revisar')
                    ->icon('heroicon-o-eye')
                    ->color('primary')
                    ->url(fn ($record) => SubscriptionRequestResource::getUrl('view', ['record' => $record])),
            ]);
    }
}
