"""
In-process opaque session IDs (browser cookie / Bearer token value).

Single-process only; restarting the server clears every session (empty dict).
"""

from __future__ import annotations

import secrets
import threading
import time
from dataclasses import dataclass
from typing import Literal

_lock = threading.Lock()

AuthMethod = Literal["local", "oauth"]


@dataclass(frozen=True)
class Session:
	username: str
	created_at: float
	subject: str | None = None
	email: str | None = None
	auth_method: AuthMethod = "local"


_sessions: dict[str, Session] = {}


def create_session(
	username: str,
	*,
	subject: str | None = None,
	email: str | None = None,
	auth_method: AuthMethod = "local",
) -> str:
	sid = secrets.token_urlsafe(32)
	with _lock:
		_sessions[sid] = Session(
			username=username,
			created_at=time.time(),
			subject=subject,
			email=email,
			auth_method=auth_method,
		)
	return sid


def get_session(session_id: str | None) -> Session | None:
	if not session_id:
		return None
	raw = session_id.strip()
	if not raw:
		return None
	with _lock:
		return _sessions.get(raw)


def revoke_session(session_id: str | None) -> None:
	if not session_id:
		return
	raw = session_id.strip()
	if not raw:
		return
	with _lock:
		_sessions.pop(raw, None)


def clear_all_sessions() -> None:
	with _lock:
		_sessions.clear()