use crate::core::calculation::{
EquationOfTimePolicy, LeapMonthBoundary, NominalAgeBoundary, YearBoundary,
};
use crate::core::model::chart::{HoroscopeLunarDate, HoroscopeSolarDate};
use crate::core::model::ganzhi::{EarthlyBranch, StemBranch};
use serde::{Deserialize, Serialize};
#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)]
pub struct ChartCalculationDiagnosticSnapshot {
pub birth_time: BirthTimeResolutionSnapshot,
pub year_boundary: YearBoundaryDiagnosticSnapshot,
pub leap_month_boundary: LeapMonthBoundaryDiagnosticSnapshot,
}
#[derive(Clone, Copy, Debug, Eq, PartialEq, Hash, Serialize, Deserialize)]
#[serde(rename_all = "snake_case")]
pub enum BirthInputCalendarKind {
Solar,
Lunar,
}
#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)]
pub struct BirthTimeResolutionSnapshot {
pub input_calendar: BirthInputCalendarKind,
pub input_date: String,
pub input_clock_time: String,
pub timezone_offset_minutes: i32,
pub solar_time_policy: SolarTimePolicyDiagnostic,
pub longitude_degrees: Option<f64>,
pub longitude_correction_minutes: Option<f64>,
pub equation_of_time_minutes: Option<f64>,
pub total_adjustment_minutes: f64,
pub resolved_solar_date: Option<String>,
pub resolved_clock_time: String,
pub resolved_time_index: u8,
pub resolved_time_branch: EarthlyBranch,
}
#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)]
#[serde(rename_all = "snake_case")]
pub enum SolarTimePolicyDiagnostic {
ClockTime,
ApparentSolarTime {
longitude_degrees: f64,
equation_of_time: EquationOfTimePolicy,
},
}
#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)]
pub struct YearBoundaryDiagnosticSnapshot {
pub policy: YearBoundary,
pub effective_birth_year: StemBranch,
}
#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)]
pub struct LeapMonthBoundaryDiagnosticSnapshot {
pub policy: LeapMonthBoundary,
pub legacy_fix_leap: bool,
pub input_is_leap_month: bool,
}
#[derive(Clone, Debug, Eq, PartialEq, Serialize, Deserialize)]
pub struct HoroscopeCalculationDiagnosticSnapshot {
pub target_solar_date: HoroscopeSolarDate,
pub target_lunar_date: HoroscopeLunarDate,
pub nominal_age_boundary: NominalAgeBoundary,
pub resolved_nominal_age: u8,
}