from __future__ import annotations

from dataclasses import dataclass

@dataclass
class Approval:
    artifact_version: int
    action_digest: str
    status: str = "PENDING"

    def decide(self, decision: str) -> None:
        if self.status != "PENDING":
            raise ValueError("decision already finalized")
        if decision not in {"APPROVED", "REJECTED"}:
            raise ValueError("invalid decision")
        self.status = decision

    def consume(self, artifact_version: int, action_digest: str) -> None:
        if self.status != "APPROVED":
            raise ValueError("not approved")
        if artifact_version != self.artifact_version:
            raise ValueError("artifact version changed")
        if action_digest != self.action_digest:
            raise ValueError("action changed")
        self.status = "CONSUMED"

a = Approval(artifact_version=7, action_digest="hash-A")
a.decide("APPROVED")
try:
    a.consume(8, "hash-A")
    raise AssertionError("version drift must be rejected")
except ValueError:
    pass
assert a.status == "APPROVED"
a.consume(7, "hash-A")
assert a.status == "CONSUMED"
try:
    a.consume(7, "hash-A")
    raise AssertionError("reuse must be rejected")
except ValueError:
    pass
print("local hitl checks passed")
