"""Pull Mag 7 quarterly cash flow from yfinance and reconcile against the SEC figures."""
import yfinance as yf, pandas as pd, json, time, datetime as dt

T={"Apple":"AAPL","Microsoft":"MSFT","Alphabet":"GOOGL","Amazon":"AMZN",
   "Nvidia":"NVDA","Meta":"META","Tesla":"TSLA"}

def cq(d):
    d=pd.Timestamp(d).date()
    y,m=d.year,d.month
    best=None
    for ay,am in [(y-1,12),(y,3),(y,6),(y,9),(y,12),(y+1,3)]:
        last=dt.date(ay+(am==12),(am%12)+1,1)-dt.timedelta(days=1)
        dist=abs((d-last).days)
        if best is None or dist<best[0]: best=(dist,ay,am)
    _,ay,am=best
    return f"CY{ay}Q{(am-1)//3+1}"

out={}; meta={}
t0=time.time()
for name,tk in T.items():
    t=time.time()
    cf = yf.Ticker(tk).quarterly_cashflow
    rows={}
    for q in ["Operating Cash Flow","Capital Expenditure","Free Cash Flow","Purchase Of PPE"]:
        if q in cf.index: rows[q]=cf.loc[q]
    per={}
    for col in cf.columns:
        k=cq(col)
        per[k]={
          "period_label": str(pd.Timestamp(col).date()),
          "ocf":   None if "Operating Cash Flow" not in rows else rows["Operating Cash Flow"][col],
          "capex": None if "Capital Expenditure" not in rows else rows["Capital Expenditure"][col],
          "fcf":   None if "Free Cash Flow" not in rows else rows["Free Cash Flow"][col],
        }
    out[name]=per
    meta[name]={"ticker":tk,"n_quarters":len(cf.columns),"n_line_items":len(cf.index),
                "elapsed_s":round(time.time()-t,2),
                "columns":[str(pd.Timestamp(c).date()) for c in cf.columns]}
    print(f"{name:<10} quarters={len(cf.columns)}  line_items={len(cf.index):>3}  {meta[name]['elapsed_s']:>5.2f}s  cols={meta[name]['columns']}")
print(f"\ntotal elapsed {time.time()-t0:.1f}s")
json.dump({"result":{k:{q:{kk:(None if v is None or pd.isna(v) else float(v)) for kk,v in d.items() if kk!='period_label'}|{"period_label":d["period_label"]} for q,d in per.items()} for k,per in out.items()},"meta":meta},
          open("data/yfinance_fcf.json","w"), indent=1, default=str)
print("wrote data/yfinance_fcf.json")
