<?php

namespace App\Services;

use App\Models\User;
use App\Models\UserSession;
use Illuminate\Http\Request;

class UserSessionService
{
    public function __construct(
        protected SessionInvalidator $sessionInvalidator
    ) {}

    public function recordLogin(User $user, Request $request): void
    {
        UserSession::where('user_id', $user->id)->update(['is_current' => false]);

        UserSession::create([
            'user_id' => $user->id,
            'session_id' => $request->session()->getId(),
            'ip_address' => $request->ip(),
            'user_agent' => substr((string) $request->userAgent(), 0, 500),
            'last_activity_at' => now(),
            'is_current' => true,
        ]);
    }

    public function touchCurrent(User $user, Request $request): void
    {
        UserSession::query()
            ->where('user_id', $user->id)
            ->where('session_id', $request->session()->getId())
            ->update(['last_activity_at' => now(), 'is_current' => true]);
    }

    public function revoke(UserSession $session): void
    {
        if ($session->session_id) {
            $this->sessionInvalidator->invalidate($session->session_id);
        }

        $session->delete();
    }

    /** Remove stale audit rows older than the given number of days. */
    public function pruneOlderThan(int $days = 90): int
    {
        return UserSession::query()
            ->where('last_activity_at', '<', now()->subDays(max(1, $days)))
            ->delete();
    }
}
