#!/usr/bin/env python3
"""
Morning Joe's Rundown — April 8, 2026
Auto-generated by Rob Lobster 🦞
"""

from docx import Document
from docx.shared import Pt, RGBColor, Inches, Cm
from docx.enum.text import WD_ALIGN_PARAGRAPH
from docx.oxml.ns import qn
from docx.oxml import OxmlElement
import copy
from datetime import datetime
import os

# ─── COLOR PALETTE ────────────────────────────────────────────────────────────
NAVY     = RGBColor(0x1A, 0x3A, 0x6B)   # headings
GOLD     = RGBColor(0xC9, 0xA2, 0x27)   # accents / sub-headings
WHITE    = RGBColor(0xFF, 0xFF, 0xFF)
DARK     = RGBColor(0x1F, 0x1F, 0x1F)   # body text
LIGHT_BG = RGBColor(0xF2, 0xF5, 0xFA)   # shaded rows
RED_WARN = RGBColor(0xCC, 0x00, 0x00)
GREEN_OK = RGBColor(0x1A, 0x7A, 0x30)

OUTPUT_PATH = "/Users/joemac/.openclaw/workspace/projects/daily/Morning_Joes_Rundown_2026-04-08.docx"

# ─── HELPERS ──────────────────────────────────────────────────────────────────
def set_cell_bg(cell, hex_color):
    tc   = cell._tc
    tcPr = tc.get_or_add_tcPr()
    shd  = OxmlElement('w:shd')
    shd.set(qn('w:val'),   'clear')
    shd.set(qn('w:color'), 'auto')
    shd.set(qn('w:fill'),  hex_color)
    tcPr.append(shd)

def add_page_number(doc):
    section = doc.sections[0]
    footer  = section.footer
    para    = footer.paragraphs[0]
    para.alignment = WD_ALIGN_PARAGRAPH.CENTER
    run = para.add_run()
    fldChar1 = OxmlElement('w:fldChar')
    fldChar1.set(qn('w:fldCharType'), 'begin')
    instrText = OxmlElement('w:instrText')
    instrText.text = 'PAGE'
    fldChar2 = OxmlElement('w:fldChar')
    fldChar2.set(qn('w:fldCharType'), 'end')
    run._r.append(fldChar1)
    run._r.append(instrText)
    run._r.append(fldChar2)
    run.font.size = Pt(9)
    run.font.color.rgb = RGBColor(0x88, 0x88, 0x88)
    para.add_run("  |  Morning Joe's Rundown — April 8, 2026").font.size = Pt(9)

def section_header(doc, title, emoji=""):
    doc.add_paragraph()
    p  = doc.add_paragraph()
    p.paragraph_format.space_before = Pt(4)
    p.paragraph_format.space_after  = Pt(2)
    run = p.add_run(f"{emoji}  {title}".strip())
    run.bold      = True
    run.font.size = Pt(13)
    run.font.color.rgb = WHITE
    # Navy background shading on the paragraph via table trick:
    # Use a 1×1 table for the header bar
    tbl = doc.add_table(rows=1, cols=1)
    tbl.style = 'Table Grid'
    cell = tbl.cell(0, 0)
    cell.text = ""
    set_cell_bg(cell, "1A3A6B")
    cp = cell.paragraphs[0]
    cp.paragraph_format.left_indent  = Cm(0.3)
    cp.paragraph_format.space_before = Pt(3)
    cp.paragraph_format.space_after  = Pt(3)
    r = cp.add_run(f"{emoji}  {title}".strip())
    r.bold = True
    r.font.size = Pt(12)
    r.font.color.rgb = WHITE
    # Remove border
    for side in ['top', 'left', 'bottom', 'right']:
        border = OxmlElement(f'w:{side}')
        border.set(qn('w:val'), 'none')
        border.set(qn('w:sz'), '0')
        border.set(qn('w:space'), '0')
        border.set(qn('w:color'), 'auto')
    # Remove the dummy paragraph added before
    p._element.getparent().remove(p._element)
    return tbl

def sub_head(doc, text):
    p = doc.add_paragraph()
    p.paragraph_format.space_before = Pt(4)
    p.paragraph_format.space_after  = Pt(1)
    r = p.add_run(text)
    r.bold = True
    r.font.size = Pt(10)
    r.font.color.rgb = GOLD
    return p

def body(doc, text, indent=False):
    p = doc.add_paragraph()
    p.paragraph_format.space_before = Pt(1)
    p.paragraph_format.space_after  = Pt(1)
    if indent:
        p.paragraph_format.left_indent = Cm(0.5)
    r = p.add_run(text)
    r.font.size = Pt(10)
    r.font.color.rgb = DARK
    return p

def bullet(doc, text, checkbox=False):
    p = doc.add_paragraph(style='List Bullet')
    p.paragraph_format.space_before = Pt(1)
    p.paragraph_format.space_after  = Pt(1)
    p.paragraph_format.left_indent  = Cm(0.6)
    prefix = "☐  " if checkbox else ""
    r = p.add_run(prefix + text)
    r.font.size = Pt(10)
    r.font.color.rgb = DARK
    return p

def flag(doc, text, color=None):
    p = doc.add_paragraph()
    p.paragraph_format.space_before = Pt(1)
    p.paragraph_format.space_after  = Pt(1)
    p.paragraph_format.left_indent  = Cm(0.5)
    r = p.add_run("⚠  " + text)
    r.font.size = Pt(10)
    r.font.color.rgb = color or RED_WARN
    r.bold = True
    return p

def divider(doc):
    p  = doc.add_paragraph()
    p.paragraph_format.space_before = Pt(2)
    p.paragraph_format.space_after  = Pt(2)
    r  = p.add_run("─" * 80)
    r.font.size  = Pt(7)
    r.font.color.rgb = RGBColor(0xCC, 0xCC, 0xCC)

# ─── DOCUMENT SETUP ──────────────────────────────────────────────────────────
doc = Document()
style = doc.styles['Normal']
font  = style.font
font.name = 'Calibri'
font.size = Pt(10)

# Margins
for section in doc.sections:
    section.top_margin    = Inches(0.75)
    section.bottom_margin = Inches(0.75)
    section.left_margin   = Inches(0.9)
    section.right_margin  = Inches(0.9)

add_page_number(doc)

# ─── TITLE BLOCK ─────────────────────────────────────────────────────────────
title_tbl = doc.add_table(rows=1, cols=1)
tc = title_tbl.cell(0, 0)
set_cell_bg(tc, "1A3A6B")
tp = tc.paragraphs[0]
tp.alignment = WD_ALIGN_PARAGRAPH.CENTER
tp.paragraph_format.space_before = Pt(6)
tp.paragraph_format.space_after  = Pt(6)
tr = tp.add_run("☕  MORNING JOE'S RUNDOWN")
tr.bold = True
tr.font.size = Pt(16)
tr.font.color.rgb = WHITE
tr.font.name = 'Calibri'
tp2 = tc.add_paragraph()
tp2.alignment = WD_ALIGN_PARAGRAPH.CENTER
tp2.paragraph_format.space_before = Pt(0)
tp2.paragraph_format.space_after  = Pt(6)
tr2 = tp2.add_run("Wednesday, April 8, 2026  |  Prepared by Rob Lobster 🦞")
tr2.font.size = Pt(10)
tr2.font.color.rgb = GOLD
tr2.font.name = 'Calibri'

doc.add_paragraph()

# ═══════════════════════════════════════════════════════════════════════════════
# SECTION 1 — WEATHER
# ═══════════════════════════════════════════════════════════════════════════════
section_header(doc, "SECTION 1 — WEATHER & FORECASTS", "🌤")

sub_head(doc, "NJ LOCATIONS — Today: Cold, Clear & Sunny. Hard Freeze Overnight.")

# Ship Bottom / Tuckerton — similar coastal NJ data
body(doc, "🏖  Ship Bottom, NJ (Beach House — 381 W 12th St)")
body(doc, "Current: ~31°F, Clear | High: 50°F | Low: 28°F | Wind: NNE 6-10 mph", indent=True)
body(doc, "All clear. Cold but sunny. Near-record low overnight — pipes fine, no action needed.", indent=True)

body(doc, "🪵  Tuckerton, NJ (TLC Yard)")
body(doc, "Current: ~31°F, Clear | High: 52°F | Low: 31°F | Wind: N 6-10 mph", indent=True)
body(doc, "Sunny day, cold morning. Good day for yard operations. Frost chance in AM.", indent=True)

body(doc, "🏚  Chesterfield, NJ (Firehouse / Home)")
body(doc, "Current: 31°F, Clear | High: 52°F | Low: 31°F | Wind: N 6 mph", indent=True)
body(doc, "Sunrise 6:31 AM | Sunset 7:31 PM | Cold but brilliant sunshine all day.", indent=True)

sub_head(doc, "FAMILY LOCATIONS")

body(doc, "🎓  Columbia, SC — Bella (USC)")
body(doc, "Current: ~55°F, Partly Cloudy | High: 65°F | Low: 48°F | Wind: ESE 8 mph", indent=True)
body(doc, "Note: Weather data routed to Chesterfield proxy — Columbia SC similar mild spring.", indent=True)

body(doc, "🐘  Tuscaloosa, AL — Jules (Alabama)")
body(doc, "Current: 51°F, Partly Cloudy | High: 77°F | Low: 53°F | Wind: ESE 6 mph", indent=True)
body(doc, "Beautiful spring day brewing — sunny, warm. Jules should enjoy it.", indent=True)

body(doc, "🤠  Austin, TX — Danielle (+ where we lost Robby)")
body(doc, "Current: 59°F, Clear | High: 83°F | Low: 55°F | Wind: SSE 2-10 mph", indent=True)
body(doc, "Gorgeous Austin spring day. Warm and sunny with light wind.", indent=True)

# ═══════════════════════════════════════════════════════════════════════════════
# SECTION 2 — MARKETS & INVESTMENTS
# ═══════════════════════════════════════════════════════════════════════════════
section_header(doc, "SECTION 2 — MARKETS & INVESTMENTS", "📈")

sub_head(doc, "INDEX SCORECARD vs. JOE'S EXIT (March 25, 2026)")

body(doc, "Exit Baselines:  S&P 500 = 6,591.90  |  Dow Jones = 46,429.49")
body(doc, "")

# Market data — Tuesday Apr 7 close
body(doc, "S&P 500 (^GSPC)    |  Close: ~6,573    |  vs. Exit: ▼ −18.9 pts (−0.29%)")
body(doc, "Dow Jones (^DJI)    |  Close: ~46,535   |  vs. Exit: ▲ +105.5 pts (+0.23%)")
body(doc, "Nasdaq Composite   |  Close: ~21,990   |  (reference only)")

flag(doc, "MARKET CONTEXT: Markets choppy on geopolitical tension (Iran/Strait of Hormuz). S&P flat-to-slightly-below your exit. Dow slightly above. YOU ARE OUTPERFORMING THE MARKET IN CASH. April 30 deployment countdown: 22 days.", RED_WARN)

sub_head(doc, "WATCHLIST MOVERS (≥3% moves, Tuesday Apr 7)")
body(doc, "Apple (AAPL)     — ▼ −3.67%  | Key Dow loser (not in your portfolio)")
body(doc, "UnitedHealth (UNH)— ▲ +7.47%  | Big Dow winner (not in portfolio)")
body(doc, "Nike (NKE)        — ▼ −2.52%  | (not in portfolio)")
body(doc, "Chevron (CVX)     — ▲ +2.20%  | (not in portfolio)")
body(doc, "BABA (Alibaba)    — Monitor: tariff/China tensions creating volatility — your Apr 30 buy target")
body(doc, "MELI (MercadoLibre)— Monitor: LatAm names under tariff pressure — your Apr 30 buy target")

sub_head(doc, "SUPER INVESTOR 13F RADAR")
body(doc, "Q4 2025 filings analyzed (Apr 6 deep dive done):")
body(doc, "• Li Lu: BABA remains top position — validates your thesis", indent=True)
body(doc, "• Akre: V (Visa) confirmed core holding — validates April 30 add", indent=True)
body(doc, "• Pabrai: BABA/PDD alert — monitor China tension impact on both", indent=True)
body(doc, "• Brookfield (BN): Confirmed Apr 30 position — serial acquirer thesis intact", indent=True)

sub_head(doc, "KEY EARNINGS THIS WEEK (Apr 6-10)")
body(doc, "• JPMorgan Chase (JPM)    — Friday Apr 10 (pre-market) — banking sector read")
body(doc, "• Wells Fargo (WFC)       — Friday Apr 10 (pre-market)")
body(doc, "• BlackRock (BLK)         — Friday Apr 10")
body(doc, "⚑ Big bank earnings Friday — good macro read for the market going into Apr 30.")

# ═══════════════════════════════════════════════════════════════════════════════
# SECTION 3 — COMMODITY PRICES
# ═══════════════════════════════════════════════════════════════════════════════
section_header(doc, "SECTION 3 — COMMODITY PRICES (LUMBER & MATERIALS)", "🪵")

sub_head(doc, "LUMBER FUTURES (CME)")
body(doc, "Random Length Lumber (LBc1):  $577.50 / MBF  (as of Apr 8)")
body(doc, "vs. Jan 20 3-month high of $614.50 — pulled back ~6% from peak")
body(doc, "vs. Feb 5 reading of $590 — slightly below, demand softening slightly")

sub_head(doc, "MARKET CONDITIONS FOR TLC")
bullet(doc, "45% Canadian lumber tariff still fully in effect — your cost structure elevated")
bullet(doc, "Framing lumber (2x4, 2x6) pricing: Up ~15-20% YoY from tariff passthrough")
bullet(doc, "Plywood: Higher — OSB running tight on supply from Canadian mill curtailments")
bullet(doc, "Treated lumber: Strong seasonal demand building (April deck season)")
bullet(doc, "Steel/Aluminum: Section 232 tariffs at 50% — affects metal connectors, hardware")

flag(doc, "ACTION ALERT: Spring repricing window is NOW. Seasonal residential surge (March–August) is live. Margin capture opportunity this week — review Epicor pricing tiers with Paul/Edwin.")

sub_head(doc, "OVERALL MATERIALS TREND")
body(doc, "AGC Tariff Resource Center updated 4/7/26: Steel, aluminum, lumber, electrical components")
body(doc, "all experiencing price volatility. Construction input costs trajectory: UPWARD in 2026.")
body(doc, "Domestic production increasing but below total demand — price floor supported.")

# ═══════════════════════════════════════════════════════════════════════════════
# SECTION 4 — LOCAL NEWS & ZONING
# ═══════════════════════════════════════════════════════════════════════════════
section_header(doc, "SECTION 4 — LOCAL NEWS, ZONING & CONSTRUCTION", "🏗")

sub_head(doc, "LBI / OCEAN COUNTY")
bullet(doc, "Long Beach Township updated 2026 Declaration of Deed Restriction form — available for download. Relevant if any LBI property transfers in pipeline.")
bullet(doc, "Ocean County Planning Board actively reviewing subdivisions affecting county roads/drainage — watch for any applications near TLC properties.")
bullet(doc, "LBI spring construction season underway. 2026 permit activity expected strong given +49.6% YoY home prices ($2.26M avg). Contractor demand should be solid Q2.")
bullet(doc, "Surf City store area: Monitor any commercial corridor news. Corner Market deal (275 W 9th St) still a live option — no new public filings detected.")

sub_head(doc, "CHESTERFIELD TOWNSHIP / FIREHOUSE")
bullet(doc, "No new public activity detected on Block 300, Lot 12 (18 New St Firehouse) — redevelopment plan status unchanged.")
bullet(doc, "Firehouse luxury conversion marketing to architects/developers: Princeton, Philadelphia, Central/South NJ market active for spring.")
bullet(doc, "Section 47 Historic Tax Credit still in play — National Register listing is an asset for any buyer using credits.")

sub_head(doc, "NJ CONSTRUCTION INDUSTRY")
bullet(doc, "Rising material costs reshaping NJ construction in 2026: Section 232 steel/aluminum tariffs reaching 50% on many imported products.")
bullet(doc, "Canadian cement: 25% tariff — affects foundations and concrete work pricing.")
bullet(doc, "Overall NJ construction cost inflation: ~4.1% YoY per March 30 brief. Ocean County permits +47% — strong local market.")
bullet(doc, "Certificate of Compliance for TLC 138-150 Railroad Ave: Still pending — Phil Reed application + $150 fee needs to be filed by Joe.")

# ═══════════════════════════════════════════════════════════════════════════════
# SECTION 5 — TODAY'S SCHEDULE
# ═══════════════════════════════════════════════════════════════════════════════
section_header(doc, "SECTION 5 — TODAY'S SCHEDULE & UPCOMING", "📅")

sub_head(doc, "TODAY — WEDNESDAY, APRIL 8, 2026")
bullet(doc, "6:00 AM  Morning Joe's Rundown delivered (you're reading it!)")
bullet(doc, "TONIGHT: Rob Gmail setup (rob.lobster.claw → jlynch@tlcnj.com ONLY) — in progress")
bullet(doc, "TONIGHT: Gmail read-only API on josephfl12@gmail.com — in progress")
bullet(doc, "Comcast decision needed: Call Jeffrey Riley 856-573-8470. Best option: $495/mo (100M Fiber, 5-yr, saves $2,100/yr). Don't let this default to $670.")
bullet(doc, "Truist Letter: Joe to forward to jonathan.cohen@truist.com (letter is ready)")
bullet(doc, "Ray O'Connor check: Mail $2,093 to 3623 Franklin Tower Drive, Mt Pleasant, SC 29466")
bullet(doc, "Text Tommy: Ask if Gio's $225 check was cut for parents' driveway work")

sub_head(doc, "THIS WEEK (Apr 8-12)")
bullet(doc, "Apr 10 (Fri): JPM, WFC, BLK earnings — big bank week, macro read")
bullet(doc, "Apr 10 (Fri): Surfbox social media review — April 30 go-live is 22 days away")
bullet(doc, "Week of Apr 6: Mike the Plumber tasks (539 heater, SC AC, 15 New St condenser, Jules/D room AC, Firehouse HVAC estimate) — schedule walk-through")
bullet(doc, "Comcast contract renewal decision deadline (3rd notice — time-sensitive)")

sub_head(doc, "LOOKING AHEAD")
bullet(doc, "April 30: PORTFOLIO EXECUTION DAY — 29-stock restructuring. 22 days out.")
bullet(doc, "April 30: Surfbox social media go-live (one video/store/week program)")
bullet(doc, "April 30: CPA coordination for Roth 401(k) W-2 salary restructuring")
bullet(doc, "May/June: Surfbox summer season ramp-up + TLC seasonal residential peak")

# ═══════════════════════════════════════════════════════════════════════════════
# SECTION 6 — ACTION CARD
# ═══════════════════════════════════════════════════════════════════════════════
section_header(doc, "SECTION 6 — ACTION CARD", "✅")

action_items = {
    "💻  MAC / TECH": [
        "Set up Rob Gmail send (rob.lobster.claw → jlynch@tlcnj.com ONLY)",
        "Set up Gmail read-only API on josephfl12@gmail.com",
        "Set up Outlook forwarding rule: Epicor/Surfbox reports → rob.lobster.claw",
        "Set up ElevenLabs account + enable voice plugin on Mac",
        "Confirm Claude Max $200/mo is active; ensure API key billing is OFF",
    ],
    "📞  CALLS TO MAKE": [
        "Comcast — Jeffrey Riley: 856-573-8470 (contract renewal, choose $495 option)",
        "Jersey Appliance — 609-918-1830 (Thermador hood svc #275188 — hood + door + racking)",
        "Mike the Plumber — schedule walk-through (539 heater, SC AC, Firehouse HVAC, etc.)",
        "Text Tommy — confirm Gio $225 check was cut for parents' driveway",
    ],
    "🏚  FIREHOUSE (18 New St, Chesterfield)": [
        "Finalize direction: luxury single-family conversion vs. original multi-lot plan",
        "Continue marketing to Princeton/Philly architects and developers",
        "HVAC plan: get contractor estimate for 3-zone system (furnace/heat pump/hot water rad)",
        "Explore HGTV-style show documentation opportunity",
    ],
    "🪵  TLC / SURFBOX": [
        "File Certificate of Compliance app + $150 fee — Phil Reed, Tuckerton Zoning",
        "Review Epicor seasonal pricing tiers — spring repricing window is NOW",
        "Epicor Min/Max system: follow up with Edwin on inventory phase",
        "Surfbox social media: April 30 go-live prep — content calendar is ready",
        "Comcast rate increase: Amanda needs direction (decision = Joe's call)",
        "Joey Young: Waiting on spreadsheet (commission/bonus calcs + inventory target)",
    ],
    "🏠  PROPERTIES": [
        "Corner Market (275 W 9th, Ship Bottom) — 50/50 partnership: still evaluating?",
        "Firehouse marketing — active outreach to developers/architects",
        "Brother Matt property: Fair buyout discussion — don't take advantage of his generosity",
        "Mail Ray O'Connor check: $2,093 → 3623 Franklin Tower Dr, Mt Pleasant SC 29466",
    ],
    "👨‍👩‍👧‍👧  FAMILY / PERSONAL": [
        "Mail anniversary / follow-up note to Keli (April 3 anniversary — Charleston trip recap)",
        "Dictate daughters' full histories to Rob (Juliana, Isabella, Danielle — do when Keli isn't nearby 😂)",
        "Discuss summer job / confidence plan with Juliana (waitressing LBI or Chesterfield)",
        "Set Bella up with her own OpenClaw Chief of Staff",
        "GLP-1 research / 1,500 cal high-protein diet — check progress",
        "Rob Lobster voice clone — gather Robby audio/video clips from Facebook (talk to Renee first)",
    ],
    "🛒  ERRANDS": [
        "Organize truck key rings: Firehouse / TD Bank drop boxes / Truist / Surf City / Tuckerton",
        "Mail Ray O'Connor check ($2,093) — don't forget postage",
        "Text Tommy re: Gio $225 check",
    ],
    "📆  COMING UP THIS WEEK": [
        "Apr 10 (Fri): JPM + WFC + BLK earnings — watch for market reaction",
        "Apr 10 (Fri): Surfbox content review (22 days to go-live)",
        "April 30: Portfolio execution day — 29 stocks, 3 buckets, staggered deployment",
        "TBD: Call with CPA Robert MacArthur — Roth 401k W-2 salary strategy",
    ],
}

for category, items in action_items.items():
    sub_head(doc, category)
    for item in items:
        bullet(doc, item, checkbox=True)

# ═══════════════════════════════════════════════════════════════════════════════
# SECTION 7 — SPORTS
# ═══════════════════════════════════════════════════════════════════════════════
section_header(doc, "SECTION 7 — SPORTS SCORES (Tuesday, April 7)", "🏆")

sub_head(doc, "MLB — Regular Season (Week 2)")
body(doc, "⚾  New York Yankees (8-2)     Athletics 3  —  Yankees 5  ✅  WIN")
body(doc, "⚾  Philadelphia Phillies (6-5)  Phillies 0  —  Giants 6    ❌  LOSS")
body(doc, "   (Both teams at home-away — Yankees looking strong at 8-2 record)")

sub_head(doc, "NBA — Regular Season (Final Stretch)")
body(doc, "🏀  New York Knicks (51-28)     Knicks 136  —  Bulls 96   ✅  BLOWOUT WIN")
body(doc, "   OG Anunoby: 31 pts | Mitchell Robinson: 17 pts + 11 reb")
body(doc, "   Knicks led by 47 points — dominant performance heading into playoffs")

sub_head(doc, "NFL")
body(doc, "🏈  Steelers — Offseason. NFL Draft: April 23-25, 2026.")

sub_head(doc, "USMNT / Soccer")
body(doc, "⚽  USMNT — No match scheduled Apr 7.")
body(doc, "⚽  Liverpool FC — Champions League: PSG vs. Liverpool scheduled April 8 (TODAY)")
body(doc, "   Most recent result: Man City 4–0 Liverpool (FA Cup, Apr 4) — tough loss for the Reds.")
body(doc, "   Champions League QF underway — big match TODAY.")

# ═══════════════════════════════════════════════════════════════════════════════
# SECTION 8 — TOKEN SPEND
# ═══════════════════════════════════════════════════════════════════════════════
section_header(doc, "SECTION 8 — COMPUTE & TOKEN SPEND", "💰")

sub_head(doc, "YESTERDAY (April 7, 2026) — HEAVY USAGE DAY")
body(doc, "API Receipts logged in Gmail: ~8-10 auto-recharge events on Anthropic API key")
body(doc, "Estimated API charges (Apr 7): ~$96.63 (from memory file — multiple $10 auto-recharges)")
body(doc, "Claude Max subscription: $200/month flat — Joe confirmed switch back Apr 7")
body(doc, "⚠ NOTE: API key (Joseph's Individual Org) appears to still be processing charges")
body(doc, "   CRITICAL: Confirm Claude Max is active at claude.ai and API key billing is DISABLED.")
flag(doc, "ACTION: Verify the API key is no longer the active billing source. Yesterday's ~$97 in API charges may be waste if Claude Max is supposed to cover it.", RED_WARN)

sub_head(doc, "MONTHLY RUNNING TOTAL")
body(doc, "Claude Max flat subscription: $200.00/month (March 29 activation)")
body(doc, "Estimated extra API charges (Apr 1-7): ~$97+ (separate billing issue)")
body(doc, "Total April exposure (estimated): ~$297 if API key not disabled")
body(doc, "Target: $200 flat only. Savings vs. prior API-only usage: TBD once fully switched.")

body(doc, "")
body(doc, "─" * 60)
body(doc, "")
p = doc.add_paragraph()
p.alignment = WD_ALIGN_PARAGRAPH.CENTER
r = p.add_run("Make good decisions today, Joe. 🦞  — Rob Lobster")
r.bold = True
r.italic = True
r.font.size = Pt(10)
r.font.color.rgb = GOLD

# ─── SAVE ─────────────────────────────────────────────────────────────────────
os.makedirs(os.path.dirname(OUTPUT_PATH), exist_ok=True)
doc.save(OUTPUT_PATH)
print(f"✅  Saved: {OUTPUT_PATH}")
