"""Concept vs tag vs fact, and duration vs instant. Both shown from real data."""
from edgar import *
set_identity("Your Name your@email.com")
import pandas as pd
facts = Company("AAPL").facts

print("="*94)
print("A. ANATOMY OF ONE FACT  (concept + period + unit + value)")
print("="*94)
q = facts.query().by_concept("NetCashProvidedByUsedInOperatingActivities").to_dataframe()
q["_pe"]=pd.to_datetime(q.period_end)
r = q[q._pe==pd.Timestamp("2025-12-27")].iloc[0]
for k in ["concept","label","value","unit","period_start","period_end","period_type",
          "fiscal_year","fiscal_period","form_type","filing_date","accession"]:
    print(f"  {k:<14} {r[k]}")

print("\n" + "="*94)
print("B. ONE CONCEPT, MANY FACTS  (Apple OCF: 162 facts for a single concept)")
print("="*94)
print(f"  total facts for this one concept: {len(q)}")
s=q[["period_start","period_end","numeric_value","form_type","accession"]].sort_values("period_end").tail(4)
for _,x in s.iterrows():
    print(f"  {x.period_start} -> {x.period_end}   {x.numeric_value/1e6:>10,.0f} mm   {x.form_type}  {x.accession}")

print("\n" + "="*94)
print("C. DURATION vs INSTANT  (period_type is per FACT, not per statement)")
print("="*94)
for concept,where in [("NetCashProvidedByUsedInOperatingActivities","cash flow"),
                      ("PaymentsToAcquirePropertyPlantAndEquipment","cash flow"),
                      ("RevenueFromContractWithCustomerExcludingAssessedTax","income stmt"),
                      ("CashAndCashEquivalentsAtCarryingValue","balance sheet"),
                      ("AssetsCurrent","balance sheet"),
                      ("StockholdersEquity","balance sheet")]:
    d = facts.query().by_concept(concept).to_dataframe()
    if d is None or len(d)==0: print(f"  {concept:<52} {where:<14} no facts"); continue
    types = d.period_type.value_counts().to_dict()
    ex = d.sort_values("period_end").iloc[-1]
    dur = "" if ex.period_type=="instant" else f"  dur={(pd.to_datetime(ex.period_end)-pd.to_datetime(ex.period_start)).days}d"
    st  = "(none)" if ex.period_type=="instant" else str(ex.period_start)
    print(f"  {concept[:50]:<52} {where:<14} {types}")
    print(f"      latest fact:  start={st:<12} end={ex.period_end}{dur}")
