from engine import *
import json, datetime as dt

jr = sunrise(1844,10,15); js = sunset(1844,10,15)

# ---------- 1. the 5-second table for the instrument (9:15 -> 12:00 LMT)
rows=[]
for sec in range(9*3600+15*60, 12*3600+1, 5):
    hh=sec//3600; mm=(sec%3600)//60; ss=sec%60
    j=jd_lmt(1844,10,15,hh,mm,ss)
    a=asc(j)[0]; su=pos(j,swe.SUN)[0]; mo=pos(j,swe.MOON)[0]
    pp=(su+(j-jr)*86400/12.0)%360
    rows.append([sec, round(a,4), round(mo,4), round(su,4), round(pp,3)])
json.dump(rows, open('table.json','w'), separators=(',',':'))
print('table rows', len(rows))

# ---------- 2. the proposed time
PROP = (10,0,47)
j = jd_lmt(1844,10,15,*PROP)
c = chart(j)
yy,mm_,dd,hh_ = swe.revjul(j, swe.GREG_CAL)
print('Proposed 10:00:47 LMT = UT', hms(hh_), 'JD', j, 'ayanamsa', fmt(ayan(j)))
final = {'lmt':'10:00:47', 'ut':hms(hh_), 'jd':j, 'ayanamsa':ayan(j), 'sunrise_lmt':hms(jd_to_lmt_hours(jr)), 'sunset_lmt':hms(jd_to_lmt_hours(js))}
final['positions'] = {k: dict(lon=v['lon'], s=fmt(v['lon']), sign=SIGNS[v['sign']], nak=v['nak'][0], pada=v['nak'][1], spd=v.get('spd')) for k,v in c.items() if k!='MC'}
final['MC'] = fmt(c['MC']['lon'])
for k,v in final['positions'].items(): print(k, v['s'], v['nak'], v['pada'])
# vargas
final['vargas'] = {f'D{n}': {k: SIGNS[varga(c[k]['lon'],n)] for k in ['La','Sū','Ca','Ma','Bu','Gu','Śu','Śa','Rā','Ke']} for n in [2,3,4,7,9,10,12,16,20,24,27,30,60]}
# pranapada, kunda
su=c['Sū']['lon']; a=c['La']['lon']
pp=(su+(j-jr)*86400/12.0)%360
final['pranapada']=dict(lon=pp, s=fmt(pp), house=((int(pp//30)-int(a//30))%12)+1)
kd=(a*81)%360
final['kunda']=dict(lon=kd, s=fmt(kd), nak=nak(kd)[0])
# gulika
part=(js-jr)/8; g0=jr+4*part; g1=jr+5*part
gl=asc(g0)[0]; ml=asc(g1)[0]
final['gulika']=dict(start_lmt=hms(jd_to_lmt_hours(g0)), end_lmt=hms(jd_to_lmt_hours(g1)), lon=gl, s=fmt(gl), nak=nak(gl)[0], mandi_s=fmt(ml), mandi_nak=nak(ml)[0], navamsa=SIGNS[varga(gl,9)])
print('PP', final['pranapada'], 'Kunda', final['kunda'], 'Gulika', final['gulika'])
# dasa
mo=c['Ca']['lon']; lord,bal=dasa_balance(mo)
final['balance']=dict(lord=lord, years=bal)
per=dasa_periods(j, mo, levels=2)
final['maha']=[dict(lord=ch[0], start=jd_to_date(s).isoformat(), end=jd_to_date(e).isoformat()) for s,e,ch in per if len(ch)==1 and e>j]
final['antara']=[dict(maha=ch[0], lord=ch[1], start=jd_to_date(s).isoformat(), end=jd_to_date(e).isoformat()) for s,e,ch in per if len(ch)==2 and e>j and jd_to_date(s).year<=1901]
print('balance', lord, round(bal,3))
for m in final['maha']: print(m)
# events at proposed time
from analysis import EVENTS, dasa_at
ev=[]
for d,label,kind in EVENTS:
    m,a_,p = dasa_at(j, mo, d)
    ev.append(dict(date=d.isoformat(), label=label, maha=m[0][0], antara=a_[0][1], prat=p[0][2],
                   a_start=jd_to_date(a_[1]).isoformat(), a_end=jd_to_date(a_[2]).isoformat(),
                   p_start=jd_to_date(p[1]).isoformat(), p_end=jd_to_date(p[2]).isoformat()))
    print(d, f"{m[0][0]}-{a_[0][1]}-{p[0][2]}", jd_to_date(a_[1]), '→', jd_to_date(a_[2]), '|', label)
final['events']=ev
# tithi / phase
el=(mo-su)%360
final['tithi']=dict(elongation=el, tithi=int(el//12)+1)
# sun's entry into Tula (sidereal)
jj=j-1.0
while pos(jj,swe.SUN)[0]>=180: jj-=1/24
while pos(jj,swe.SUN)[0]<180: jj+=1/1440
final['tula_sankranti_lmt']=hms(jd_to_lmt_hours(jj))+' on '+jd_to_date(jj).isoformat()
print('Tula sankranti', final['tula_sankranti_lmt'])
# equation of time
final['eqtime_min']=swe.time_equ(j)*24*60 if not isinstance(swe.time_equ(j),tuple) else swe.time_equ(j)[0]*24*60
# year-length sensitivity: dasa dates with 360-day years for Sun-Ra antara start and death
def dasa_periods_yl(jd_birth, moon_lon, YL):
    lord,bal=dasa_balance(moon_lon); k=DASA_ORDER.index(lord); t=jd_birth-(DASA_YEARS[lord]-bal)*YL
    out=[]
    for jx in range(9):
        l=DASA_ORDER[(k+jx)%9]; ln=DASA_YEARS[l]; i0=DASA_ORDER.index(l); t0=t
        for jy in range(9):
            l2=DASA_ORDER[(i0+jy)%9]; ln2=ln*DASA_YEARS[l2]/120
            out.append((t0,t0+ln2*YL,[l,l2])); t0+=ln2*YL
        t+=ln*YL
    return out
for YL,name in [(365.25,'365.25'),(365.2422,'tropical'),(360.0,'360')]:
    pr=dasa_periods_yl(j,mo,YL)
    sr=[(s,e,ch) for s,e,ch in pr if ch==['Sū','Rā']][0]
    sm=[(s,e,ch) for s,e,ch in pr if ch==['Sū','Ma']][0]
    print(f'year={name}: Sun-Mars {jd_to_date(sm[0])} → {jd_to_date(sm[1])}; Sun-Rahu starts {jd_to_date(sr[0])}')
    final.setdefault('yearlen',{})[name]=dict(sun_mars=[jd_to_date(sm[0]).isoformat(), jd_to_date(sm[1]).isoformat()], sun_rahu_start=jd_to_date(sr[0]).isoformat())
json.dump(final, open('final.json','w'), ensure_ascii=False, indent=1)

# ---------- 3. birth time at which Sun-Rahu antara begins exactly on 3 Jan 1889 (365.25 convention)
target = swe.julday(1889,1,3,12,swe.GREG_CAL)
for sec in range(9*3600+50*60, 10*3600+15*60, 10):
    hh=sec//3600; mm=(sec%3600)//60; ss=sec%60
    jx=jd_lmt(1844,10,15,hh,mm,ss); mox=pos(jx,swe.MOON)[0]
    pr=dasa_periods(jx,mox,levels=2)
    sr=[(s,e,ch) for s,e,ch in pr if ch==['Sū','Rā']][0]
    if sr[0] <= target:
        print('Sun-Rahu antara already running on 3 Jan 1889 for birth >=', f'{hh:02d}:{mm:02d}:{ss:02d}'); break
# father's death seam: Bu-Su-Sa pratyantara end vs 30 Jul 1849
target2 = swe.julday(1849,7,30,12,swe.GREG_CAL)
for sec in range(9*3600+50*60, 10*3600+15*60, 10):
    hh=sec//3600; mm=(sec%3600)//60; ss=sec%60
    jx=jd_lmt(1844,10,15,hh,mm,ss); mox=pos(jx,swe.MOON)[0]
    pr=dasa_periods(jx,mox,levels=3)
    sa=[(s,e,ch) for s,e,ch in pr if ch==['Bu','Śu','Śa']][0]
    if sa[1] <= target2:
        print('Bu-Su-Sa pratyantara ends before 30 Jul 1849 for birth >=', f'{hh:02d}:{mm:02d}:{ss:02d}'); break
