use crate::consts::{DAS2R, DJ00, DJC};
use crate::fundargs::{fad03, fae03, faf03, fal03, falp03, faom03, fapa03, fave03};
pub fn eect00(date1: f64, date2: f64) -> f64 {
let t: f64;
let mut a: f64;
let mut s0: f64;
let mut s1: f64;
let mut fa = [0.0; 8];
let eect: f64;
struct Term {
nfa: [i32; 8],
s: f64,
c: f64,
}
const E0: [Term; 33] = [
Term {
nfa: [0, 0, 0, 0, 1, 0, 0, 0],
s: 2640.96e-6,
c: -0.39e-6,
},
Term {
nfa: [0, 0, 0, 0, 2, 0, 0, 0],
s: 63.52e-6,
c: -0.02e-6,
},
Term {
nfa: [0, 0, 2, -2, 3, 0, 0, 0],
s: 11.75e-6,
c: 0.01e-6,
},
Term {
nfa: [0, 0, 2, -2, 1, 0, 0, 0],
s: 11.21e-6,
c: 0.01e-6,
},
Term {
nfa: [0, 0, 2, -2, 2, 0, 0, 0],
s: -4.55e-6,
c: 0.00e-6,
},
Term {
nfa: [0, 0, 2, 0, 3, 0, 0, 0],
s: 2.02e-6,
c: 0.00e-6,
},
Term {
nfa: [0, 0, 2, 0, 1, 0, 0, 0],
s: 1.98e-6,
c: 0.00e-6,
},
Term {
nfa: [0, 0, 0, 0, 3, 0, 0, 0],
s: -1.72e-6,
c: 0.00e-6,
},
Term {
nfa: [0, 1, 0, 0, 1, 0, 0, 0],
s: -1.41e-6,
c: -0.01e-6,
},
Term {
nfa: [0, 1, 0, 0, -1, 0, 0, 0],
s: -1.26e-6,
c: -0.01e-6,
},
Term {
nfa: [1, 0, 0, 0, -1, 0, 0, 0],
s: -0.63e-6,
c: 0.00e-6,
},
Term {
nfa: [1, 0, 0, 0, 1, 0, 0, 0],
s: -0.63e-6,
c: 0.00e-6,
},
Term {
nfa: [0, 1, 2, -2, 3, 0, 0, 0],
s: 0.46e-6,
c: 0.00e-6,
},
Term {
nfa: [0, 1, 2, -2, 1, 0, 0, 0],
s: 0.45e-6,
c: 0.00e-6,
},
Term {
nfa: [0, 0, 4, -4, 4, 0, 0, 0],
s: 0.36e-6,
c: 0.00e-6,
},
Term {
nfa: [0, 0, 1, -1, 1, -8, 12, 0],
s: -0.24e-6,
c: -0.12e-6,
},
Term {
nfa: [0, 0, 2, 0, 0, 0, 0, 0],
s: 0.32e-6,
c: 0.00e-6,
},
Term {
nfa: [0, 0, 2, 0, 2, 0, 0, 0],
s: 0.28e-6,
c: 0.00e-6,
},
Term {
nfa: [1, 0, 2, 0, 3, 0, 0, 0],
s: 0.27e-6,
c: 0.00e-6,
},
Term {
nfa: [1, 0, 2, 0, 1, 0, 0, 0],
s: 0.26e-6,
c: 0.00e-6,
},
Term {
nfa: [0, 0, 2, -2, 0, 0, 0, 0],
s: -0.21e-6,
c: 0.00e-6,
},
Term {
nfa: [0, 1, -2, 2, -3, 0, 0, 0],
s: 0.19e-6,
c: 0.00e-6,
},
Term {
nfa: [0, 1, -2, 2, -1, 0, 0, 0],
s: 0.18e-6,
c: 0.00e-6,
},
Term {
nfa: [0, 0, 0, 0, 0, 8, -13, -1],
s: -0.10e-6,
c: 0.05e-6,
},
Term {
nfa: [0, 0, 0, 2, 0, 0, 0, 0],
s: 0.15e-6,
c: 0.00e-6,
},
Term {
nfa: [2, 0, -2, 0, -1, 0, 0, 0],
s: -0.14e-6,
c: 0.00e-6,
},
Term {
nfa: [1, 0, 0, -2, 1, 0, 0, 0],
s: 0.14e-6,
c: 0.00e-6,
},
Term {
nfa: [0, 1, 2, -2, 2, 0, 0, 0],
s: -0.14e-6,
c: 0.00e-6,
},
Term {
nfa: [1, 0, 0, -2, -1, 0, 0, 0],
s: 0.14e-6,
c: 0.00e-6,
},
Term {
nfa: [0, 0, 4, -2, 4, 0, 0, 0],
s: 0.13e-6,
c: 0.00e-6,
},
Term {
nfa: [0, 0, 2, -2, 4, 0, 0, 0],
s: -0.11e-6,
c: 0.00e-6,
},
Term {
nfa: [1, 0, -2, 0, -3, 0, 0, 0],
s: 0.11e-6,
c: 0.00e-6,
},
Term {
nfa: [1, 0, -2, 0, -1, 0, 0, 0],
s: 0.11e-6,
c: 0.00e-6,
},
];
const E1: [Term; 1] = [Term {
nfa: [0, 0, 0, 0, 1, 0, 0, 0],
s: -0.87e-6,
c: 0.00e-6,
}];
const NE0: usize = E0.len();
const NE1: usize = E1.len();
t = ((date1 - DJ00) + date2) / DJC;
fa[0] = fal03(t);
fa[1] = falp03(t);
fa[2] = faf03(t);
fa[3] = fad03(t);
fa[4] = faom03(t);
fa[5] = fave03(t);
fa[6] = fae03(t);
fa[7] = fapa03(t);
s0 = 0.0;
s1 = 0.0;
for i in (0..NE0).rev() {
a = 0.0;
for j in 0..8 {
a += (E0[i].nfa[j] as f64) * fa[j];
}
s0 += E0[i].s * a.sin() + E0[i].c * a.cos();
}
for i in (0..NE1).rev() {
a = 0.0;
for j in 0..8 {
a += (E1[i].nfa[j] as f64) * fa[j];
}
s1 += E1[i].s * a.sin() + E1[i].c * a.cos();
}
eect = (s0 + s1 * t) * DAS2R;
eect
}