from pathlib import Path
from datetime import date
import csv, json, sys
import numpy as np
import matplotlib
matplotlib.use('Agg')
import matplotlib.pyplot as plt
from matplotlib import font_manager
ROOT=Path(__file__).resolve().parents[1]; out=ROOT/'outputs'; out.mkdir(exist_ok=True)
names={f.name for f in font_manager.fontManager.ttflist}
font=next((f for f in ['Microsoft YaHei','SimHei','Noto Sans CJK SC'] if f in names),None)
if font:
    plt.rcParams['font.sans-serif']=[font]; plt.rcParams['axes.unicode_minus']=False
else:
    print('No CJK font: report uses English labels.')
raw=[('2026-01-03',12),('2026-01-01',10),('2026-01-02',15)]
rows=sorted(raw); dates=[date.fromisoformat(d) for d,_ in rows]
net=np.array([v for _,v in rows],dtype=float); cumulative=np.cumsum(net)
assert net.tolist()==[10,15,12] and cumulative.tolist()==[10,25,37]
assert np.isclose(cumulative[-1],net.sum())
table=out/'mpl-report-table.csv'
with table.open('w',encoding='utf-8',newline='') as f:
    writer=csv.writer(f); writer.writerow(['date','daily_net','cumulative_net'])
    writer.writerows((d.isoformat(),float(n),float(c)) for d,n,c in zip(dates,net,cumulative))
fig,axes=plt.subplots(2,1,figsize=(7,5),sharex=True,layout='constrained')
axes[0].plot(dates,net,marker='o'); axes[0].set(title='Daily net (paid/refunded, refund deducted)',ylabel='CNY / day')
axes[1].plot(dates,cumulative,marker='s'); axes[1].set(title='Cumulative net since 2026-01-01',ylabel='CNY',xlabel='Date')
for ax in axes:
    ax.grid(alpha=.25)
fig.suptitle('Synthetic order report: 2026-01-01 to 2026-01-03')
for suffix in ['png','svg','pdf']:
    p=out/f'mpl-report.{suffix}'
    fig.savefig(p,dpi=160,bbox_inches='tight',facecolor='white')
    assert p.is_file() and p.stat().st_size>1000
plt.close(fig)
meta={'synthetic':True,'python':sys.version.split()[0],'numpy':np.__version__,
      'matplotlib':matplotlib.__version__,'total_net':float(net.sum()),'rows':len(rows)}
(out/'mpl-report-meta.json').write_text(json.dumps(meta,indent=2),encoding='utf-8')
print('daily',net.tolist(),'cumulative',cumulative.tolist(),'saved PNG/SVG/PDF/CSV/JSON')
