#!/usr/bin/env python3 """Source-bounded Niryaana Shoola Dasha Mahadasha producer.""" from __future__ import annotations from datetime import datetime, timedelta from typing import Any YEAR_DAYS = 365.25636 TOTAL_CYCLE = 108 SIGNS = ( "Aries", "Taurus", "Gemini", "Cancer", "Leo", "Virgo", "Libra", "Scorpio", "Sagittarius", "Capricorn", "Aquarius", "Pisces", ) def _sign_index(longitude: float) -> int: return int(float(longitude) % 360.0 // 30.0) def _forward_order(start_sign_index: int) -> list[int]: return [(int(start_sign_index) + offset) % 12 for offset in range(12)] def niryaana_shoola_applicability( *, ascendant_longitude: float, lagna_strength: float, seventh_strength: float ) -> dict[str, Any]: """Select stronger Lagna/seventh start sign; unresolved ties stay blocked.""" lagna_sign = _sign_index(ascendant_longitude) seventh_sign = (lagna_sign + 6) % 12 lagna_strength = float(lagna_strength) seventh_strength = float(seventh_strength) if lagna_strength == seventh_strength: return { "applicable": False, "execution_status": "blocked", "ascendant_sign_index": lagna_sign, "seventh_sign_index": seventh_sign, "lagna_strength": lagna_strength, "seventh_strength": seventh_strength, "rule_family": "goel_niryaana_shoola_stronger_lagna_or_seventh", "reason": "Niryaana Shoola start sign requires a declared stronger Lagna or seventh sign; tie-break profile is not closed.", } start = lagna_sign if lagna_strength > seventh_strength else seventh_sign return { "applicable": True, "ascendant_sign_index": lagna_sign, "seventh_sign_index": seventh_sign, "lagna_strength": lagna_strength, "seventh_strength": seventh_strength, "starting_sign_index": start, "starting_sign": SIGNS[start], "rule_family": "goel_niryaana_shoola_stronger_lagna_or_seventh", "reason": "Niryaana Shoola starts from the stronger of Lagna and seventh sign.", } def calculate_niryaana_shoola_dasha(birth_info: dict[str, Any]) -> dict[str, Any]: """Return forward 9-year sign rows; AD/PD remain blocked.""" required = ("birth_datetime", "ascendant_longitude", "lagna_strength", "seventh_strength") missing = [field for field in required if birth_info.get(field) is None] if missing: return { "applicable": False, "execution_status": "blocked", "confidence_status": "blocked", "reason": "Missing required input: " + ", ".join(missing), "major": [], } birth = birth_info["birth_datetime"] if isinstance(birth, str): birth = datetime.fromisoformat(birth) applicability = niryaana_shoola_applicability( ascendant_longitude=float(birth_info["ascendant_longitude"]), lagna_strength=float(birth_info["lagna_strength"]), seventh_strength=float(birth_info["seventh_strength"]), ) if not applicability["applicable"]: return { **applicability, "confidence_status": "blocked", "total_cycle": TOTAL_CYCLE, "major": [], } year_days = float(birth_info.get("dasha_year_days") or YEAR_DAYS) rows = [] cursor = birth for sign_index in _forward_order(int(applicability["starting_sign_index"])): end = cursor + timedelta(days=9.0 * year_days) rows.append( { "level": "mahadasha", "sign_index": sign_index, "sign": SIGNS[sign_index], "years": 9, "start_date": cursor.isoformat(timespec="seconds"), "end_date": end.isoformat(timespec="seconds"), } ) cursor = end return { **applicability, "execution_status": "executed", "confidence_status": "parameter_sensitive", "verification_status": "source_bounded_local_candidate", "period_depth_status": "mahadasha_executed_ad_pd_blocked_pending_row_level_replay", "total_cycle": TOTAL_CYCLE, "dasha_year_days": year_days, "major": rows, "reason": "Local source-bounded MD calculation; strength source, AD/PD, and runtime wiring remain explicitly gated.", "source_locator": "VP Goel / public Jaimini summaries: stronger Lagna-or-seventh start, direct order, 9 years per sign, 108-year cycle.", }