"""
Local AI fallback for generating notebook-style assets
when NotebookLM is unavailable or fails.
Uses the existing call_ai infrastructure.
"""
import json
import os
from flask import current_app
from app.ai.diamond import call_ai, run_sync


def _get_uploads_dir(report_id):
    base = os.path.join(current_app.static_folder, "uploads", "notebooks", str(report_id))
    os.makedirs(base, exist_ok=True)
    return base


def _report_context(report, max_len=2000):
    """Build a concise context string from the report."""
    parts = [f"اسم المشروع: {report.project_name}", f"الوصف: {report.project_description}"]
    syn = report.synthesis_result
    if isinstance(syn, dict):
        if syn.get("executive_summary"):
            parts.append(f"الملخص التنفيذي: {str(syn['executive_summary'])[:600]}")
        if syn.get("strengths"):
            parts.append(f"نقاط القوة: {json.dumps(syn['strengths'], ensure_ascii=False)[:300]}")
        if syn.get("risks"):
            parts.append(f"المخاطر: {json.dumps(syn['risks'], ensure_ascii=False)[:300]}")
        if syn.get("financial_summary"):
            parts.append(f"الملخص المالي: {json.dumps(syn['financial_summary'], ensure_ascii=False)[:400]}")
    text = "\n".join(parts)
    return text[:max_len]


def generate_audio_script(report):
    """Generate a podcast-style audio script as HTML."""
    ctx = _report_context(report)
    prompt = f"""أنت مقدم بودكاست محترف. اكتب نص حلقة بودكاست (10-15 دقيقة) عن دراسة الجدوى التالية.
اجعل الأسلوب حواري وجذاب بين مقدمَين (أحمد وسارة).

{ctx}

اكتب النص بتنسيق HTML جاهز للعرض. استخدم <h2> للعناوين و<p> للفقرات و<strong> لاسم المتحدث.
ابدأ بمقدمة ترحيبية، ثم ناقش المشروع والسوق والمالية والمخاطر، واختم بتوصيات."""

    messages = [
        {"role": "system", "content": "أنت كاتب محتوى بودكاست محترف. اكتب HTML فقط بدون markdown."},
        {"role": "user", "content": prompt},
    ]
    result = run_sync(call_ai(messages, model_type="fast"))
    # Clean markdown fences if any
    result = result.strip()
    if result.startswith("```"):
        result = result.split("\n", 1)[-1].rsplit("```", 1)[0].strip()
    return result


def generate_video_script(report):
    """Generate a video script/storyboard as HTML."""
    ctx = _report_context(report)
    prompt = f"""أنت مخرج فيديو محترف. اكتب سيناريو فيديو توضيحي (5-7 دقائق) عن دراسة الجدوى التالية.
قسّم الفيديو إلى مشاهد مع وصف بصري ونص التعليق الصوتي.

{ctx}

اكتب بتنسيق HTML. لكل مشهد استخدم:
<div class="scene">
<h3>المشهد X: العنوان</h3>
<p class="visual">🎬 الوصف البصري</p>
<p class="narration">🎙 التعليق الصوتي</p>
</div>

اشمل: مقدمة، عرض المشروع، تحليل السوق، الأرقام المالية، المخاطر، الخلاصة."""

    messages = [
        {"role": "system", "content": "أنت كاتب سيناريو فيديو محترف. اكتب HTML فقط."},
        {"role": "user", "content": prompt},
    ]
    result = run_sync(call_ai(messages, model_type="fast"))
    result = result.strip()
    if result.startswith("```"):
        result = result.split("\n", 1)[-1].rsplit("```", 1)[0].strip()
    return result


def generate_infographic_html(report):
    """Generate an infographic as styled HTML."""
    ctx = _report_context(report)
    prompt = f"""أنت مصمم إنفوجرافيك محترف. صمم إنفوجرافيك شامل عن دراسة الجدوى التالية.

{ctx}

اكتب HTML + CSS مضمّن (inline styles) لإنفوجرافيك جميل وملون. استخدم:
- خلفية متدرجة داكنة
- بطاقات ملونة لكل قسم
- أيقونات إيموجي كبيرة
- أرقام بارزة وكبيرة
- ألوان: ذهبي #C5A059، أزرق #3B82F6، أخضر #10B981، أحمر #EF4444

الأقسام: نظرة عامة، السوق المستهدف، الأرقام المالية الرئيسية، نقاط القوة، المخاطر، التوصية النهائية.
اجعل التصميم عمودي ومناسب للطباعة."""

    messages = [
        {"role": "system", "content": "أنت مصمم إنفوجرافيك. اكتب HTML مع CSS مضمّن فقط. لا تستخدم markdown."},
        {"role": "user", "content": prompt},
    ]
    result = run_sync(call_ai(messages, model_type="fast"))
    result = result.strip()
    if result.startswith("```"):
        result = result.split("\n", 1)[-1].rsplit("```", 1)[0].strip()
    return result


def generate_slide_deck_html(report):
    """Generate a presentation as HTML slides."""
    ctx = _report_context(report)
    prompt = f"""أنت مصمم عروض تقديمية محترف. صمم عرض تقديمي (10-12 شريحة) عن دراسة الجدوى التالية.

{ctx}

اكتب HTML + CSS مضمّن. كل شريحة في <div class="slide"> بحجم ثابت.
استخدم:
- خلفيات متدرجة مختلفة لكل شريحة
- خطوط كبيرة وواضحة
- أيقونات إيموجي
- ألوان احترافية

الشرائح: غلاف، نظرة عامة، المشكلة والحل، السوق المستهدف، نموذج العمل، التحليل المالي، المنافسة، نقاط القوة، المخاطر، خطة التنفيذ، التوصية، شكراً."""

    messages = [
        {"role": "system", "content": "أنت مصمم عروض تقديمية. اكتب HTML مع CSS مضمّن فقط."},
        {"role": "user", "content": prompt},
    ]
    result = run_sync(call_ai(messages, model_type="fast"))
    result = result.strip()
    if result.startswith("```"):
        result = result.split("\n", 1)[-1].rsplit("```", 1)[0].strip()
    return result


def generate_report_md(report):
    """Generate a detailed report as markdown/HTML."""
    ctx = _report_context(report, max_len=3000)
    prompt = f"""اكتب تقريراً تفصيلياً شاملاً عن دراسة الجدوى التالية بتنسيق HTML.

{ctx}

اشمل: ملخص تنفيذي، وصف المشروع، تحليل السوق، التحليل المالي، التحليل التنافسي، المخاطر، التوصيات.
استخدم <h2> و<h3> و<p> و<ul> و<table> حسب الحاجة. اجعله احترافياً ومفصلاً."""

    messages = [
        {"role": "system", "content": "أنت محلل أعمال. اكتب HTML فقط."},
        {"role": "user", "content": prompt},
    ]
    result = run_sync(call_ai(messages, model_type="fast"))
    result = result.strip()
    if result.startswith("```"):
        result = result.split("\n", 1)[-1].rsplit("```", 1)[0].strip()
    return result


def generate_quiz_json(report):
    """Generate a quiz as JSON."""
    ctx = _report_context(report)
    prompt = f"""بناءً على دراسة الجدوى التالية، أنشئ اختبار من 10 أسئلة اختيار من متعدد.

{ctx}

أرجع JSON فقط بالتنسيق:
[
  {{"question": "السؤال", "options": ["أ", "ب", "ج", "د"], "correct": 0, "explanation": "التوضيح"}}
]"""

    messages = [
        {"role": "system", "content": "أنت معلم. أرجع JSON فقط بدون أي نص إضافي."},
        {"role": "user", "content": prompt},
    ]
    result = run_sync(call_ai(messages, model_type="fast"))
    result = result.strip()
    if result.startswith("```"):
        result = result.split("\n", 1)[-1].rsplit("```", 1)[0].strip()
    return json.loads(result)


def generate_flashcards_json(report):
    """Generate flashcards as JSON."""
    ctx = _report_context(report)
    prompt = f"""بناءً على دراسة الجدوى التالية، أنشئ 15 بطاقة تعليمية.

{ctx}

أرجع JSON فقط بالتنسيق:
[
  {{"front": "السؤال أو المفهوم", "back": "الإجابة أو الشرح"}}
]"""

    messages = [
        {"role": "system", "content": "أنت معلم. أرجع JSON فقط."},
        {"role": "user", "content": prompt},
    ]
    result = run_sync(call_ai(messages, model_type="fast"))
    result = result.strip()
    if result.startswith("```"):
        result = result.split("\n", 1)[-1].rsplit("```", 1)[0].strip()
    return json.loads(result)


def generate_mind_map_json(report):
    """Generate a mind map as JSON."""
    ctx = _report_context(report)
    prompt = f"""بناءً على دراسة الجدوى التالية، أنشئ خريطة ذهنية.

{ctx}

أرجع JSON فقط بالتنسيق:
{{
  "title": "اسم المشروع",
  "children": [
    {{"title": "الفرع", "children": [{{"title": "الفرع الفرعي"}}]}}
  ]
}}"""

    messages = [
        {"role": "system", "content": "أنت محلل. أرجع JSON فقط."},
        {"role": "user", "content": prompt},
    ]
    result = run_sync(call_ai(messages, model_type="fast"))
    result = result.strip()
    if result.startswith("```"):
        result = result.split("\n", 1)[-1].rsplit("```", 1)[0].strip()
    return json.loads(result)


# Map asset_type -> (generator_function, file_extension)
LOCAL_GENERATORS = {
    "audio": (generate_audio_script, "html"),
    "video": (generate_video_script, "html"),
    "infographic": (generate_infographic_html, "html"),
    "slide_deck": (generate_slide_deck_html, "html"),
    "report": (generate_report_md, "html"),
    "quiz": (generate_quiz_json, "json"),
    "flashcards": (generate_flashcards_json, "json"),
    "mind_map": (generate_mind_map_json, "json"),
}


def generate_local_asset(report, asset_type):
    """
    Generate an asset locally using AI.
    Returns (file_path, file_format).
    """
    if asset_type not in LOCAL_GENERATORS:
        raise ValueError(f"Unsupported asset type: {asset_type}")

    gen_func, fmt = LOCAL_GENERATORS[asset_type]
    result = gen_func(report)

    uploads_dir = _get_uploads_dir(report.id)
    file_path = os.path.join(uploads_dir, f"{asset_type}.{fmt}")

    if fmt == "json":
        with open(file_path, "w", encoding="utf-8") as f:
            json.dump(result, f, ensure_ascii=False, indent=2)
    else:
        with open(file_path, "w", encoding="utf-8") as f:
            f.write(result)

    return file_path, fmt
