use serde::{Deserialize, Serialize};
use std::fmt;
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
pub enum PassType {
Exposure,
Reflection,
ReEncoding,
Application,
}
impl PassType {
pub fn display_name(&self) -> &'static str {
match self {
PassType::Exposure => "Exposure",
PassType::Reflection => "Reflection",
PassType::ReEncoding => "Re-Encoding",
PassType::Application => "Application",
}
}
pub fn order(&self) -> usize {
match self {
PassType::Exposure => 1,
PassType::Reflection => 2,
PassType::ReEncoding => 3,
PassType::Application => 4,
}
}
}
impl fmt::Display for PassType {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
write!(f, "{}", self.display_name())
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
pub enum FeedbackQuality {
Poor,
Fair,
Good,
Excellent,
}
impl FeedbackQuality {
pub fn score(&self) -> u8 {
match self {
FeedbackQuality::Poor => 0,
FeedbackQuality::Fair => 50,
FeedbackQuality::Good => 75,
FeedbackQuality::Excellent => 95,
}
}
pub fn display_name(&self) -> &'static str {
match self {
FeedbackQuality::Poor => "Poor",
FeedbackQuality::Fair => "Fair",
FeedbackQuality::Good => "Good",
FeedbackQuality::Excellent => "Excellent",
}
}
}
impl fmt::Display for FeedbackQuality {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
write!(f, "{}", self.display_name())
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
pub enum CompletionReason {
MaxIterations,
InsightThreshold,
DeltaThreshold,
Manual,
Archived,
}
impl CompletionReason {
pub fn display_name(&self) -> &'static str {
match self {
CompletionReason::MaxIterations => "Max Iterations",
CompletionReason::InsightThreshold => "Insight Threshold",
CompletionReason::DeltaThreshold => "Delta Threshold",
CompletionReason::Manual => "Manual",
CompletionReason::Archived => "Archived",
}
}
}
impl fmt::Display for CompletionReason {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
write!(f, "{}", self.display_name())
}
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct IterationStatus {
pub id: String,
pub event_id: String,
pub current_iteration: i32,
pub current_pass_type: Option<PassType>,
pub last_insight_score: Option<u8>,
pub last_insight_delta: Option<f64>,
pub is_complete: bool,
pub completion_reason: Option<CompletionReason>,
pub completed_at: Option<i64>,
pub created_at: i64,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct IterationInsight {
pub id: String,
pub event_id: String,
pub iteration_number: i32,
pub insight_score: u8,
pub insight_delta: f64,
pub feedback_quality: FeedbackQuality,
pub semantic_change: Option<String>,
pub created_at: i64,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct IterationFeedback {
pub id: String,
pub event_id: String,
pub iteration_number: i32,
pub hint: String,
pub user_response: Option<String>,
pub response_quality: FeedbackQuality,
pub response_time: Option<i32>,
pub created_at: i64,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct IterationStats {
pub id: String,
pub event_id: String,
pub total_iterations: i32,
pub total_passes: i32,
pub average_insight_score: Option<f64>,
pub max_insight_score: Option<u8>,
pub min_insight_score: Option<u8>,
pub total_improvement: Option<f64>,
pub avg_improvement: Option<f64>,
pub completion_time: Option<i64>,
pub created_at: i64,
pub updated_at: i64,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct IterationThreshold {
pub id: String,
pub event_id: String,
pub pass_type: PassType,
pub max_iterations: i32,
pub insight_threshold: u8,
pub delta_threshold: f64,
pub created_at: i64,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub struct IterationPass {
pub id: String,
pub event_id: String,
pub iteration_number: i32,
pub pass_type: PassType,
pub description: Option<String>,
pub created_at: i64,
}
#[derive(Debug, thiserror::Error)]
pub enum IterationError {
#[error("Event not found: {0}")]
EventNotFound(String),
#[error("Invalid iteration number: {0}")]
InvalidIterationNumber(String),
#[error("No active iteration cycle for event: {0}")]
NoActiveCycle(String),
#[error("Database error: {0}")]
Database(#[from] rusqlite::Error),
#[error("Invalid threshold configuration: {0}")]
InvalidThreshold(String),
}
pub type IterationResult<T> = Result<T, IterationError>;