use chrono::{DateTime, Utc};
use serde::{Deserialize, Serialize};
use utoipa::ToSchema;
use uuid::Uuid;
#[derive(Debug, Clone, Serialize, Deserialize, ToSchema)]
pub struct CourseInstance {
#[serde(default = "Uuid::new_v4")]
pub id: Uuid,
pub course_id: Uuid,
#[serde(default)]
pub name: Option<String>,
#[serde(default)]
pub course_mode: Option<CourseMode>,
#[serde(default)]
pub status: CourseInstanceStatus,
#[serde(default)]
pub schedule: Option<Schedule>,
#[serde(default)]
pub in_language: Vec<String>,
#[serde(default)]
pub location: Option<String>,
#[serde(default)]
pub location_id: Option<Uuid>,
#[serde(default)]
pub instructor_ids: Vec<Uuid>,
#[serde(default)]
pub instructor_names: Vec<String>,
#[serde(default)]
pub maximum_attendee_capacity: Option<u32>,
#[serde(default)]
pub enrolled_count: Option<u32>,
#[serde(default)]
pub enrollment_opens: Option<DateTime<Utc>>,
#[serde(default)]
pub enrollment_closes: Option<DateTime<Utc>>,
#[serde(default = "Utc::now")]
pub created_at: DateTime<Utc>,
#[serde(default = "Utc::now")]
pub updated_at: DateTime<Utc>,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize, ToSchema)]
#[serde(rename_all = "snake_case")]
pub enum CourseMode {
Online,
Onsite,
Blended,
SelfPaced,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize, Default, ToSchema)]
#[serde(rename_all = "snake_case")]
pub enum CourseInstanceStatus {
#[default]
Scheduled,
EnrollmentOpen,
EnrollmentClosed,
InProgress,
Completed,
Cancelled,
}
#[derive(Debug, Clone, Serialize, Deserialize, ToSchema)]
pub struct Schedule {
#[serde(default)]
pub start_date: Option<DateTime<Utc>>,
#[serde(default)]
pub end_date: Option<DateTime<Utc>>,
#[serde(default)]
pub time_zone: Option<String>,
#[serde(default)]
pub recurrence: Option<String>,
#[serde(default)]
pub sessions: Vec<Session>,
}
#[derive(Debug, Clone, Serialize, Deserialize, ToSchema)]
pub struct Session {
pub start: DateTime<Utc>,
#[serde(default)]
pub end: Option<DateTime<Utc>>,
#[serde(default)]
pub label: Option<String>,
}