use wasm_bindgen::prelude::*;
use serde::{Serialize, Deserialize};
use alloc::string::{String, ToString};
use crate::astronomy::planets::{sun_longitude, moon_longitude};
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,
}
}
pub fn tithi_end_time(jd: f64) -> f64 {
let current = calculate_tithi(jd);
let target_angle = current.index as f64 * 12.0;
let mut search_jd = jd;
for _ in 0..20 {
let sun_long = sun_longitude(search_jd);
let moon_long = moon_longitude(search_jd);
let mut diff = moon_long - sun_long;
if diff < 0.0 { diff += 360.0; }
let error = target_angle - diff;
if error.abs() < 0.001 {
break;
}
let step = error / 12.2;
search_jd += step;
}
search_jd
}