<?php

declare(strict_types=1);

namespace App\Filament\Widgets\SuperAdmin;

use App\Models\Company;
use App\Services\Platform\SaaSMetricsService;
use Filament\Tables\Columns\TextColumn;
use Filament\Tables\Table;
use Filament\Widgets\TableWidget as BaseWidget;
use Illuminate\Support\Facades\Auth;

/**
 * Tabla de companies cerca de sus límites.
 *
 * Muestra las empresas que están usando más del 80%
 * de alguno de sus límites del plan.
 */
class CompaniesNearLimitTable extends BaseWidget
{
    protected static ?string $heading = 'Companies Cerca del Límite';

    protected static ?string $description = 'Empresas con >80% de uso en algún límite';

    protected static ?int $sort = 5;

    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
    {
        $service = app(SaaSMetricsService::class);
        $companies = $service->getCompaniesNearLimit();

        return $table
            ->query(
                Company::query()
                    ->whereIn('id', $companies->pluck('company_id'))
            )
            ->columns([
                TextColumn::make('name')
                    ->label('Empresa')
                    ->searchable()
                    ->url(fn ($record) => route('filament.admin.resources.companies.edit', $record)),

                TextColumn::make('plan_name')
                    ->label('Plan')
                    ->getStateUsing(function ($record) use ($companies) {
                        return $companies->firstWhere('company_id', $record->id)['plan_name'] ?? 'N/A';
                    })
                    ->badge(),

                TextColumn::make('users_usage')
                    ->label('Usuarios')
                    ->getStateUsing(function ($record) use ($companies) {
                        $usage = $companies->firstWhere('company_id', $record->id)['users_usage'] ?? 0;

                        return $usage.'%';
                    })
                    ->color(fn ($state) => $this->getUsageColor((float) str_replace('%', '', $state))),

                TextColumn::make('credits_usage')
                    ->label('Créditos')
                    ->getStateUsing(function ($record) use ($companies) {
                        $usage = $companies->firstWhere('company_id', $record->id)['credits_usage'] ?? 0;

                        return $usage.'%';
                    })
                    ->color(fn ($state) => $this->getUsageColor((float) str_replace('%', '', $state))),

                TextColumn::make('clients_usage')
                    ->label('Clientes')
                    ->getStateUsing(function ($record) use ($companies) {
                        $usage = $companies->firstWhere('company_id', $record->id)['clients_usage'] ?? 0;

                        return $usage.'%';
                    })
                    ->color(fn ($state) => $this->getUsageColor((float) str_replace('%', '', $state))),

                TextColumn::make('max_usage')
                    ->label('Max. Uso')
                    ->getStateUsing(function ($record) use ($companies) {
                        $usage = $companies->firstWhere('company_id', $record->id)['max_usage'] ?? 0;

                        return $usage.'%';
                    })
                    ->badge()
                    ->color(fn ($state) => $this->getUsageColor((float) str_replace('%', '', $state))),
            ])
            ->paginated(false)
            ->emptyStateHeading('Sin empresas cerca del límite')
            ->emptyStateDescription('Todas las empresas están dentro de límites seguros.')
            ->emptyStateIcon('heroicon-o-check-circle');
    }

    private function getUsageColor(float $percentage): string
    {
        if ($percentage >= 95) {
            return 'danger';
        }
        if ($percentage >= 80) {
            return 'warning';
        }

        return 'success';
    }
}
