use serde::{Deserialize, Serialize};
use crate::entities::{Council, CouncilSnapshotProvenance, Deliberation, Statistics};
use crate::events::{
DeliberationCompletedEvent, PhaseChangedEvent, TaskCompletedEvent, TaskDispatchedEvent,
TaskFailedEvent,
};
use crate::ports::AgentDescriptor;
use crate::value_objects::{AgentId, EventId, OutputContract, OutputContractId, Specialty};
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
#[serde(tag = "kind", content = "fact", rename_all = "snake_case")]
pub enum CouncilJournalEvent {
SnapshotImported(CouncilSnapshotProvenance),
CouncilRegistered(Council),
CouncilReplaced(Council),
CouncilDeleted(Specialty),
AgentRegistered(AgentDescriptor),
AgentUnregistered(AgentId),
ContractRegistered(OutputContract),
ContractDeleted(OutputContractId),
DeliberationSnapshotSaved(Deliberation),
StatisticsRecorded(Statistics),
TaskDispatched(TaskDispatchedEvent),
TaskCompleted(TaskCompletedEvent),
TaskFailed(TaskFailedEvent),
DeliberationCompleted(DeliberationCompletedEvent),
PhaseChanged(PhaseChangedEvent),
}
impl CouncilJournalEvent {
#[must_use]
pub fn publication_id(&self) -> Option<&EventId> {
match self {
Self::TaskDispatched(event) => Some(event.envelope().event_id()),
Self::TaskCompleted(event) => Some(event.envelope().event_id()),
Self::TaskFailed(event) => Some(event.envelope().event_id()),
Self::DeliberationCompleted(event) => Some(event.envelope().event_id()),
Self::PhaseChanged(event) => Some(event.envelope().event_id()),
_ => None,
}
}
}