use crate::cal::{cal2jd, jd2cal};
use crate::consts::DAYSEC;
use crate::ts::dat;
pub fn ut1utc(ut11: f64, ut12: f64, dut1: f64) -> Result<(f64, f64), i32> {
let mut duts = dut1;
let (u1, u2);
if ut11.abs() >= ut12.abs() {
u1 = ut11;
u2 = ut12;
} else {
u1 = ut12;
u2 = ut11;
}
let d1 = u1;
let mut dats1 = 0.0;
for i in -1..=3 {
let d2 = u2 + (i as f64);
let (iy, im, id, _) = match jd2cal(d1, d2) {
Ok(v) => v,
Err(_) => return Err(-1),
};
let dats2 = match dat(iy, im, id, 0.0) {
Ok(v) => v,
Err(_) => return Err(-1),
};
if i == -1 {
dats1 = dats2;
}
let ddats = dats2 - dats1;
if ddats.abs() >= 0.5 {
if ddats * duts >= 0.0 {
duts -= ddats;
}
let (us1, us2_base) = match cal2jd(iy, im, id) {
Ok(v) => v,
Err(_) => return Err(-1),
};
let us2 = us2_base - 1.0 + duts / DAYSEC;
let mut du = u1 - us1;
du += u2 - us2;
if du > 0.0 {
let fd = du * DAYSEC / (DAYSEC + ddats);
duts += ddats * if fd <= 1.0 { fd } else { 1.0 };
}
break;
}
dats1 = dats2;
}
let v2 = u2 - duts / DAYSEC;
if ut11.abs() >= ut12.abs() {
Ok((u1, v2))
} else {
Ok((v2, u1))
}
}