use serde::{Deserialize, Serialize};
use uuid::Uuid;
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct UserEvent {
pub event_id: Uuid,
pub mall_id: String,
pub user_id: String,
pub event_time: i64,
pub ingestion_time: i64,
pub source: DataSource,
pub global_id: String,
pub event_type: EventType,
pub ip: Option<String>,
pub user_agent: Option<String>,
pub device_type: Option<DeviceType>,
pub os: Option<String>,
pub browser: Option<String>,
pub session_id: Option<String>,
pub location_country: Option<String>,
pub location_province: Option<String>,
pub location_city: Option<String>,
pub location_latitude: Option<f64>,
pub location_longitude: Option<f64>,
pub quality_score: f32,
pub validation_errors: Vec<String>,
pub no: Option<String>,
pub product_name: Option<String>,
pub order_time: Option<i64>,
pub play_date: Option<i64>,
pub start_date: Option<i64>,
pub end_date: Option<i64>,
pub payment_time: Option<i64>,
pub cancellation_time: Option<i64>,
pub order_status: Option<String>,
pub quantity: Option<u32>,
pub cancellation_quantity: Option<u32>,
pub unit_price: Option<f64>,
pub total_price: Option<f64>,
pub purchase_price: Option<f64>,
pub purchaser_name: Option<String>,
pub purchaser_phone: Option<String>,
pub purchaser_id_card: Option<String>,
pub distributor_name: Option<String>,
pub distributor_group: Option<String>,
pub supplier_name: Option<String>,
pub payment_method: Option<String>,
pub room_type: Option<String>,
pub room_number: Option<String>,
pub order_type: Option<String>,
pub booking_type: Option<String>,
pub order_source: Option<String>,
pub booking_time: Option<i64>,
pub check_in_date: Option<i64>,
pub check_out_date: Option<i64>,
pub room_count: Option<u32>,
pub guest_count: Option<u32>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub enum DataSource {
TicketOrderCsv { path: String },
HomestayOrderExcel { path: String, sheet: String },
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub enum EventType {
TicketOrderPlaced,
AccommodationOrderPlaced,
Custom(String),
}
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
pub struct EventContext {
pub ip: Option<String>,
pub user_agent: Option<String>,
pub device_type: Option<DeviceType>,
pub os: Option<String>,
pub browser: Option<String>,
pub location: Option<GeoLocation>,
pub session_id: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub enum DeviceType {
Mobile,
Desktop,
Tablet,
Unknown,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct GeoLocation {
pub country: Option<String>,
pub province: Option<String>,
pub city: Option<String>,
pub latitude: Option<f64>,
pub longitude: Option<f64>,
}