"""Strict Linux descriptor-link primitive for unnamed marker publication."""

from __future__ import annotations

import ctypes
import errno
import os
from typing import Final, Protocol, cast

from checkin_cli.weekly_operations import WeeklyOperationsPlatformNotSupported

AT_EMPTY_PATH: Final = 0x1000
_UNSUPPORTED: Final = frozenset((errno.ENOSYS, errno.EOPNOTSUPP, errno.EINVAL, errno.EPERM))
class _LinkAt(Protocol):
    argtypes: tuple[type[ctypes.c_int], type[ctypes.c_char_p], type[ctypes.c_int], type[ctypes.c_char_p], type[ctypes.c_int]]
    restype: type[ctypes.c_int]

    def __call__(self, source: int, old_path: bytes, directory: int, new_path: bytes, flags: int) -> int: ...


_LIBC = ctypes.CDLL(None, use_errno=True)


def _load_linkat() -> _LinkAt | None:
    try:
        link = cast(_LinkAt, cast(object, _LIBC.linkat))
    except AttributeError:
        return None
    link.argtypes = (ctypes.c_int, ctypes.c_char_p, ctypes.c_int, ctypes.c_char_p, ctypes.c_int)
    link.restype = ctypes.c_int
    return link


_LINKAT = _load_linkat()


def link_unnamed_file(source: int, directory: int, name: str) -> None:
    """Link one O_TMPFILE descriptor into an absent directory entry."""
    if _LINKAT is None:
        raise WeeklyOperationsPlatformNotSupported("descriptor link publication is unsupported")
    result = _LINKAT(source, b"", directory, os.fsencode(name), AT_EMPTY_PATH)
    if result == 0:
        return
    number = ctypes.get_errno()
    if number == errno.EEXIST:
        raise FileExistsError(number, os.strerror(number), name)
    if number in _UNSUPPORTED:
        raise WeeklyOperationsPlatformNotSupported("descriptor link publication is unsupported")
    raise OSError(number, os.strerror(number), name)
