"""Allocation-safe opener for an existing weekly reminder ledger."""

from __future__ import annotations

import hashlib
import json
import os
from dataclasses import replace
from typing import Final

from .resource_registrar_contract import ResourceRegistrarProtocol
from .weekly_operations import WeeklyOperationsConflict
from .weekly_operations_customer_authority import CanonicalCheckinCustomerAuthority
from .weekly_operations_store import WeeklyOperationsStore
from .weekly_reminder_ledger_authority import (
    WeeklyReminderLedgerAuthority,
    WeeklyReminderLedgerBinding,
)
from .weekly_reminder_ledger_identity import (
    canonical_root_identity,
    directory_identity,
    file_identity,
)

_SCHEMA: Final = "weekly-reminder-ledger-authority-v2"
_DIR_FLAGS: Final = os.O_RDONLY | os.O_DIRECTORY | os.O_NOFOLLOW | os.O_CLOEXEC
_FILE_FLAGS: Final = os.O_RDWR | os.O_NOFOLLOW | os.O_NONBLOCK | os.O_CLOEXEC


def _digest(value: WeeklyReminderLedgerBinding) -> str:
    payload = {
        name: getattr(value, name)
        for name in value.__dataclass_fields__
        if name != "binding_digest"
    }
    encoded = json.dumps(payload, sort_keys=True, separators=(",", ":")).encode()
    return hashlib.sha256(encoded).hexdigest()


def open_registered_weekly_reminder_ledger_authority_owned(
    source: CanonicalCheckinCustomerAuthority,
    store: WeeklyOperationsStore,
    registrar: ResourceRegistrarProtocol,
) -> WeeklyReminderLedgerAuthority:
    """Open with every raw descriptor registered before this factory returns."""
    source.verify()
    registered = source.registered_binding
    if (
        source.customer_identity_digest != store.customer_identity_digest
        or registered.authority_binding_digest != store.authority_binding_digest
    ):
        raise WeeklyOperationsConflict("weekly reminder registered authorities disagree")
    customer_fd = registrar.open_fd(
        lambda: os.dup(source.registered_root_descriptor)
    )
    customers_fd = registrar.open_fd(
        lambda: os.open("..", _DIR_FLAGS, dir_fd=customer_fd)
    )
    data_fd = registrar.open_fd(
        lambda: os.open("..", _DIR_FLAGS, dir_fd=customers_fd)
    )
    profile_fd = registrar.open_fd(
        lambda: os.open("..", _DIR_FLAGS, dir_fd=data_fd)
    )
    ledger_fd = registrar.open_fd(
        lambda: os.open("scheduled-deliveries.jsonl", _FILE_FLAGS, dir_fd=data_fd)
    )
    lock_fd = registrar.open_fd(
        lambda: os.open(".scheduled-deliveries.lock", _FILE_FLAGS, dir_fd=data_fd)
    )
    claims = os.stat(
        "customer-schedule-claims", dir_fd=data_fd, follow_symlinks=False
    )
    _ = directory_identity(claims)
    binding = WeeklyReminderLedgerBinding(
        _SCHEMA,
        source.customer_identity_digest,
        registered.registration_row_digest,
        registered.binding_digest,
        canonical_root_identity(source),
        directory_identity(os.fstat(profile_fd)),
        directory_identity(os.fstat(data_fd)),
        store.authority_binding_digest,
        store.customer_identity_digest,
        file_identity(os.fstat(ledger_fd)),
        file_identity(os.fstat(lock_fd)),
        "",
    )
    binding = replace(binding, binding_digest=_digest(binding))
    authority = WeeklyReminderLedgerAuthority(
        binding, source, store, profile_fd, data_fd, ledger_fd, lock_fd
    )
    registrar.close_fd(customers_fd)
    registrar.close_fd(customer_fd)
    return authority
