use wasm_bindgen::prelude::*;
use serde::{Serialize, Deserialize};
use alloc::string::{String, ToString};
use crate::astronomy::planets::{sun_longitude, moon_longitude};
use crate::astronomy::solver::find_angle_crossing;
pub const TITHI_NAMES: [&str; 30] = [
"Pratipada", "Dwitiya", "Tritiya", "Chaturthi", "Panchami",
"Shashthi", "Saptami", "Ashtami", "Navami", "Dashami",
"Ekadashi", "Dwadashi", "Trayodashi", "Chaturdashi", "Purnima",
"Pratipada", "Dwitiya", "Tritiya", "Chaturthi", "Panchami",
"Shashthi", "Saptami", "Ashtami", "Navami", "Dashami",
"Ekadashi", "Dwadashi", "Trayodashi", "Chaturdashi", "Amavasya",
];
#[derive(Debug, Clone, Copy, PartialEq, Serialize, Deserialize)]
#[wasm_bindgen]
pub enum Paksha {
Shukla = 0, Krishna = 1, }
#[derive(Debug, Clone, Serialize, Deserialize)]
#[wasm_bindgen(getter_with_clone)]
pub struct TithiInfo {
pub index: u8,
pub name: String,
pub paksha: Paksha,
pub completion: f64,
}
#[wasm_bindgen]
impl TithiInfo {
#[wasm_bindgen(getter)]
pub fn paksha_name(&self) -> String {
match self.paksha {
Paksha::Shukla => "Shukla".to_string(),
Paksha::Krishna => "Krishna".to_string(),
}
}
}
#[wasm_bindgen]
pub fn calculate_tithi(jd: f64) -> TithiInfo {
let sun_long = sun_longitude(jd);
let moon_long = moon_longitude(jd);
let mut diff = moon_long - sun_long;
if diff < 0.0 {
diff += 360.0;
}
let tithi_float = diff / 12.0;
let tithi_index = (tithi_float.floor() as u8) + 1;
let completion = tithi_float - tithi_float.floor();
let paksha = if tithi_index <= 15 {
Paksha::Shukla
} else {
Paksha::Krishna
};
let _display_index = if tithi_index <= 15 { tithi_index } else { tithi_index - 15 };
TithiInfo {
index: tithi_index,
name: TITHI_NAMES[(tithi_index - 1) as usize].to_string(),
paksha,
completion,
}
}
#[wasm_bindgen]
pub fn tithi_end_time(jd: f64) -> f64 {
let current = calculate_tithi(jd);
let target_angle = current.index as f64 * 12.0;
let start_search = jd;
let end_search = jd + 1.5;
find_angle_crossing(
|t| {
let sl = sun_longitude(t);
let ml = moon_longitude(t);
let mut d = ml - sl;
if d < 0.0 { d += 360.0; }
d
},
start_search,
end_search,
target_angle
).unwrap_or(jd) }
#[wasm_bindgen]
pub fn tithi_start_time(jd: f64) -> f64 {
let current = calculate_tithi(jd);
let target_angle = (current.index as f64 - 1.0) * 12.0;
let start_search = jd - 1.5;
let end_search = jd;
find_angle_crossing(
|t| {
let sl = sun_longitude(t);
let ml = moon_longitude(t);
let mut d = ml - sl;
if d < 0.0 { d += 360.0; }
d
},
start_search,
end_search,
target_angle
).unwrap_or(jd)
}