///|
pub(all) enum CampaignStage {
  Brief
  RightsCleared
  Generated
  SafetyReviewed
  HumanApproved
  Packaged
  Published
} derive(Debug, Eq, ToJson, FromJson)

///|
pub(all) struct DeliveryGate {
  rights_cleared : Bool
  safety_passed : Bool
  human_approved : Bool
  provenance_complete : Bool
} derive(Debug, Eq, ToJson, FromJson)

///|
pub fn delivery_ready(gate : DeliveryGate) -> Bool {
  gate.rights_cleared &&
  gate.safety_passed &&
  gate.human_approved &&
  gate.provenance_complete
}

///|
pub fn publication_ready(stage : CampaignStage, gate : DeliveryGate) -> Bool {
  (stage == Packaged || stage == Published) && delivery_ready(gate)
}