use chrono::{DateTime, Utc};
use serde::{Deserialize, Serialize};
use tmf_apis_core::BaseEntity;
use utoipa::ToSchema;
use uuid::Uuid;
#[derive(Debug, Clone, Serialize, Deserialize, ToSchema)]
#[serde(rename_all = "SCREAMING_SNAKE_CASE")]
pub enum UsageState {
Captured,
Rated,
Billed,
Rejected,
}
#[derive(Debug, Clone, Serialize, Deserialize, ToSchema)]
pub struct Usage {
#[serde(flatten)]
pub base: BaseEntity,
pub state: UsageState,
#[serde(skip_serializing_if = "Option::is_none")]
pub usage_type: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
#[schema(value_type = String, format = "date-time")]
pub usage_date: Option<DateTime<Utc>>,
#[serde(skip_serializing_if = "Option::is_none")]
#[schema(value_type = String, format = "date-time")]
pub start_date: Option<DateTime<Utc>>,
#[serde(skip_serializing_if = "Option::is_none")]
#[schema(value_type = String, format = "date-time")]
pub end_date: Option<DateTime<Utc>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub amount: Option<f64>,
#[serde(skip_serializing_if = "Option::is_none")]
pub unit: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub product_offering: Option<ProductOfferingRef>,
#[serde(skip_serializing_if = "Option::is_none")]
pub related_party: Option<Vec<RelatedParty>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub rating: Option<RatingRef>,
}
#[derive(Debug, Clone, Serialize, Deserialize, ToSchema)]
pub struct ProductOfferingRef {
#[schema(value_type = String, format = "uuid")]
pub id: Uuid,
#[serde(skip_serializing_if = "Option::is_none")]
pub href: Option<String>,
pub name: String,
}
#[derive(Debug, Clone, Serialize, Deserialize, ToSchema)]
pub struct RatingRef {
#[schema(value_type = String, format = "uuid")]
pub id: Uuid,
#[serde(skip_serializing_if = "Option::is_none")]
pub href: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub rating_amount: Option<f64>,
}
#[derive(Debug, Clone, Serialize, Deserialize, ToSchema)]
pub struct RelatedParty {
#[schema(value_type = String, format = "uuid")]
pub id: Uuid,
#[serde(skip_serializing_if = "Option::is_none")]
pub href: Option<String>,
pub name: String,
pub role: String,
}
#[derive(Debug, Clone, Serialize, Deserialize, ToSchema)]
pub struct CreateUsageRequest {
pub name: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub description: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub version: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub usage_type: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
#[schema(value_type = String, format = "date-time")]
pub usage_date: Option<DateTime<Utc>>,
#[serde(skip_serializing_if = "Option::is_none")]
#[schema(value_type = String, format = "date-time")]
pub start_date: Option<DateTime<Utc>>,
#[serde(skip_serializing_if = "Option::is_none")]
#[schema(value_type = String, format = "date-time")]
pub end_date: Option<DateTime<Utc>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub amount: Option<f64>,
#[serde(skip_serializing_if = "Option::is_none")]
pub unit: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
#[schema(value_type = String, format = "uuid")]
pub product_offering_id: Option<Uuid>,
#[serde(skip_serializing_if = "Option::is_none")]
pub related_party: Option<Vec<CreateRelatedPartyRequest>>,
#[serde(skip_serializing_if = "Option::is_none")]
#[schema(value_type = String, format = "uuid")]
pub rating_id: Option<Uuid>,
}
#[derive(Debug, Clone, Serialize, Deserialize, ToSchema)]
pub struct CreateRelatedPartyRequest {
pub name: String,
pub role: String,
}