<?php

declare(strict_types=1);

namespace App\Http\Middleware;

use Closure;
use Illuminate\Http\Request;
use Laravel\Sanctum\PersonalAccessToken;
use Symfony\Component\HttpFoundation\Response;

class EnsurePwaCollector
{
    /**
     * Verifica que el usuario autenticado sea un collector con acceso a PWA.
     */
    public function handle(Request $request, Closure $next): Response
    {
        $user = $request->user();

        if (! $user) {
            return response()->json([
                'message' => 'No autenticado.',
            ], 401);
        }

        // Verificar que es collector
        if (! $user->hasRole('collector')) {
            return response()->json([
                'message' => 'Acceso denegado. Solo cobradores pueden usar la app móvil.',
            ], 403);
        }

        // Verificar que el token fue emitido con habilidad de cobrador.
        // Impide que un token de admin/supervisor sea usado en rutas exclusivas de collector.
        // Solo aplica a PersonalAccessToken reales (no TransientToken de tests).
        $currentToken = $user->currentAccessToken();

        if ($currentToken instanceof PersonalAccessToken) {
            $tokenAbilities = $currentToken->abilities ?? [];

            if (! in_array('pwa:collector', $tokenAbilities, true)) {
                return response()->json([
                    'message' => 'Token sin permisos de cobrador.',
                ], 403);
            }
        }

        // Verificar que tiene company asignada
        if (! $user->company_id) {
            return response()->json([
                'message' => 'Usuario sin empresa asignada.',
            ], 403);
        }

        // Verificar suscripción activa
        if (! $user->hasActiveSubscription()) {
            return response()->json([
                'message' => 'La suscripción de tu empresa ha expirado.',
            ], 403);
        }

        return $next($request);
    }
}
