use crate::event::context::StageType;
use chrono::{DateTime, Utc};
use serde::{Deserialize, Serialize};
use std::collections::{BTreeMap, HashMap};
use std::path::PathBuf;
pub const RUN_MANIFEST_FILENAME: &str = "run_manifest.json";
pub const JOURNAL_SCHEMA_VERSION: &str = "5.0";
pub const EFFECT_ATTEMPT_HISTORY_CAPABILITY: &str = "effect_attempt_history";
pub const BOUNDED_DIRECT_FACT_ADMISSION_CAPABILITY: &str = "bounded_direct_fact_admission";
pub const EFFECT_BINDING_DESCRIPTOR_CAPABILITY: &str = "effect_binding_descriptor";
pub const OBSERVABILITY_CAPTURE_CAPABILITY: &str = "observability_capture";
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct RunManifest {
pub journal_schema_version: String,
pub obzenflow_version: String,
pub flow_id: String,
pub flow_name: String,
pub created_at: DateTime<Utc>,
#[serde(skip_serializing_if = "Option::is_none")]
pub replay: Option<RunManifestReplayConfig>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub resume: Option<RunManifestResumeConfig>,
pub stages: HashMap<String, RunManifestStage>,
pub system_journal_file: String,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub effective_config: Option<crate::config::EffectiveConfigEvidence>,
#[serde(default, skip_serializing_if = "BTreeMap::is_empty")]
pub capabilities: BTreeMap<String, u32>,
#[serde(default, skip_serializing_if = "Vec::is_empty")]
pub bounded_direct_fact_admission: Vec<RunManifestDirectFactAdmission>,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq, PartialOrd, Ord)]
pub struct RunManifestDirectFactAdmission {
pub stage_key: String,
pub input_event_type: String,
pub max_live_data_rows: u64,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct RunManifestReplayConfig {
pub replay_from: String,
pub allow_incomplete_archive: bool,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct RunManifestResumeConfig {
pub resumed_from: PathBuf,
pub resume_generation: u64,
#[serde(default, skip_serializing_if = "BTreeMap::is_empty")]
pub high_water_by_stage: BTreeMap<String, u64>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct RunManifestStage {
pub dsl_var: String,
pub stage_type: StageType,
pub stage_id: String,
pub stage_logic_version: String,
pub data_journal_file: String,
pub error_journal_file: String,
pub inbound: Vec<String>,
pub ordered_delivery: bool,
}