use std::f64::consts::TAU;
use crate::errors::RocheError;
use crate::{Vec3, Star};
use crate::{ref_sphere, sphere_eclipse, set_earth, pot_min, fblink};
use pyo3::prelude::*;
pub fn ingress_egress(q: f64, star: Star, spin: f64, ffac: f64, iangle: f64, delta: f64, r: &Vec3, ingress: &mut f64, egress: &mut f64) -> Result<bool, RocheError> {
let rref: f64;
let pref: f64;
(rref, pref) = ref_sphere(q, star, spin, ffac)?;
let ri: f64 = iangle.to_radians();
let (sini, cosi) = ri.sin_cos();
let cofm: Vec3 = match star {
Star::Primary => Vec3::cofm1(),
Star::Secondary => Vec3::cofm2(),
};
let mut phi1: f64 = 0.0;
let mut phi2: f64 = 0.0;
let mut lam1: f64 = 0.0;
let mut lam2: f64 = 0.0;
let mut phi: f64 = 0.0;
let mut lam: f64 = 0.0;
if sphere_eclipse(cosi, sini, r, &cofm, rref, &mut phi1, &mut phi2, &mut lam1, &mut lam2) {
let acc: f64 = 2.*(2.0*TAU*(lam2 - lam1)*delta).sqrt();
if pot_min(q, star, spin, cosi, sini, r, phi1, phi2, lam1, lam2, rref, pref, acc, &mut phi, &mut lam)? {
let mut pin: f64 = phi;
let mut pout: f64 = phi1;
let mut pmid: f64;
while (pin - pout).abs() > delta {
pmid = (pin + pout)/2.0;
if fblink(q, star, spin, ffac, acc, &set_earth(cosi, sini, pmid), r).unwrap() {
pin = pmid;
} else {
pout = pmid;
}
}
*ingress = (pin+pout)/2.0;
*ingress = *ingress - ingress.floor();
pin = phi;
pout = phi2;
while (pin-pout).abs() > delta {
pmid = (pin+pout)/2.;
if fblink(q, star, spin, ffac, acc, &set_earth(cosi, sini, pmid), r).unwrap() {
pin = pmid;
} else {
pout = pmid;
}
}
*egress = (pin+pout)/2.0;
*egress = *egress - egress.floor();
if *egress < *ingress {
*egress += 1.0;
}
return Ok(true);
} else {
return Ok(false);
}
} else {
return Ok(false);
}
}
#[pyfunction]
#[pyo3(name = "ingress_egress")]
pub fn ingress_egress_wrapper(q: f64, star: Star, spin: f64, ffac: f64, iangle: f64, delta: f64, r: &Vec3) -> Result<(bool, f64, f64), RocheError> {
let mut ingress: f64 = 0.0;
let mut egress: f64 = 0.0;
let eclipsed: bool = ingress_egress(q, star, spin, ffac, iangle, delta, r, &mut ingress, &mut egress)?;
Ok((eclipsed, ingress, egress))
}