agent-supplements-rec 0.1.0

Curated supplement recommendation engine for longevity biomarker optimization
use serde::{Deserialize, Serialize};

// --- labassess input contract (what we consume) ---
// Fields may appear unused but are required for deserialization of the full contract.

#[derive(Debug, Clone, Deserialize)]
#[allow(dead_code)]
pub struct LabassessOutput {
    pub version: String,
    pub status: String,
    pub data: LabassessData,
}

#[derive(Debug, Clone, Deserialize)]
#[allow(dead_code)]
pub struct LabassessData {
    pub mode: String,
    pub patient: PatientInfo,
    pub scored_biomarkers: Vec<ScoredBiomarker>,
    #[serde(default)]
    pub derived_values: Vec<DerivedValue>,
    #[serde(default)]
    pub patterns_detected: Vec<PatternDetected>,
    #[serde(default)]
    pub red_flags: Vec<RedFlag>,
    pub summary: Summary,
}

#[derive(Debug, Clone, Deserialize, Serialize)]
pub struct PatientInfo {
    pub sex: Option<String>,
    pub age: Option<u8>,
}

#[derive(Debug, Clone, Deserialize)]
#[allow(dead_code)]
pub struct ScoredBiomarker {
    pub name: String,
    pub standardized_name: String,
    pub value: f64,
    pub unit: String,
    pub status: String,
    pub severity: String,
}

#[derive(Debug, Clone, Deserialize)]
#[allow(dead_code)]
pub struct DerivedValue {
    pub name: String,
    pub value: f64,
    pub status: String,
}

#[derive(Debug, Clone, Deserialize)]
#[allow(dead_code)]
pub struct PatternDetected {
    pub name: String,
    pub confidence: String,
    #[serde(default)]
    pub criteria_met: Vec<String>,
    pub action: String,
}

#[derive(Debug, Clone, Deserialize)]
#[allow(dead_code)]
pub struct RedFlag {
    pub marker: String,
    pub value: f64,
    pub unit: String,
    pub urgency: String,
    pub action: String,
    pub referral: String,
}

#[derive(Debug, Clone, Deserialize, Serialize)]
pub struct Summary {
    pub total_markers: usize,
    pub scored: usize,
    pub unknown: usize,
    pub optimal: usize,
    pub good: usize,
    pub attention: usize,
    pub marginal: usize,
    pub concern: usize,
}

// --- Catalog types (TOML) ---

#[derive(Debug, Clone, Deserialize)]
pub struct CatalogFile {
    #[serde(default)]
    pub product: Vec<Product>,
    #[serde(default)]
    pub brand: Vec<Brand>,
    #[serde(default)]
    pub interaction: Vec<Interaction>,
}

#[derive(Debug, Clone, Deserialize, Serialize)]
pub struct Product {
    pub id: String,
    pub name: String,
    pub brand_id: String,
    pub category: String,
    pub form: String,
    pub dosage: String,
    pub unit: String,
    pub frequency: String,
    #[serde(default)]
    pub description: String,
    #[serde(default)]
    pub targets: Vec<BiomarkerTarget>,
    #[serde(default)]
    pub contraindications: Vec<String>,
    #[serde(default)]
    pub notes: String,
}

#[derive(Debug, Clone, Deserialize, Serialize)]
pub struct BiomarkerTarget {
    pub biomarker: String,
    pub direction: String,
    pub evidence: String,
    #[serde(default)]
    pub mechanism: String,
}

#[derive(Debug, Clone, Deserialize, Serialize)]
pub struct Brand {
    pub id: String,
    pub name: String,
    pub website: String,
    pub country: String,
    pub verified: bool,
}

#[derive(Debug, Clone, Deserialize, Serialize)]
pub struct Interaction {
    pub product_a: String,
    pub product_b: String,
    pub severity: String,
    pub description: String,
}

// --- Output types ---

#[derive(Debug, Clone, Serialize)]
pub struct Recommendation {
    pub priority: String,
    pub product: Product,
    pub rationale: String,
    pub target_biomarkers: Vec<TargetedBiomarker>,
    pub evidence_level: String,
    pub score: f64,
}

#[derive(Debug, Clone, Serialize)]
pub struct TargetedBiomarker {
    pub biomarker: String,
    pub current_value: f64,
    pub current_unit: String,
    pub current_status: String,
    pub expected_direction: String,
}

#[derive(Debug, Clone, Serialize)]
pub struct RecommendOutput {
    pub patient: PatientInfo,
    pub assessment_summary: Summary,
    pub recommendations: Vec<Recommendation>,
    pub interaction_warnings: Vec<InteractionWarning>,
    pub total_recommendations: usize,
}

#[derive(Debug, Clone, Serialize)]
pub struct InteractionWarning {
    pub products: Vec<String>,
    pub severity: String,
    pub description: String,
}