<?php

namespace App\Http\Middleware;

use App\Models\User;
use App\Services\Hr\EmployeeAccessRevocationService;
use Closure;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
use Symfony\Component\HttpFoundation\Response;

class EnsureAccountActive
{
    public function handle(Request $request, Closure $next): Response
    {
        $user = $request->user();
        if (! $user instanceof User) {
            return $next($request);
        }

        app(EmployeeAccessRevocationService::class)->deactivateIfLastWorkingDatePassed($user);
        $user->refresh();

        if ($user->status === User::STATUS_INACTIVE || ! $user->allow_login) {
            Auth::logout();

            if ($request->hasSession()) {
                $request->session()->invalidate();
                $request->session()->regenerateToken();
            }

            if ($request->expectsJson()) {
                return response()->json([
                    'message' => 'Please contact the administrator.',
                ], 401);
            }

            return redirect()
                ->route('login')
                ->withErrors(['email' => __('Please contact the administrator.')]);
        }

        return $next($request);
    }
}