#!/usr/bin/env python3
import argparse, csv, json
from pathlib import Path
from datetime import datetime

SUGGESTIONS = {
    'CRITICAL': [
        'Start a same-day recovery huddle (15 min) with owner + dependencies.',
        'Cut or defer non-critical tasks; protect timeline-critical path only.',
        'Escalate blocker to executive sponsor if unresolved by end of day.'
    ],
    'WATCH': [
        'Run a 24-hour catch-up plan with explicit owner checkpoints.',
        'Convert ambiguous tasks into named deliverables with due times.',
        'Escalate vendor/approval dependencies before noon next business day.'
    ],
    'ON_TRACK': [
        'Keep current cadence and protect focus time on top 3 priorities.',
        'Pre-clear next 48h dependencies to avoid future slippage.',
        'Document playbook wins that can be replicated across other buckets.'
    ]
}

def status(schedule_pct, blocked_count, on_track=95, watch=85):
    pct = float(schedule_pct)
    blk = int(blocked_count)
    if pct < watch or blk >= 4:
        return 'CRITICAL'
    if pct < on_track or blk >= 2:
        return 'WATCH'
    return 'ON_TRACK'

def load_config(path):
    return json.loads(Path(path).read_text())

def main():
    p = argparse.ArgumentParser()
    p.add_argument('--date', required=False)
    p.add_argument('--data', default='daily_updates.csv')
    p.add_argument('--config', default='config.json')
    args = p.parse_args()

    base = Path(__file__).resolve().parent
    cfg = load_config(base / args.config)
    run_date = args.date or datetime.utcnow().strftime('%Y-%m-%d')

    rows = []
    with open(base / args.data, newline='') as f:
        for r in csv.DictReader(f):
            if r.get('date') == run_date:
                rows.append(r)

    if not rows:
        raise SystemExit(f'No rows found for date {run_date}')

    thresholds = cfg.get('thresholds', {})
    on_track = thresholds.get('on_track_pct', 95)
    watch = thresholds.get('watch_pct', 85)

    scored = []
    for r in rows:
        st = status(r['schedule_pct'], r['blocked_count'], on_track, watch)
        scored.append({**r, 'status': st, 'suggestions': SUGGESTIONS[st]})

    out = base / 'outputs'
    out.mkdir(exist_ok=True)

    # manager prompts
    mp = out / f'manager_prompts_{run_date}.md'
    lines = [f'# Manager Prompts — {run_date}', '']
    for r in scored:
        lines += [
            f"## {r['bucket']} ({r['status']}) — {r['owner']}",
            f"- Schedule: {r['schedule_pct']}% ({r['completed_tasks']}/{r['planned_tasks']} tasks)",
            f"- Blockers: {r['blocked_count']} | Biggest blocker: {r['biggest_blocker']}",
            f"- Next 48h commitment: {r['next_48h_commitment']}",
            '- Suggested actions:',
        ]
        for s in r['suggestions']:
            lines.append(f'  - {s}')
        lines.append('')
    mp.write_text('\n'.join(lines))

    # executive digest
    ex = out / f'executive_digest_{run_date}.md'
    crit = [r for r in scored if r['status']=='CRITICAL']
    watchs = [r for r in scored if r['status']=='WATCH']
    ok = [r for r in scored if r['status']=='ON_TRACK']
    ex_lines = [
        f'# Executive Digest — {run_date}',
        '',
        f"- CRITICAL: {len(crit)} | WATCH: {len(watchs)} | ON_TRACK: {len(ok)}",
        f"- Total blockers: {sum(int(r['blocked_count']) for r in scored)}",
        '',
        '## Immediate Attention Required',
    ]
    if crit:
        for r in crit:
            ex_lines.append(f"- {r['bucket']}: {r['schedule_pct']}% schedule, {r['blocked_count']} blockers, owner {r['owner']}")
    else:
        ex_lines.append('- None')

    ex_lines += ['', '## Top Recovery Actions (next 24h)']
    for r in crit + watchs[:2]:
        ex_lines.append(f"- {r['bucket']}: {r['suggestions'][0]}")

    ex_lines += ['', '## Owner Support Requests']
    for r in scored:
        if r['support_needed'] and r['support_needed'].lower() != 'none':
            ex_lines.append(f"- {r['bucket']} ({r['owner']}): {r['support_needed']}")
    ex.write_text('\n'.join(ex_lines))

    # dashboard rollup json
    dr = out / f'dashboard_rollup_{run_date}.json'
    roll = {
        'date': run_date,
        'summary': {
            'critical': len(crit),
            'watch': len(watchs),
            'on_track': len(ok),
            'total_blockers': sum(int(r['blocked_count']) for r in scored)
        },
        'buckets': [
            {
                'bucket_id': r['bucket_id'],
                'bucket': r['bucket'],
                'owner': r['owner'],
                'status': r['status'],
                'schedule_pct': float(r['schedule_pct']),
                'blocked_count': int(r['blocked_count']),
                'next_48h_commitment': r['next_48h_commitment']
            } for r in scored
        ]
    }
    dr.write_text(json.dumps(roll, indent=2))

    print(mp)
    print(ex)
    print(dr)

if __name__ == '__main__':
    main()
