"""Mutation-free 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 .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


def _open_regular(parent: int, name: str) -> int:
    return os.open(
        name,
        os.O_RDWR | os.O_NOFOLLOW | os.O_NONBLOCK | os.O_CLOEXEC,
        dir_fd=parent,
    )


def _binding_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(
    source: CanonicalCheckinCustomerAuthority,
    store: WeeklyOperationsStore,
) -> WeeklyReminderLedgerAuthority:
    """Open exact existing descriptors without creation or migration."""
    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")
    opened: list[int] = []
    try:
        customer_fd = source.duplicate_registered_root_descriptor()
        opened.append(customer_fd)
        customers_fd = os.open("..", _DIR_FLAGS, dir_fd=customer_fd)
        opened.append(customers_fd)
        data_fd = os.open("..", _DIR_FLAGS, dir_fd=customers_fd)
        opened.append(data_fd)
        profile_fd = os.open("..", _DIR_FLAGS, dir_fd=data_fd)
        opened.append(profile_fd)
        ledger_fd = _open_regular(data_fd, "scheduled-deliveries.jsonl")
        opened.append(ledger_fd)
        lock_fd = _open_regular(data_fd, ".scheduled-deliveries.lock")
        opened.append(lock_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=_binding_digest(binding))
        authority = WeeklyReminderLedgerAuthority(
            binding, source, store, profile_fd, data_fd, ledger_fd, lock_fd
        )
        os.close(customers_fd)
        os.close(customer_fd)
        opened.clear()
        return authority
    except (OSError, WeeklyOperationsConflict) as error:
        for descriptor in reversed(opened):
            os.close(descriptor)
        raise WeeklyOperationsConflict(
            "registered weekly reminder ledger open failed"
        ) from error
