use crate::core::LoanResult;
use chrono::{DateTime, Utc};
use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct CalculationRequest {
pub pinjaman: f64,
pub angsuran: f64,
pub sisa_tenor: u32,
#[serde(default)]
pub diskon: Option<f64>,
#[serde(default)]
pub pajak: Option<f64>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct CalculationResponse {
pub success: bool,
pub request_id: String,
pub timestamp: DateTime<Utc>,
pub data: CalculationData,
pub metadata: ResponseMetadata,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct CalculationData {
pub input: CalculationInputData,
pub calculations: CalculationComponentsData,
pub total_didapat: String,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct CalculationInputData {
pub pinjaman: String,
pub angsuran: String,
pub sisa_tenor: u32,
pub diskon: String,
pub pajak: String,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct CalculationComponentsData {
pub sisa_pokok: String,
pub asuransi: String,
pub pajak: String,
pub diskon: String,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ResponseMetadata {
pub calculation_time_ms: u128,
pub formula_used: String,
pub warnings: Vec<String>,
}
impl CalculationResponse {
pub fn from_result(result: LoanResult) -> Self {
Self {
success: true,
request_id: result.request_id,
timestamp: result.timestamp,
data: CalculationData {
input: CalculationInputData {
pinjaman: result.calculations.pinjaman.to_string(),
angsuran: result.calculations.angsuran.to_string(),
sisa_tenor: result.calculations.sisa_tenor,
diskon: result.calculations.diskon.to_string(),
pajak: result.calculations.pajak.to_string(),
},
calculations: CalculationComponentsData {
sisa_pokok: result.calculations.sisa_pokok.to_string(),
asuransi: result.calculations.asuransi.to_string(),
pajak: result.calculations.pajak.to_string(),
diskon: result.calculations.diskon.to_string(),
},
total_didapat: result.total_didapat.to_string(),
},
metadata: ResponseMetadata {
calculation_time_ms: result.metadata.calculation_time_ms,
formula_used: result.metadata.formula_used,
warnings: result.metadata.warnings,
},
}
}
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct HealthResponse {
pub status: String,
pub timestamp: String,
pub version: String,
}