use serde::{Deserialize, Serialize};
use std::collections::HashMap;
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct MockSnapshot {
pub id: String,
pub timestamp: i64,
pub environment_id: Option<String>,
pub persona_id: Option<String>,
pub scenario_id: Option<String>,
pub reality_level: Option<f64>,
pub mocks: Vec<MockSnapshotItem>,
pub metadata: HashMap<String, serde_json::Value>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct MockSnapshotItem {
pub id: String,
pub method: String,
pub path: String,
pub status_code: u16,
pub response_body: serde_json::Value,
pub response_headers: Option<HashMap<String, String>>,
pub config: serde_json::Value,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct SnapshotDiff {
pub left: MockSnapshot,
pub right: MockSnapshot,
pub differences: Vec<Difference>,
pub summary: DiffSummary,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Difference {
pub diff_type: DifferenceType,
pub mock_id: Option<String>,
pub path: String,
pub method: String,
pub description: String,
pub left_value: Option<serde_json::Value>,
pub right_value: Option<serde_json::Value>,
pub field_path: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(rename_all = "snake_case")]
pub enum DifferenceType {
MissingInRight,
MissingInLeft,
StatusCodeMismatch,
BodyMismatch,
HeadersMismatch,
ConfigMismatch,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct DiffSummary {
pub left_total: usize,
pub right_total: usize,
pub differences_count: usize,
pub only_in_left: usize,
pub only_in_right: usize,
pub mocks_with_differences: usize,
}
#[derive(Debug, Deserialize)]
pub struct CreateSnapshotRequest {
pub environment_id: Option<String>,
pub persona_id: Option<String>,
pub scenario_id: Option<String>,
pub reality_level: Option<f64>,
#[serde(default)]
pub metadata: HashMap<String, serde_json::Value>,
}
#[derive(Debug, Deserialize)]
pub struct CompareSnapshotsRequest {
pub left_snapshot_id: Option<String>,
pub right_snapshot_id: Option<String>,
pub left_environment_id: Option<String>,
pub right_environment_id: Option<String>,
pub left_persona_id: Option<String>,
pub right_persona_id: Option<String>,
pub left_scenario_id: Option<String>,
pub right_scenario_id: Option<String>,
pub left_reality_level: Option<f64>,
pub right_reality_level: Option<f64>,
}