import json
from datetime import datetime
from flask import Blueprint, render_template, request, redirect, url_for, flash, jsonify, current_app
from flask_login import login_required, current_user
from app.extensions import db, csrf
from app.models.report import Report
from app.models.services import IncubatorApplication, IncubatorPartner

incubator_bp = Blueprint("incubator", __name__, url_prefix="/incubator")

KNOWN_INCUBATORS = [
    {"name": "Badir Program", "name_ar": "برنامج بادر لحاضنات التقنية", "city": "الرياض", "website": "https://badir.com.sa"},
    {"name": "Flat6Labs Jeddah", "name_ar": "فلات6لابز جدة", "city": "جدة", "website": "https://flat6labs.com"},
    {"name": "Monsha'at", "name_ar": "منشآت", "city": "الرياض", "website": "https://monshaat.gov.sa"},
    {"name": "KAUST Innovation", "name_ar": "ابتكار كاوست", "city": "ثول", "website": "https://innovation.kaust.edu.sa"},
    {"name": "Wadi Makkah", "name_ar": "وادي مكة للتقنية", "city": "مكة", "website": "https://wvm.com.sa"},
    {"name": "Eastern Province Chamber", "name_ar": "غرفة الشرقية", "city": "الدمام", "website": "https://chamber.sa"},
    {"name": "Riyadh Valley Company", "name_ar": "شركة وادي الرياض", "city": "الرياض", "website": "https://rvc.com.sa"},
    {"name": "Wa'ed Ventures", "name_ar": "واعد", "city": "الظهران", "website": "https://waed.net"},
    {"name": "Hub71 Abu Dhabi", "name_ar": "هب71 أبوظبي", "city": "أبوظبي", "website": "https://hub71.com"},
    {"name": "In5 Dubai", "name_ar": "إن5 دبي", "city": "دبي", "website": "https://infive.ae"},
]


@incubator_bp.route("/apply/<int:report_id>", methods=["GET", "POST"])
@login_required
def apply(report_id):
    report = Report.query.get_or_404(report_id)
    if report.user_id != current_user.id:
        return redirect(url_for("dashboard.index"))

    if request.method == "POST":
        incubator_name = request.form.get("incubator_name", "")
        incubator_type = request.form.get("incubator_type", "accelerator")

        app_entry = IncubatorApplication(
            user_id=current_user.id,
            report_id=report.id,
            incubator_name=incubator_name,
            incubator_type=incubator_type,
            status="draft",
        )
        db.session.add(app_entry)
        db.session.commit()

        return redirect(url_for("incubator.edit", app_id=app_entry.id))

    applications = IncubatorApplication.query.filter_by(
        report_id=report_id, user_id=current_user.id
    ).order_by(IncubatorApplication.created_at.desc()).all()

    partners = IncubatorPartner.query.filter_by(is_active=True).all()

    return render_template(
        "incubator/apply.html",
        report=report,
        applications=applications,
        incubators=KNOWN_INCUBATORS,
        partners=partners,
    )


@incubator_bp.route("/edit/<int:app_id>", methods=["GET", "POST"])
@login_required
def edit(app_id):
    application = IncubatorApplication.query.get_or_404(app_id)
    if application.user_id != current_user.id:
        return redirect(url_for("dashboard.index"))

    if request.method == "POST":
        project_summary = request.form.get("project_summary", "").strip()
        application.application_data_json = {
            "team_size": request.form.get("team_size", ""),
            "stage": request.form.get("stage", ""),
            "funding_needed": request.form.get("funding_needed", ""),
            "traction": request.form.get("traction", ""),
            "unique_value": request.form.get("unique_value", ""),
            "project_summary": project_summary,
        }
        if project_summary:
            application.ai_application_text = project_summary
        application.status = "ready"
        db.session.commit()
        flash("تم حفظ بيانات الطلب", "success")
        return redirect(url_for("incubator.apply", report_id=application.report_id))

    return render_template("incubator/edit.html", application=application)


@incubator_bp.route("/api/fill-form", methods=["POST"])
@login_required
@csrf.exempt
def api_fill_form():
    """AI fills the form fields with smart suggestions based on report data."""
    data = request.get_json() or {}
    app_id = data.get("application_id")

    application = IncubatorApplication.query.get_or_404(app_id)
    if application.user_id != current_user.id:
        return jsonify({"error": "Unauthorized"}), 403

    report = application.report
    synthesis = report.synthesis_result or {}
    lang = getattr(current_user, "language_pref", "ar") or "ar"
    lang_name = "Arabic" if lang == "ar" else "English"

    prompt = f"""You are an expert at filling incubator/accelerator application forms.
Based on the project data below, generate smart, realistic values for each form field.

Project Name: {report.project_name}
Description: {report.project_description}
Executive Summary: {synthesis.get('executive_summary', '')}
Market Analysis: {json.dumps(synthesis.get('market_analysis', {}), ensure_ascii=False)[:500]}
Financial: {json.dumps(synthesis.get('financial_projections', {}), ensure_ascii=False)[:500]}

Target Incubator: {application.incubator_name}

Return ONLY a valid JSON object with these exact keys (respond in {lang_name}):
{{
  "team_size": "realistic team composition, e.g. 2 co-founders + 3 developers",
  "stage": "one of: idea, mvp, beta, launched, growth",
  "funding_needed": "realistic funding amount with currency",
  "traction": "realistic traction metrics based on the project type",
  "unique_value": "compelling unique value proposition, 2-3 sentences max"
}}

IMPORTANT: Return ONLY the JSON object, no markdown, no explanation."""

    from app.ai.diamond import call_ai, run_sync

    try:
        messages = [
            {"role": "system", "content": "You return only valid JSON. No markdown fences, no extra text."},
            {"role": "user", "content": prompt},
        ]
        result = run_sync(call_ai(messages, model_type="fast"))

        # Parse the JSON from AI response
        result_clean = result.strip()
        if result_clean.startswith("```"):
            result_clean = result_clean.split("\n", 1)[-1].rsplit("```", 1)[0].strip()

        fields = json.loads(result_clean)

        # Validate stage value
        valid_stages = ["idea", "mvp", "beta", "launched", "growth"]
        if fields.get("stage", "").lower() not in valid_stages:
            fields["stage"] = "idea"
        else:
            fields["stage"] = fields["stage"].lower()

        return jsonify({"fields": fields})
    except json.JSONDecodeError:
        return jsonify({"error": "AI returned invalid format. Please try again."}), 500
    except Exception as e:
        current_app.logger.error(f"Fill form AI error: {e}")
        return jsonify({"error": str(e)}), 500


@incubator_bp.route("/api/generate-application", methods=["POST"])
@login_required
@csrf.exempt
def api_generate_application():
    """Generate full application text after form is filled."""
    data = request.get_json() or {}
    app_id = data.get("application_id")

    application = IncubatorApplication.query.get_or_404(app_id)
    if application.user_id != current_user.id:
        return jsonify({"error": "Unauthorized"}), 403

    report = application.report
    synthesis = report.synthesis_result or {}
    # Accept form_data from request (sent by JS after AI fill) or fall back to saved data
    form_data = data.get("form_data")
    if form_data and isinstance(form_data, dict):
        app_data = form_data
        # Also save to DB so it persists
        application.application_data_json = form_data
    else:
        app_data = application.application_data_json or {}

    import json as _json
    market_summary = synthesis.get("market_analysis_summary", "")
    financial = synthesis.get("financial_highlights", {})
    financial_str = _json.dumps(financial, ensure_ascii=False)[:600] if isinstance(financial, dict) else str(financial)[:600]
    competitive = synthesis.get("competitive_analysis_summary", "")
    tam_sam = synthesis.get("tam_sam_som", {})
    tam_str = _json.dumps(tam_sam, ensure_ascii=False)[:400] if isinstance(tam_sam, dict) else str(tam_sam)[:400]
    swot = synthesis.get("swot", {})
    strengths = swot.get("strengths", []) if isinstance(swot, dict) else []
    bmc = synthesis.get("business_model_canvas", {})
    revenue_streams = bmc.get("revenue_streams", []) if isinstance(bmc, dict) else []
    recommendations = synthesis.get("recommendations", [])

    prompt = f"""أنت خبير محترف في كتابة طلبات الانضمام لحاضنات ومسرعات الأعمال. مطلوب منك كتابة طلب انضمام تفصيلي واحترافي لحاضنة "{application.incubator_name}".

=== بيانات المشروع ===
اسم المشروع: {report.project_name}
وصف المشروع: {report.project_description}
حجم الفريق: {app_data.get('team_size', 'غير محدد')}
مرحلة المشروع: {app_data.get('stage', 'غير محدد')}
التمويل المطلوب: {app_data.get('funding_needed', 'غير محدد')}
الجذب/Traction: {app_data.get('traction', 'غير محدد')}
القيمة الفريدة: {app_data.get('unique_value', 'غير محدد')}

=== بيانات من دراسة الجدوى ===
الملخص التنفيذي: {synthesis.get('executive_summary', '')}
تحليل السوق: {market_summary}
حجم السوق (TAM/SAM/SOM): {tam_str}
التحليل المالي: {financial_str}
التحليل التنافسي: {competitive}
نقاط القوة: {', '.join(str(s) for s in strengths[:5]) if strengths else 'غير متوفر'}
مصادر الإيرادات: {', '.join(str(r) for r in revenue_streams[:5]) if revenue_streams else 'غير متوفر'}
التوصيات: {', '.join(str(r) for r in recommendations[:3]) if recommendations else 'غير متوفر'}

=== المطلوب ===
اكتب طلب انضمام مفصّل ومقنع يتضمن الأقسام الثمانية التالية. كل قسم يجب أن يكون فقرة كاملة (3-5 جمل على الأقل) وليس مجرد نقاط مختصرة:

1. الملخص التنفيذي — لخّص المشروع وأهدافه وحجم السوق والميزة التنافسية والتوقعات المالية في فقرة شاملة ومقنعة.
2. وصف المشكلة والحل — اشرح المشكلة التي يحلها المشروع والحل المقترح بالتفصيل.
3. حجم السوق والفرصة — استخدم بيانات TAM/SAM/SOM ومعدل النمو لإظهار حجم الفرصة.
4. نموذج العمل — اشرح كيف يحقق المشروع الإيرادات (اشتراكات، خدمات، إلخ) بالتفصيل.
5. الميزة التنافسية — ما الذي يميز المشروع عن المنافسين وما هي نقاط القوة الفريدة.
6. الفريق والخبرات — صف تكوين الفريق وخبراتهم وكيف يضمنون نجاح المشروع.
7. خطة استخدام التمويل/الدعم — كيف سيتم استخدام التمويل المطلوب (تطوير، تسويق، توظيف، إلخ).
8. الأهداف خلال فترة الحضانة — أهداف محددة وقابلة للقياس خلال فترة الحضانة.

مهم جداً:
- اكتب كل قسم كفقرة نصية كاملة ومفصلة (وليس نقاط مختصرة).
- استخدم الأرقام والإحصائيات من البيانات المتوفرة.
- اجعل النص مقنعاً واحترافياً كأنه طلب حقيقي لحاضنة أعمال.
- أجب بتنسيق HTML نظيف: استخدم <h3> للعناوين و <p> للفقرات. لا تستخدم markdown."""

    from app.ai.diamond import call_ai, run_sync

    try:
        messages = [{"role": "system", "content": "أنت خبير في كتابة طلبات الانضمام لحاضنات الأعمال."}, {"role": "user", "content": prompt}]
        result = run_sync(call_ai(messages, model_type="deep"))

        application.ai_application_text = result
        application.status = "generated"
        db.session.commit()

        return jsonify({"text": result})
    except Exception as e:
        return jsonify({"error": str(e)}), 500


# --- Open API for External Incubator Partners ---

@incubator_bp.route("/api/v1/applications", methods=["GET"])
@csrf.exempt
def partner_api_list_applications():
    api_key = request.headers.get("X-API-Key", "")
    if not api_key:
        return jsonify({"error": "API key required"}), 401

    from werkzeug.security import check_password_hash
    partner = IncubatorPartner.query.filter_by(is_active=True).all()
    authorized = None
    for p in partner:
        if p.api_key_hash and check_password_hash(p.api_key_hash, api_key):
            authorized = p
            break

    if not authorized:
        return jsonify({"error": "Invalid API key"}), 403

    applications = IncubatorApplication.query.filter_by(
        incubator_name=authorized.name,
        status="submitted",
    ).all()

    result = []
    for app in applications:
        result.append({
            "id": app.id,
            "project_name": app.report.project_name if app.report else "",
            "project_description": app.report.project_description if app.report else "",
            "application_data": app.application_data_json,
            "pitch_summary": app.pitch_summary,
            "submitted_at": app.submitted_at.isoformat() if app.submitted_at else None,
        })

    return jsonify({"applications": result, "count": len(result)})


@incubator_bp.route("/api/v1/applications/<int:app_id>/respond", methods=["POST"])
@csrf.exempt
def partner_api_respond(app_id):
    api_key = request.headers.get("X-API-Key", "")
    if not api_key:
        return jsonify({"error": "API key required"}), 401

    from werkzeug.security import check_password_hash
    partner = IncubatorPartner.query.filter_by(is_active=True).all()
    authorized = None
    for p in partner:
        if p.api_key_hash and check_password_hash(p.api_key_hash, api_key):
            authorized = p
            break

    if not authorized:
        return jsonify({"error": "Invalid API key"}), 403

    application = IncubatorApplication.query.get_or_404(app_id)
    data = request.get_json() or {}
    application.response_status = data.get("status", "reviewed")
    db.session.commit()

    return jsonify({"success": True, "application_id": app_id})
