<?php

namespace App\Http\Middleware;

use App\Models\Location;
use App\Services\LocationService;
use Closure;
use Illuminate\Http\Request;
use Symfony\Component\HttpFoundation\Response;

class EnsureStoreContext
{
    public function __construct(protected LocationService $locationService)
    {
    }

    public function handle(Request $request, Closure $next, string $mode = 'required'): Response
    {
        $user = $request->user();
        if (!$user) {
            abort(401);
        }

        $locationId = $this->locationService->resolveLocationIdForUser($user);

        // Lightweight: if session location became inactive, clear and re-resolve
        if ($locationId) {
            $active = Location::query()->whereKey($locationId)->where('is_active', true)->exists();
            if (!$active) {
                $this->locationService->clearCurrentLocation();
                $locationId = $this->locationService->resolveLocationIdForUser($user);
            }
        }

        if (!$locationId && $mode === 'required') {
            if ($request->expectsJson()) {
                return response()->json([
                    'error' => 'No store context assigned. Please select a store or contact admin.',
                ], 403);
            }

            return redirect()
                ->route('admin.locations.select')
                ->with('error', 'Please select a store to continue.');
        }

        if ($locationId) {
            $this->locationService->setCurrentLocation($locationId);
            $request->attributes->set('current_location_id', $locationId);
            $request->attributes->set('current_location', Location::find($locationId));
        }

        return $next($request);
    }
}
