"""Descriptor identity checks for the registered weekly reminder ledger."""

from __future__ import annotations

import os
import stat

from .weekly_operations import WeeklyOperationsConflict
from .weekly_operations_customer_authority import CanonicalCheckinCustomerAuthority

FileIdentity = tuple[int, int, int, int, int]


def directory_identity(info: os.stat_result) -> FileIdentity:
    if not stat.S_ISDIR(info.st_mode):
        raise WeeklyOperationsConflict("weekly ledger parent non-directory")
    return info.st_dev, info.st_ino, stat.S_IMODE(info.st_mode), info.st_uid, 0


def canonical_root_identity(
    source: CanonicalCheckinCustomerAuthority,
) -> FileIdentity:
    pin = source.binding.pins.root
    return pin.device, pin.inode, pin.mode, pin.owner, pin.links


def file_identity(info: os.stat_result) -> FileIdentity:
    if not stat.S_ISREG(info.st_mode) or info.st_nlink != 1:
        raise WeeklyOperationsConflict("weekly ledger file unsafe")
    return (
        info.st_dev,
        info.st_ino,
        stat.S_IMODE(info.st_mode),
        info.st_uid,
        info.st_nlink,
    )


def verify_named(
    parent: int, name: str, descriptor: int, *, directory: bool
) -> None:
    named = os.stat(name, dir_fd=parent, follow_symlinks=False)
    opened = os.fstat(descriptor)
    expected = directory_identity(opened) if directory else file_identity(opened)
    observed = directory_identity(named) if directory else file_identity(named)
    if observed != expected:
        raise WeeklyOperationsConflict("weekly reminder ledger name drift")
