<?php

namespace App\Http\Middleware;

use Closure;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;

class SessionTimeout
{
    /**
     * Menit tidak aktif sebelum sesi dianggap expired.
     * Sesuaikan dengan SESSION_LIFETIME di .env
     */
    const TIMEOUT_MINUTES = 120;

    public function handle(Request $request, Closure $next)
    {
        // Lewati jika belum login
        if (!Auth::check()) {
            return $next($request);
        }

        $lastActivity = session('last_activity');
        $now          = time();

        // ── 1. Cek inaktivitas (session idle timeout) ──────────────────────────
        if ($lastActivity && ($now - $lastActivity) > (self::TIMEOUT_MINUTES * 60)) {
            Auth::logout();
            $request->session()->invalidate();
            $request->session()->regenerateToken();

            if ($request->expectsJson()) {
                return response()->json(['message' => 'Sesi telah berakhir. Silakan login kembali.'], 401);
            }

            return redirect()->route('login')
                ->with('error', 'Sesi Anda telah berakhir karena tidak aktif. Silakan login kembali.');
        }

        // ── 2. Validasi user masih ada & aktif di database ─────────────────────
        //    (Mencegah bug jika user dihapus admin saat masih login)
        $user = Auth::user();
        if (!$user) {
            Auth::logout();
            $request->session()->invalidate();
            $request->session()->regenerateToken();

            if ($request->expectsJson()) {
                return response()->json(['message' => 'Akun tidak ditemukan.'], 401);
            }

            return redirect()->route('login')
                ->with('error', 'Akun tidak ditemukan. Silakan login kembali.');
        }

        // ── 3. Update timestamp aktivitas terakhir ─────────────────────────────
        session(['last_activity' => $now]);

        return $next($request);
    }
}
