"""Descriptor-scoped authority for weekly schedule ledger operations."""

from __future__ import annotations

import os
import stat
from collections.abc import Callable, Generator
from contextlib import contextmanager
from contextvars import ContextVar
from typing import Final

from .weekly_operations_schedule_host_models_r4 import CustomerScheduleError

AuthorityValidator = Callable[[], None]
_AUTHORITY: Final[ContextVar[AuthorityValidator | None]] = ContextVar(
    "weekly_schedule_authority", default=None
)
_DESCRIPTOR_ROOT: Final[ContextVar[tuple[int, int] | None]] = ContextVar(
    "weekly_descriptor_root", default=None
)
_PROVIDER_ADMISSION: Final[
    ContextVar[tuple[tuple[int, int], AuthorityValidator] | None]
] = ContextVar("weekly_provider_admission", default=None)


def schedule_authority_validator() -> AuthorityValidator | None:
    return _AUTHORITY.get()


def schedule_descriptor_identity() -> tuple[int, int] | None:
    return _DESCRIPTOR_ROOT.get()


def schedule_provider_admission() -> tuple[tuple[int, int], AuthorityValidator] | None:
    return _PROVIDER_ADMISSION.get()


@contextmanager
def weekly_schedule_authority_fence(
    validator: AuthorityValidator,
) -> Generator[None, None, None]:
    """Run a descriptor capability validator inside every schedule lock."""
    token = _AUTHORITY.set(validator)
    try:
        yield
    finally:
        _AUTHORITY.reset(token)


@contextmanager
def weekly_schedule_descriptor_root(descriptor: int) -> Generator[None, None, None]:
    """Admit only the exact procfs alias of a caller-held profile descriptor."""
    info = os.fstat(descriptor)
    token = _DESCRIPTOR_ROOT.set((info.st_dev, info.st_ino))
    try:
        yield
    finally:
        _DESCRIPTOR_ROOT.reset(token)


@contextmanager
def weekly_schedule_provider_admission(
    lock_descriptor: int,
    validator: AuthorityValidator,
) -> Generator[None, None, None]:
    """Bind nested schedule operations to an already-held exact provider flock."""
    info = os.fstat(lock_descriptor)
    if not stat.S_ISREG(info.st_mode):
        raise CustomerScheduleError("weekly provider admission lock is unsafe")
    token = _PROVIDER_ADMISSION.set(((info.st_dev, info.st_ino), validator))
    try:
        validator()
        yield
        validator()
    finally:
        _PROVIDER_ADMISSION.reset(token)
