use arika::epoch::{Epoch, Utc};
use arika::frame::Vec3;
use tobari::magnetic::{MagneticFieldInput, MagneticFieldModel};
use crate::environment::EarthFrameBridge;
pub fn field_inertial<F: EarthFrameBridge>(
model: &dyn MagneticFieldModel,
position: &Vec3<F>,
epoch: &Epoch<Utc>,
eop: &F::EopStorage,
) -> Vec3<F> {
let geodetic = F::to_geodetic(position, epoch, eop);
let rot_to_eci = F::fixed_to_inertial(epoch, eop);
let b_ecef_arr = model.field_ecef(&MagneticFieldInput {
geodetic,
utc: epoch,
});
let b_ecef = Vec3::<F::Fixed>::new(b_ecef_arr[0], b_ecef_arr[1], b_ecef_arr[2]);
rot_to_eci.transform(&b_ecef)
}
pub fn field_eci(
model: &dyn MagneticFieldModel,
position_eci: &Vec3<arika::frame::SimpleEci>,
epoch: &Epoch<Utc>,
) -> Vec3<arika::frame::SimpleEci> {
field_inertial::<arika::frame::SimpleEci>(model, position_eci, epoch, &())
}