use chrono::{DateTime, Utc};
use schemars::JsonSchema;
use serde::{Deserialize, Serialize};
use utoipa::ToSchema;
use uuid::Uuid;
#[derive(
Debug, Clone, Copy, PartialEq, Eq, Deserialize, Serialize, Default, ToSchema, JsonSchema,
)]
#[serde(rename_all = "lowercase")]
pub enum Bucket {
#[default]
Day,
Week,
Month,
None,
}
#[derive(Debug, Clone, Default, Serialize, Deserialize, ToSchema, JsonSchema)]
pub struct UsageTotals {
pub messages: i64,
pub input_tokens: i64,
pub output_tokens: i64,
pub cached_tokens: i64,
pub total_tokens: i64,
pub cost_usd: f64,
}
#[derive(Debug, Clone, Serialize, Deserialize, ToSchema, JsonSchema)]
pub struct UsageBucket {
pub ts: Option<String>,
pub messages: i64,
pub input_tokens: i64,
pub output_tokens: i64,
pub cached_tokens: i64,
pub total_tokens: i64,
pub cost_usd: f64,
}
#[derive(Debug, Clone, Serialize, Deserialize, ToSchema, JsonSchema)]
pub struct AppliedFilters {
pub user_id: Option<Uuid>,
pub bot_id: Option<Uuid>,
pub channel_id: Option<Uuid>,
pub thread_id: Option<String>,
pub agent_id: Option<String>,
pub since: String,
pub until: String,
pub bucket: Bucket,
}
#[derive(Debug, Clone, Serialize, Deserialize, ToSchema, JsonSchema)]
pub struct UsageStatsResponse {
pub totals: UsageTotals,
pub buckets: Vec<UsageBucket>,
pub filters_applied: AppliedFilters,
}
#[derive(Debug, Clone, Deserialize, ToSchema, JsonSchema)]
pub struct UsageStatsQuery {
pub user_id: Option<Uuid>,
pub bot_id: Option<Uuid>,
pub channel_id: Option<Uuid>,
pub thread_id: Option<String>,
pub agent_id: Option<String>,
pub since: Option<DateTime<Utc>>,
pub until: Option<DateTime<Utc>>,
pub bucket: Option<Bucket>,
}