<?php

namespace App\Services;

use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Session;

class SessionInvalidator
{
    public function invalidate(string $sessionId): void
    {
        if ($sessionId === '') {
            return;
        }

        try {
            Session::getHandler()->destroy($sessionId);
        } catch (\Throwable) {
            $this->invalidateFallback($sessionId);
        }
    }

    public function invalidateAllForUser(int $userId): void
    {
        if ($userId <= 0 || ! $this->databaseSessionsAvailable()) {
            return;
        }

        DB::table(config('session.table', 'sessions'))
            ->where('user_id', $userId)
            ->delete();
    }

    protected function invalidateFallback(string $sessionId): void
    {
        if (config('session.driver') !== 'database' || ! $this->databaseSessionsAvailable()) {
            return;
        }

        DB::table(config('session.table', 'sessions'))
            ->where('id', $sessionId)
            ->delete();
    }

    public function databaseSessionsAvailable(): bool
    {
        if (config('session.driver') !== 'database') {
            return false;
        }

        try {
            return DB::getSchemaBuilder()->hasTable(config('session.table', 'sessions'));
        } catch (\Throwable) {
            return false;
        }
    }
}
