use serde::{Deserialize, Serialize};
use std::collections::HashMap;
use std::time::SystemTime;
use super::config::ExportDestination;
pub struct ReportGenerator {
report_templates: HashMap<String, ReportTemplate>,
export_handlers: HashMap<ExportDestination, Box<dyn ExportHandler + Send + Sync>>,
visualization_engine: VisualizationEngine,
}
pub trait ExportHandler {
fn export(&self, report: &GeneratedReport) -> Result<String, String>;
}
#[derive(Debug, Clone)]
pub struct ReportTemplate {
pub template_id: String,
pub template_name: String,
pub sections: Vec<ReportSection>,
pub styling: ReportStyling,
}
#[derive(Debug, Clone)]
pub struct ReportSection {
pub section_id: String,
pub title: String,
pub content_type: SectionContentType,
pub data_queries: Vec<DataQuery>,
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub enum SectionContentType {
Text,
Table,
Chart,
Statistical,
Comparison,
Custom(String),
}
#[derive(Debug, Clone)]
pub struct DataQuery {
pub query_id: String,
pub query_type: QueryType,
pub filters: HashMap<String, String>,
pub aggregations: Vec<String>,
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub enum QueryType {
PerformanceMetrics,
CostAnalysis,
TrendAnalysis,
Comparison,
Statistical,
}
#[derive(Debug, Clone)]
pub struct ReportStyling {
pub theme: String,
pub color_scheme: Vec<String>,
pub font_family: String,
pub custom_css: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct GeneratedReport {
pub report_id: String,
pub report_type: String,
pub generation_time: SystemTime,
pub content: ReportContent,
pub metadata: ReportMetadata,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ReportContent {
pub sections: Vec<ReportSectionContent>,
pub attachments: Vec<ReportAttachment>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ReportSectionContent {
pub section_id: String,
pub title: String,
pub content: String,
pub visualizations: Vec<VisualizationData>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ReportAttachment {
pub attachment_id: String,
pub filename: String,
pub content_type: String,
pub data: Vec<u8>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ReportMetadata {
pub report_id: String,
pub title: String,
pub description: String,
pub author: String,
pub keywords: Vec<String>,
pub data_sources: Vec<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct VisualizationData {
pub visualization_id: String,
pub visualization_type: String,
pub data: Vec<u8>,
pub format: String,
}
#[derive(Debug, Clone)]
pub struct VisualizationEngine {
pub chart_library: String,
pub default_width: u32,
pub default_height: u32,
pub color_palette: Vec<String>,
pub font_size: f32,
pub marker_size: f32,
}
impl Default for ReportGenerator {
fn default() -> Self {
Self::new()
}
}
impl ReportGenerator {
pub fn new() -> Self {
Self {
report_templates: HashMap::new(),
export_handlers: HashMap::new(),
visualization_engine: VisualizationEngine {
chart_library: "plotters".to_string(),
default_width: 800,
default_height: 600,
color_palette: vec![
"#1f77b4".to_string(),
"#ff7f0e".to_string(),
"#2ca02c".to_string(),
"#d62728".to_string(),
],
font_size: 12.0,
marker_size: 5.0,
},
}
}
}