"""Shared seat-scope constants and helpers (no cross-module cycles)."""

from __future__ import annotations

import os
import re
import sys

SEAT_ID_RE = re.compile(r"^[A-Za-z0-9][A-Za-z0-9._-]*$")
CONTROL_RE = re.compile(r"[\x00-\x08\x0b\x0c\x0e-\x1f\x7f]")
LINUX_USERNAME_RE = re.compile(r"^[a-z][a-z0-9_-]{0,30}$")
MAX_LINUX_USERNAME = 32
IMPLEMENTER_USER_PREFIX = "ods-"
DEFAULT_IMPLEMENTER_RUNTIME_BASE = "/var/lib/overdeck/seat-runtime"
DEFAULT_SEAT_CONTROL_BASE = "/var/lib/overdeck/seat-control"
CONTROL_BASE_MODE = 0o711
CONTROL_DIR_MODE = 0o711
CONTROL_OWNER_MARKER_MODE = 0o600
TMUX_CONF_MODE = 0o644
OWNER_MARKER_PREFIX = "overdeck-seat-owner="
NOLOGIN_SHELL = "/usr/sbin/nologin"
SEAT_TRUSTED_CONFIG_DIR = "trusted-config"
SEAT_GIT_EMAIL_DOMAIN = "overdeck.invalid"
LAUNCH_AUTHORITY_FILES = (
    "seat-settings.json",
    "empty-mcp.json",
    "claude-forwarded.json",
    "seat-env.json",
)


def implementer_runtime_base() -> str:
    return os.environ.get("OVERDECK_SEAT_RUNTIME_BASE", DEFAULT_IMPLEMENTER_RUNTIME_BASE)


def seat_control_base() -> str:
    return os.environ.get("OVERDECK_SEAT_CONTROL_BASE", DEFAULT_SEAT_CONTROL_BASE)


def seat_test_mode() -> bool:
    return os.environ.get("OVERDECK_SEAT_TEST_MODE") == "1"


def die(msg: str, code: int = 2) -> None:
    print(msg, file=sys.stderr)
    raise SystemExit(code)
