"""No-follow descriptor parser for canonical customer authority files."""

from __future__ import annotations

import os
import stat
from dataclasses import dataclass
from typing import Literal

from .weekly_operations import (
    WeeklyOperationsAuthorityCompromise,
    WeeklyOperationsConflict,
)
from .weekly_operations_canonical_snapshot import (
    CanonicalDescriptorSet,
    CanonicalFilePin,
    CanonicalPinSet,
)
from .weekly_operations_customer_authority_identity import CanonicalCustomerNames


@dataclass(frozen=True, slots=True)
class OpenedCanonicalCustomerFiles:
    """Descriptor set and exact identity pins acquired together."""

    descriptors: CanonicalDescriptorSet
    pins: CanonicalPinSet


def _open_path(names: CanonicalCustomerNames) -> int:
    return os.open(
        names.root,
        os.O_RDONLY | os.O_DIRECTORY | os.O_NONBLOCK | os.O_NOFOLLOW | os.O_CLOEXEC,
    )


def _open_child(parent: int, name: str, kind: Literal["directory", "file"]) -> int:
    flags = os.O_RDONLY | os.O_NONBLOCK | os.O_NOFOLLOW | os.O_CLOEXEC
    if kind == "directory":
        flags |= os.O_DIRECTORY
    descriptor = os.open(name, flags, dir_fd=parent)
    info = os.fstat(descriptor)
    safe = stat.S_ISDIR(info.st_mode) if kind == "directory" else stat.S_ISREG(info.st_mode)
    if safe:
        return descriptor
    os.close(descriptor)
    raise WeeklyOperationsAuthorityCompromise(
        "canonical authority child is nonregular"
    )


def open_canonical_customer_files(
    names: CanonicalCustomerNames,
) -> OpenedCanonicalCustomerFiles:
    """Open every canonical child without following names or leaking partial sets."""
    opened: list[int] = []
    try:
        root = _open_path(names)
        opened.append(root)
        wizard = _open_child(root, names.wizard, "directory")
        opened.append(wizard)
        plans = _open_child(root, names.plans, "directory")
        opened.append(plans)
        events = _open_child(wizard, names.events, "file")
        opened.append(events)
        sequence = _open_child(plans, names.sequence, "file")
        opened.append(sequence)
        lock = _open_child(wizard, names.lock, "file")
        opened.append(lock)
        descriptors = CanonicalDescriptorSet(
            root, wizard, plans, events, sequence, lock
        )
        pins = CanonicalPinSet(
            CanonicalFilePin.from_descriptor(root, "directory"),
            CanonicalFilePin.from_descriptor(wizard, "directory"),
            CanonicalFilePin.from_descriptor(plans, "directory"),
            CanonicalFilePin.from_descriptor(events, "file"),
            CanonicalFilePin.from_descriptor(sequence, "file"),
            CanonicalFilePin.from_descriptor(lock, "file", invariant=True),
        )
        return OpenedCanonicalCustomerFiles(descriptors, pins)
    except WeeklyOperationsAuthorityCompromise:
        for descriptor in opened:
            os.close(descriptor)
        raise
    except (OSError, WeeklyOperationsConflict) as error:
        for descriptor in opened:
            os.close(descriptor)
        raise WeeklyOperationsConflict(
            "canonical descriptor acquisition failed"
        ) from error
