"""Stable source-only registry identity for Todo2 authority tests."""

from __future__ import annotations

import hashlib
import json
import os
import stat
from datetime import datetime
from pathlib import Path

from gateway.platforms.nutrition_weekly_operations_authority import (
    WeeklyOperationsAuthorityReceipt,
    parse_weekly_operations_authority,
)
from gateway.platforms.nutrition_weekly_operations_registry_identity import (
    WeeklyOperationsRegistryIdentity,
    parse_weekly_operations_registry_identity,
)
from gateway.platforms.nutrition_weekly_operations_config import (
    JsonValue,
    WeeklyOperationsAuthorityError,
)


def test_registry_identity(
    *, inode: int = 1, content_digest: str = "c" * 64
) -> WeeklyOperationsRegistryIdentity:
    values: dict[str, str | int] = {
        "schema_version": "nutricoach-weekly-registry-identity-v1",
        "relative_name": "registry.json",
        "device": 1,
        "inode": inode,
        "mode": 0o600,
        "owner": os.geteuid(),
        "links": 1,
        "content_digest": content_digest,
    }
    encoded = json.dumps(values, sort_keys=True, separators=(",", ":")).encode()
    values["binding_digest"] = hashlib.sha256(encoded).hexdigest()
    return parse_weekly_operations_registry_identity(values)


def test_registry_identity_document(
    *, inode: int = 1, content_digest: str = "c" * 64
) -> dict[str, JsonValue]:
    identity = test_registry_identity(
        inode=inode, content_digest=content_digest
    )
    return {
        name: getattr(identity, name)
        for name in identity.__dataclass_fields__
    }



def registry_identity_to_document(
    identity: WeeklyOperationsRegistryIdentity,
) -> dict[str, JsonValue]:
    return {
        name: getattr(identity, name)
        for name in identity.__dataclass_fields__
    }

def test_registry_identity_binding_digest(*, inode: int = 1) -> str:
    return test_registry_identity(inode=inode).binding_digest


def registry_identity_from_file(
    profile_root: Path, relative_name: str
) -> WeeklyOperationsRegistryIdentity:
    """Test-only fixture minting from a disposable profile."""
    root_fd = os.open(
        profile_root,
        os.O_RDONLY | os.O_DIRECTORY | os.O_NOFOLLOW | os.O_CLOEXEC,
    )
    try:
        descriptor = os.open(
            relative_name,
            os.O_RDONLY | os.O_NONBLOCK | os.O_NOFOLLOW | os.O_CLOEXEC,
            dir_fd=root_fd,
        )
        try:
            info = os.fstat(descriptor)
            payload = os.pread(descriptor, info.st_size, 0)
            if (
                not stat.S_ISREG(info.st_mode)
                or stat.S_IMODE(info.st_mode) != 0o600
                or info.st_uid != os.geteuid()
                or info.st_nlink != 1
            ):
                raise WeeklyOperationsAuthorityError("unsafe disposable registry fixture")
            values: dict[str, str | int] = {
                "schema_version": "nutricoach-weekly-registry-identity-v1",
                "relative_name": relative_name,
                "device": info.st_dev,
                "inode": info.st_ino,
                "mode": stat.S_IMODE(info.st_mode),
                "owner": info.st_uid,
                "links": info.st_nlink,
                "content_digest": hashlib.sha256(payload).hexdigest(),
            }
            encoded = json.dumps(
                values, sort_keys=True, separators=(",", ":")
            ).encode()
            values["binding_digest"] = hashlib.sha256(encoded).hexdigest()
            return parse_weekly_operations_registry_identity(values)
        finally:
            os.close(descriptor)
    finally:
        os.close(root_fd)


def authority_receipt_fixture(
    candidate_digest: str,
    config_binding_digest: str,
    customer_keys: tuple[str, ...],
    owner: tuple[str, str, int],
    consent_digest: str,
    issued_at: datetime,
    expires_at: datetime,
    feature_epoch: str,
) -> WeeklyOperationsAuthorityReceipt:
    raw: dict[str, JsonValue] = {
        "schema": "nutricoach-weekly-operations-authority-v2",
        "candidate_digest": candidate_digest,
        "config_digest": config_binding_digest,
        "enabled_customer_keys": list(customer_keys),
        "owner": {
            "user_id": owner[0], "chat_id": owner[1], "version": owner[2]
        },
        "consent_digest": consent_digest,
        "registry_identity": test_registry_identity_document(),
        "issued_at": issued_at.isoformat(),
        "expires_at": expires_at.isoformat(),
        "feature_epoch": feature_epoch,
    }
    return parse_weekly_operations_authority(raw)
