use crate::services::schedule::domain::Schedule;
use async_trait::async_trait;
use chrono::{DateTime, Utc};
use thiserror::Error;
use uuid::Uuid;
pub mod domain;
pub mod service_impl;
pub use service_impl::ScheduleServiceImpl;
#[derive(Error, Debug)]
pub enum ScheduleError {
#[error("Schedule not found: {0}")]
ScheduleNotFound(Uuid),
#[error("Invalid cron expression: {0}")]
InvalidCronExpression(String),
#[error("Storage error: {0}")]
Storage(String),
#[error("Invalid schedule ID: {0}")]
InvalidScheduleId(String),
}
pub type Result<T> = std::result::Result<T, ScheduleError>;
#[async_trait]
pub trait ScheduleService: Send + Sync {
async fn create_schedule(
&self,
agent_id: String,
cron_expression: String,
action: String,
) -> Result<Schedule>;
async fn get_schedule(&self, id: Uuid) -> Result<Schedule>;
async fn list_schedules_by_agent(&self, agent_id: &str) -> Result<Vec<Schedule>>;
async fn update_schedule(
&self,
id: Uuid,
cron_expression: Option<String>,
action: Option<String>,
) -> Result<Schedule>;
async fn delete_schedule(&self, id: Uuid) -> Result<()>;
async fn toggle_schedule(&self, id: Uuid) -> Result<Schedule>;
async fn check_and_fire_schedules(
&self,
agent_id: &str,
current_time: DateTime<Utc>,
) -> Result<Vec<String>>;
fn get_next_run(&self, schedule: &Schedule, current_time: DateTime<Utc>) -> Option<DateTime<Utc>>;
}