"""Professional GEO Report Generator — client-ready HTML + PDF.""" import json from pathlib import Path from datetime import datetime def build_html_report(job_dir: str) -> str: p = Path(job_dir) audit = {} analysis = {} recs = {} for fname, target in [('audit.json', 'audit'), ('analysis.json', 'analysis'), ('recommendations.json', 'recs')]: path = p / fname if path.exists(): try: data = json.loads(path.read_text(encoding='utf-8')) if target == 'audit': audit = data elif target == 'analysis': analysis = data elif target == 'recs': recs = data except Exception: pass pages = audit.get('pages', []) org = audit.get('org_name') or (pages[0].get('title') if pages else 'Website') url = audit.get('url') or (pages[0].get('url') if pages else '') geo = analysis.get('geo_score') or {} score = geo.get('score', 0) status = geo.get('status', 'N/A') breakdown = geo.get('breakdown', {}) actions = recs.get('actions', []) if isinstance(recs, dict) else [] per_page = recs.get('per_page', []) if isinstance(recs, dict) else [] date_str = datetime.utcnow().strftime('%Y-%m-%d') score_color = '#10b981' if score >= 75 else '#f59e0b' if score >= 40 else '#ef4444' def bar(val, max_val=20, color='#00f2ff'): pct = min(100, int((val / max_val) * 100)) return f'
{url}
تاريخ التقرير: {date_str} · الحالة: {status}
الصفحات المحللة: {total_pages} · المشاكل المكتشفة: {total_issues}
لا توجد توصيات — شغّل تحليل الذكاء الاصطناعي أولاً.
' if not actions else f'''| # | الأولوية | الإجراء المطلوب |
|---|
لا توجد بيانات صفحات.
' if not per_page else f'''| الصفحة | الحالة | المشاكل |
|---|
{reason}
' results = ai_vis.get('results', []) rows = ''.join(f'''| الاستعلام | النتيجة |
|---|