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 (
    FactoryPartner, PrototypeRequest, PrototypeQuote, PrototypeMessage,
)

prototyping_bp = Blueprint("prototyping", __name__, url_prefix="/prototyping")

SEED_FACTORIES = [
    {"name": "SABIC Polymers Factory", "name_ar": "مصنع سابك للبوليمرات", "country": "SA", "city": "الجبيل",
     "website_url": "https://www.sabic.com", "email": "prototyping@sabic.com", "phone": "+966-13-341-0000",
     "sectors_json": ["بتروكيماويات", "بلاستيك", "صناعة"], "capabilities_json": ["حقن بلاستيك", "قوالب", "تشكيل"],
     "min_order": 100, "description": "Leading petrochemical manufacturer with prototyping capabilities",
     "description_ar": "مصنع رائد في البتروكيماويات مع إمكانيات النماذج الأولية", "is_verified": True},
    {"name": "Saudi Industrial Development", "name_ar": "التنمية الصناعية السعودية", "country": "SA", "city": "الرياض",
     "website_url": "https://www.sid.sa", "email": "info@sid.sa", "phone": "+966-11-477-0000",
     "sectors_json": ["صناعة", "معادن", "إلكترونيات"], "capabilities_json": ["CNC", "تصنيع معادن", "لحام", "تجميع"],
     "min_order": 10, "description": "Full-service industrial manufacturing and prototyping",
     "description_ar": "تصنيع صناعي شامل ونماذج أولية", "is_verified": True},
    {"name": "Jeddah Industrial City Factory", "name_ar": "مصنع المدينة الصناعية بجدة", "country": "SA", "city": "جدة",
     "website_url": "https://www.modon.gov.sa", "email": "factory@jic.sa", "phone": "+966-12-635-0000",
     "sectors_json": ["أغذية", "تعبئة", "صناعة"], "capabilities_json": ["تعبئة وتغليف", "طباعة", "تشكيل"],
     "min_order": 50, "description": "Food processing and packaging prototyping",
     "description_ar": "نماذج أولية لتصنيع وتعبئة الأغذية", "is_verified": True},
    {"name": "Dammam Steel Works", "name_ar": "مصنع الدمام للصلب", "country": "SA", "city": "الدمام",
     "website_url": "https://www.dsw.sa", "email": "proto@dsw.sa", "phone": "+966-13-847-0000",
     "sectors_json": ["معادن", "إنشاءات", "صناعة"], "capabilities_json": ["قطع ليزر", "CNC", "لحام", "تشكيل معادن"],
     "min_order": 5, "description": "Precision metal fabrication and steel prototyping",
     "description_ar": "تصنيع معادن دقيق ونماذج أولية من الصلب", "is_verified": True},
    {"name": "Riyadh 3D Print Lab", "name_ar": "مختبر الطباعة ثلاثية الأبعاد - الرياض", "country": "SA", "city": "الرياض",
     "website_url": "https://www.r3dlab.sa", "email": "orders@r3dlab.sa", "phone": "+966-11-290-0000",
     "sectors_json": ["تقنية", "طبي", "صناعة"], "capabilities_json": ["طباعة 3D SLA", "طباعة 3D FDM", "طباعة معادن", "نمذجة سريعة"],
     "min_order": 1, "description": "Rapid prototyping with industrial 3D printers",
     "description_ar": "نمذجة سريعة بطابعات ثلاثية الأبعاد صناعية", "is_verified": True},
    {"name": "Dubai Industrial City Manufacturing", "name_ar": "تصنيع مدينة دبي الصناعية", "country": "AE", "city": "دبي",
     "website_url": "https://www.dic.ae", "email": "mfg@dic.ae", "phone": "+971-4-815-0000",
     "sectors_json": ["صناعة", "إلكترونيات", "سيارات"], "capabilities_json": ["CNC", "حقن بلاستيك", "تجميع إلكتروني"],
     "min_order": 10, "description": "Multi-capability manufacturing hub in Dubai",
     "description_ar": "مركز تصنيع متعدد القدرات في دبي", "is_verified": True},
    {"name": "Sharjah Precision Engineering", "name_ar": "الشارقة للهندسة الدقيقة", "country": "AE", "city": "الشارقة",
     "website_url": "https://www.spe.ae", "email": "info@spe.ae", "phone": "+971-6-534-0000",
     "sectors_json": ["صناعة", "طيران", "طبي"], "capabilities_json": ["CNC دقيق", "EDM", "تشكيل", "معالجة حرارية"],
     "min_order": 5, "description": "High-precision engineering and aerospace-grade prototyping",
     "description_ar": "هندسة عالية الدقة ونماذج أولية بمعايير الطيران", "is_verified": True},
    {"name": "Shenzhen Electronics Hub", "name_ar": "مركز شنجن للإلكترونيات", "country": "CN", "city": "شنجن",
     "website_url": "https://www.szehub.cn", "email": "orders@szehub.cn", "phone": "+86-755-8888-0000",
     "sectors_json": ["إلكترونيات", "تقنية", "IoT"], "capabilities_json": ["PCB", "تجميع SMT", "حقن بلاستيك", "تصنيع إلكتروني"],
     "min_order": 50, "description": "Electronics prototyping and small-batch manufacturing",
     "description_ar": "نماذج أولية إلكترونية وتصنيع دفعات صغيرة", "is_verified": True},
    {"name": "Shenzhen Rapid Mold Co.", "name_ar": "شنجن للقوالب السريعة", "country": "CN", "city": "شنجن",
     "website_url": "https://www.szrapidmold.cn", "email": "sales@szrapidmold.cn", "phone": "+86-755-2666-0000",
     "sectors_json": ["صناعة", "بلاستيك", "سيارات"], "capabilities_json": ["قوالب حقن", "قوالب سيليكون", "طباعة 3D صناعية"],
     "min_order": 100, "description": "Injection mold tooling and plastic prototyping",
     "description_ar": "تصنيع قوالب الحقن ونماذج بلاستيكية أولية", "is_verified": True},
    {"name": "Yiwu General Manufacturing", "name_ar": "يوو للتصنيع العام", "country": "CN", "city": "يوو",
     "website_url": "https://www.ywgm.cn", "email": "info@ywgm.cn", "phone": "+86-579-8555-0000",
     "sectors_json": ["تجارة", "أغذية", "منتجات استهلاكية"], "capabilities_json": ["تعبئة", "طباعة", "تشكيل", "تجميع"],
     "min_order": 200, "description": "General consumer product manufacturing and packaging",
     "description_ar": "تصنيع منتجات استهلاكية عامة وتعبئة", "is_verified": True},
    {"name": "Istanbul Manufacturing Zone", "name_ar": "منطقة إسطنبول الصناعية", "country": "TR", "city": "إسطنبول",
     "website_url": "https://www.imz.com.tr", "email": "proto@imz.com.tr", "phone": "+90-212-555-0000",
     "sectors_json": ["نسيج", "أغذية", "صناعة"], "capabilities_json": ["نسيج", "خياطة", "تعبئة أغذية", "تشكيل معادن"],
     "min_order": 50, "description": "Textile, food, and general manufacturing prototyping",
     "description_ar": "نماذج أولية للنسيج والأغذية والتصنيع العام", "is_verified": True},
    {"name": "Ankara Precision Machining", "name_ar": "أنقرة للتشغيل الدقيق", "country": "TR", "city": "أنقرة",
     "website_url": "https://www.apm.com.tr", "email": "info@apm.com.tr", "phone": "+90-312-444-0000",
     "sectors_json": ["صناعة", "سيارات", "دفاع"], "capabilities_json": ["CNC 5 محاور", "تشكيل دقيق", "معالجة سطحية"],
     "min_order": 10, "description": "5-axis CNC machining and defense-grade prototyping",
     "description_ar": "تشغيل CNC خماسي المحاور ونماذج بمعايير دفاعية", "is_verified": True},
    {"name": "Cairo Industrial Complex", "name_ar": "المجمع الصناعي بالقاهرة", "country": "EG", "city": "القاهرة",
     "website_url": "https://www.cic-eg.com", "email": "info@cic-eg.com", "phone": "+20-2-2345-0000",
     "sectors_json": ["صناعة", "أغذية", "نسيج"], "capabilities_json": ["تصنيع عام", "تعبئة", "نسيج", "طباعة"],
     "min_order": 100, "description": "General manufacturing with competitive pricing",
     "description_ar": "تصنيع عام بأسعار تنافسية", "is_verified": True},
    {"name": "10th of Ramadan City Factory", "name_ar": "مصنع مدينة العاشر من رمضان", "country": "EG", "city": "العاشر من رمضان",
     "website_url": "https://www.10rc-factory.eg", "email": "orders@10rc.eg", "phone": "+20-2-4567-0000",
     "sectors_json": ["بلاستيك", "كيماويات", "صناعة"], "capabilities_json": ["حقن بلاستيك", "نفخ", "تشكيل حراري"],
     "min_order": 200, "description": "Plastics and chemical product manufacturing",
     "description_ar": "تصنيع منتجات بلاستيكية وكيماوية", "is_verified": True},
    {"name": "Abu Dhabi Advanced Manufacturing", "name_ar": "أبوظبي للتصنيع المتقدم", "country": "AE", "city": "أبوظبي",
     "website_url": "https://www.adam.ae", "email": "rfq@adam.ae", "phone": "+971-2-678-0000",
     "sectors_json": ["طاقة", "طيران", "تقنية"], "capabilities_json": ["طباعة معادن 3D", "CNC", "تصنيع مركبات", "اختبار"],
     "min_order": 1, "description": "Advanced manufacturing for energy and aerospace sectors",
     "description_ar": "تصنيع متقدم لقطاعي الطاقة والطيران", "is_verified": True},
]


def _seed_factories():
    for f in SEED_FACTORIES:
        db.session.add(FactoryPartner(**f))
    db.session.commit()


# ── Factory Directory ────────────────────────────────────────────────

@prototyping_bp.route("/")
@login_required
def index():
    country = request.args.get("country", "").strip()
    sector = request.args.get("sector", "").strip()
    q = request.args.get("q", "").strip()

    factories = FactoryPartner.query.filter_by(is_active=True).all()
    if not factories:
        _seed_factories()
        factories = FactoryPartner.query.filter_by(is_active=True).all()

    if country:
        factories = [f for f in factories if f.country == country]
    if sector:
        factories = [f for f in factories if f.sectors_json and sector in f.sectors_json]
    if q:
        factories = [f for f in factories if q.lower() in (f.name or "").lower() or q in (f.name_ar or "")]

    countries = sorted(set(f.country for f in FactoryPartner.query.filter_by(is_active=True).all()))
    all_sectors = set()
    for f in FactoryPartner.query.filter_by(is_active=True).all():
        if f.sectors_json:
            all_sectors.update(f.sectors_json)

    return render_template("prototyping/index.html",
                           factories=factories, countries=countries,
                           sectors=sorted(all_sectors), current_country=country,
                           current_sector=sector, q=q)


# ── Create Prototype Request ─────────────────────────────────────────

@prototyping_bp.route("/request/<int:report_id>", methods=["GET", "POST"])
@login_required
def create_request(report_id):
    report = Report.query.get_or_404(report_id)
    if report.user_id != current_user.id:
        return redirect(url_for("dashboard.index"))

    factory_id = request.args.get("factory_id", type=int)
    factory = FactoryPartner.query.get(factory_id) if factory_id else None

    # Find existing draft request for this report (to load saved NDA/cost)
    existing = PrototypeRequest.query.filter_by(
        user_id=current_user.id, report_id=report.id, status="draft"
    ).first()

    if request.method == "POST":
        proto = existing or PrototypeRequest(
            user_id=current_user.id,
            report_id=report.id,
        )
        proto.factory_id = request.form.get("factory_id", type=int)
        proto.title = request.form.get("title", report.project_name)
        proto.description = request.form.get("description", "")
        proto.quantity = request.form.get("quantity", 1, type=int)
        proto.budget_range = request.form.get("budget_range", "")
        proto.status = "sent"

        specs = request.form.get("specifications_json", "")
        if specs:
            try:
                proto.specifications_json = json.loads(specs)
            except Exception:
                proto.specifications_json = {"raw": specs}

        deadline_str = request.form.get("deadline", "")
        if deadline_str:
            try:
                proto.deadline = datetime.strptime(deadline_str, "%Y-%m-%d")
            except Exception:
                pass

        # Include approved NDA checkbox
        if request.form.get("include_nda") and proto.nda_status == "approved":
            pass  # NDA already attached

        if not existing:
            db.session.add(proto)
        db.session.commit()

        # Notify factory owner if factory has a linked user
        if proto.factory and proto.factory.user_id:
            from app.routes.notifications import notify
            notify(proto.factory.user_id,
                   "طلب نموذج أولي جديد",
                   f"تلقيت طلب نموذج أولي جديد: {proto.title}",
                   category="prototype",
                   link=url_for("prototyping.factory_view_request", req_id=proto.id))

        flash("تم إرسال طلب النموذج الأولي بنجاح", "success")
        return redirect(url_for("prototyping.view_request", req_id=proto.id))

    factories = FactoryPartner.query.filter_by(is_active=True).all()
    return render_template("prototyping/request.html",
                           report=report, factory=factory, factories=factories,
                           existing=existing)


# ── My Requests ──────────────────────────────────────────────────────

@prototyping_bp.route("/my-requests")
@login_required
def my_requests():
    reqs = PrototypeRequest.query.filter_by(user_id=current_user.id)\
        .order_by(PrototypeRequest.created_at.desc()).all()
    return render_template("prototyping/my_requests.html", requests=reqs)


# ── View Request Detail ──────────────────────────────────────────────

@prototyping_bp.route("/request/<int:req_id>/view")
@login_required
def view_request(req_id):
    proto = PrototypeRequest.query.get_or_404(req_id)
    if proto.user_id != current_user.id:
        return redirect(url_for("prototyping.my_requests"))
    quotes = PrototypeQuote.query.filter_by(request_id=req_id).order_by(PrototypeQuote.created_at.desc()).all()
    messages = PrototypeMessage.query.filter_by(request_id=req_id).order_by(PrototypeMessage.created_at.asc()).all()
    return render_template("prototyping/view_request.html",
                           proto=proto, quotes=quotes, messages=messages)


# ── Accept Quote ─────────────────────────────────────────────────────

@prototyping_bp.route("/request/<int:req_id>/accept-quote/<int:quote_id>", methods=["POST"])
@login_required
def accept_quote(req_id, quote_id):
    proto = PrototypeRequest.query.get_or_404(req_id)
    if proto.user_id != current_user.id:
        return redirect(url_for("prototyping.my_requests"))
    quote = PrototypeQuote.query.get_or_404(quote_id)
    if quote.request_id != req_id:
        flash("عرض سعر غير صالح", "error")
        return redirect(url_for("prototyping.view_request", req_id=req_id))
    quote.status = "accepted"
    proto.status = "in_production"
    # Reject other quotes
    for q in PrototypeQuote.query.filter_by(request_id=req_id).all():
        if q.id != quote_id:
            q.status = "rejected"
    db.session.commit()
    flash("تم قبول عرض السعر", "success")
    return redirect(url_for("prototyping.view_request", req_id=req_id))


# ── Send Message ─────────────────────────────────────────────────────

@prototyping_bp.route("/api/send-message/<int:req_id>", methods=["POST"])
@login_required
@csrf.exempt
def send_message(req_id):
    proto = PrototypeRequest.query.get_or_404(req_id)
    data = request.get_json() or {}
    # Determine sender type: factory owner or request owner
    sender_type = "user"
    is_factory_owner = proto.factory and proto.factory.user_id == current_user.id
    if is_factory_owner:
        sender_type = data.get("sender_type", "factory")
    elif proto.user_id != current_user.id:
        return jsonify({"error": "Unauthorized"}), 403
    msg_text = data.get("message", "").strip()
    if not msg_text:
        return jsonify({"error": "Message required"}), 400
    msg = PrototypeMessage(
        request_id=req_id,
        sender_id=current_user.id,
        sender_type=sender_type,
        message=msg_text,
    )
    db.session.add(msg)
    db.session.commit()
    return jsonify({"success": True, "message_id": msg.id})


# ── AI: Generate Product Specs ───────────────────────────────────────

@prototyping_bp.route("/api/generate-specs", methods=["POST"])
@login_required
@csrf.exempt
def api_generate_specs():
    data = request.get_json() or {}
    report_id = data.get("report_id")
    report = Report.query.get_or_404(report_id)
    if report.user_id != current_user.id:
        return jsonify({"error": "Unauthorized"}), 403

    synthesis = report.synthesis_result or {}
    prompt = f"""أنت مهندس منتجات متخصص. بناءً على بيانات دراسة الجدوى التالية، قم بإنشاء مواصفات تقنية تفصيلية للمنتج/النموذج الأولي.

اسم المشروع: {report.project_name}
وصف المشروع: {report.project_description}
الملخص التنفيذي: {synthesis.get('executive_summary', '')}
تعريف MVP: {json.dumps(synthesis.get('mvp_definition', {}), ensure_ascii=False)[:500]}

أرجع JSON بالتنسيق التالي:
{{
  "product_name": "اسم المنتج",
  "product_type": "نوع المنتج (إلكتروني/ميكانيكي/غذائي/برمجي+أجهزة/إلخ)",
  "materials": ["المادة 1", "المادة 2"],
  "dimensions": "الأبعاد التقريبية",
  "weight": "الوزن التقريبي",
  "components": ["المكون 1", "المكون 2"],
  "manufacturing_process": ["عملية 1", "عملية 2"],
  "quality_standards": ["معيار 1", "معيار 2"],
  "estimated_unit_cost": "التكلفة التقديرية للوحدة",
  "recommended_quantity": "الكمية الموصى بها للنموذج الأولي",
  "special_requirements": ["متطلب خاص 1"],
  "suggested_factories_type": "نوع المصنع المناسب"
}}

أرجع JSON فقط بدون أي نص إضافي."""

    from app.ai.diamond import call_ai, run_sync
    try:
        messages = [
            {"role": "system", "content": "أنت مهندس منتجات. أرجع JSON فقط."},
            {"role": "user", "content": prompt},
        ]
        result = run_sync(call_ai(messages, model_type="fast"))
        result_clean = result.strip()
        if result_clean.startswith("```"):
            result_clean = result_clean.split("\n", 1)[-1].rsplit("```", 1)[0].strip()
        specs = json.loads(result_clean)
        return jsonify({"specs": specs})
    except json.JSONDecodeError:
        return jsonify({"error": "AI returned invalid format", "raw": result}), 500
    except Exception as e:
        return jsonify({"error": str(e)}), 500


# ── AI: Generate NDA ─────────────────────────────────────────────────

@prototyping_bp.route("/api/generate-nda", methods=["POST"])
@login_required
@csrf.exempt
def api_generate_nda():
    data = request.get_json() or {}
    report_id = data.get("report_id")
    factory_name = data.get("factory_name", "")
    report = Report.query.get_or_404(report_id)
    if report.user_id != current_user.id:
        return jsonify({"error": "Unauthorized"}), 403

    prompt = f"""أنشئ اتفاقية عدم إفشاء (NDA) احترافية ثنائية اللغة (عربي/إنجليزي) بين:
- الطرف الأول (صاحب المشروع): [اسم صاحب المشروع]
- الطرف الثاني (المصنع): {factory_name or '[اسم المصنع]'}

المشروع: {report.project_name}
الوصف: {report.project_description}

يجب أن تتضمن الاتفاقية:
1. تعريف المعلومات السرية
2. التزامات الطرفين
3. مدة السرية (3 سنوات)
4. الاستثناءات
5. العقوبات والتعويضات
6. القانون الواجب التطبيق (المملكة العربية السعودية)
7. حل النزاعات
8. أحكام عامة

أجب بتنسيق HTML منظم."""

    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"))
        # Save NDA to existing draft or create one
        existing = PrototypeRequest.query.filter_by(
            user_id=current_user.id, report_id=report.id, status="draft"
        ).first()
        if not existing:
            existing = PrototypeRequest(
                user_id=current_user.id, report_id=report.id,
                title=report.project_name, status="draft",
            )
            db.session.add(existing)
        existing.nda_html = result
        existing.nda_status = "draft"
        existing.nda_generated_at = datetime.utcnow()
        db.session.commit()
        return jsonify({"nda": result, "request_id": existing.id})
    except Exception as e:
        return jsonify({"error": str(e)}), 500


# ── AI: Estimate Prototype Cost ──────────────────────────────────────

@prototyping_bp.route("/api/estimate-cost", methods=["POST"])
@login_required
@csrf.exempt
def api_estimate_cost():
    data = request.get_json() or {}
    report_id = data.get("report_id")
    specs = data.get("specs", {})
    quantity = data.get("quantity", 1)

    report = Report.query.get_or_404(report_id)
    if report.user_id != current_user.id:
        return jsonify({"error": "Unauthorized"}), 403

    prompt = f"""أنت خبير في تقدير تكاليف التصنيع. بناءً على المواصفات التالية، قدّر تكلفة النموذج الأولي.

المنتج: {report.project_name}
المواصفات: {json.dumps(specs, ensure_ascii=False)}
الكمية المطلوبة: {quantity}

أرجع JSON:
{{
  "bom_cost": "تكلفة المواد الخام",
  "tooling_cost": "تكلفة القوالب/الأدوات",
  "labor_cost": "تكلفة العمالة",
  "overhead_cost": "تكاليف غير مباشرة",
  "unit_cost": "تكلفة الوحدة",
  "total_cost": "التكلفة الإجمالية",
  "currency": "SAR",
  "lead_time": "المدة المتوقعة",
  "cost_breakdown": [
    {{"item": "اسم البند", "cost": "التكلفة", "percentage": "النسبة"}}
  ],
  "cost_saving_tips": ["نصيحة 1", "نصيحة 2"],
  "price_comparison": {{
    "saudi": "التكلفة في السعودية",
    "china": "التكلفة في الصين",
    "turkey": "التكلفة في تركيا"
  }}
}}"""

    from app.ai.diamond import call_ai, run_sync
    try:
        messages = [
            {"role": "system", "content": "أنت خبير تكاليف تصنيع. أرجع JSON فقط."},
            {"role": "user", "content": prompt},
        ]
        result = run_sync(call_ai(messages, model_type="fast"))
        result_clean = result.strip()
        if result_clean.startswith("```"):
            result_clean = result_clean.split("\n", 1)[-1].rsplit("```", 1)[0].strip()
        estimate = json.loads(result_clean)
        # Save cost estimate to existing draft or create one
        existing = PrototypeRequest.query.filter_by(
            user_id=current_user.id, report_id=report.id, status="draft"
        ).first()
        if not existing:
            existing = PrototypeRequest(
                user_id=current_user.id, report_id=report.id,
                title=report.project_name, status="draft",
            )
            db.session.add(existing)
        existing.cost_estimate_json = estimate
        existing.cost_estimate_generated_at = datetime.utcnow()
        db.session.commit()
        return jsonify({"estimate": estimate, "request_id": existing.id})
    except json.JSONDecodeError:
        return jsonify({"error": "AI returned invalid format"}), 500
    except Exception as e:
        return jsonify({"error": str(e)}), 500


# ══════════════════════════════════════════════════════════════════════
#  NDA Approval Workflow
# ══════════════════════════════════════════════════════════════════════

@prototyping_bp.route("/api/send-nda/<int:request_id>", methods=["POST"])
@login_required
@csrf.exempt
def api_send_nda(request_id):
    """User sends NDA for admin approval → status: pending_admin."""
    proto = PrototypeRequest.query.get_or_404(request_id)
    if proto.user_id != current_user.id:
        return jsonify({"error": "Unauthorized"}), 403
    if not proto.nda_html:
        return jsonify({"error": "لا يوجد NDA لإرساله"}), 400

    proto.nda_status = "pending_admin"
    db.session.commit()

    # Notify all admins
    from app.models.user import User
    from app.routes.notifications import notify
    admins = User.query.filter_by(is_admin=True).all()
    for admin in admins:
        notify(admin.id,
               "اتفاقية NDA تنتظر الموافقة",
               f"أرسل {current_user.name} اتفاقية عدم إفشاء للمشروع: {proto.title}",
               category="prototype",
               link=url_for("admin.admin_prototype_detail", req_id=proto.id))

    return jsonify({"success": True, "nda_status": "pending_admin"})


@prototyping_bp.route("/api/admin-approve-nda/<int:request_id>", methods=["POST"])
@login_required
@csrf.exempt
def api_admin_approve_nda(request_id):
    """Admin approves NDA → send to factory → status: pending_factory."""
    if not current_user.is_admin:
        return jsonify({"error": "Unauthorized"}), 403
    proto = PrototypeRequest.query.get_or_404(request_id)
    proto.nda_status = "pending_factory"
    db.session.commit()

    from app.routes.notifications import notify
    # Notify request owner
    notify(proto.user_id,
           "تمت الموافقة على إرسال NDA",
           f"وافق المدير على إرسال اتفاقية عدم الإفشاء للمصنع: {proto.title}",
           category="prototype",
           link=url_for("prototyping.view_request", req_id=proto.id))

    # Notify factory owner if linked
    if proto.factory and proto.factory.user_id:
        notify(proto.factory.user_id,
               "اتفاقية عدم إفشاء جديدة",
               f"تم إرسال اتفاقية عدم إفشاء لمراجعتك بخصوص: {proto.title}",
               category="prototype",
               link=url_for("prototyping.factory_view_request", req_id=proto.id))

    return jsonify({"success": True, "nda_status": "pending_factory"})


@prototyping_bp.route("/api/admin-reject-nda/<int:request_id>", methods=["POST"])
@login_required
@csrf.exempt
def api_admin_reject_nda(request_id):
    """Admin rejects NDA."""
    if not current_user.is_admin:
        return jsonify({"error": "Unauthorized"}), 403
    proto = PrototypeRequest.query.get_or_404(request_id)
    proto.nda_status = "rejected"
    db.session.commit()

    from app.routes.notifications import notify
    notify(proto.user_id,
           "تم رفض اتفاقية NDA",
           f"رفض المدير اتفاقية عدم الإفشاء للمشروع: {proto.title}. يرجى التعديل وإعادة الإرسال.",
           category="prototype",
           link=url_for("prototyping.view_request", req_id=proto.id))

    return jsonify({"success": True, "nda_status": "rejected"})


@prototyping_bp.route("/api/factory-approve-nda/<int:request_id>", methods=["POST"])
@login_required
@csrf.exempt
def api_factory_approve_nda(request_id):
    """Factory approves NDA → status: approved."""
    proto = PrototypeRequest.query.get_or_404(request_id)
    # Check factory ownership
    if not proto.factory or proto.factory.user_id != current_user.id:
        return jsonify({"error": "Unauthorized"}), 403

    proto.nda_status = "approved"
    proto.nda_approved_at = datetime.utcnow()
    db.session.commit()

    from app.routes.notifications import notify
    from app.models.user import User
    # Notify request owner
    notify(proto.user_id,
           "تمت الموافقة على NDA ✅",
           f"وافق المصنع على اتفاقية عدم الإفشاء للمشروع: {proto.title}",
           category="prototype",
           link=url_for("prototyping.view_request", req_id=proto.id))
    # Notify admins
    admins = User.query.filter_by(is_admin=True).all()
    for admin in admins:
        notify(admin.id,
               "المصنع وافق على NDA ✅",
               f"وافق المصنع على اتفاقية عدم الإفشاء: {proto.title}",
               category="prototype",
               link=url_for("admin.admin_prototype_detail", req_id=proto.id))

    return jsonify({"success": True, "nda_status": "approved"})


@prototyping_bp.route("/api/factory-reject-nda/<int:request_id>", methods=["POST"])
@login_required
@csrf.exempt
def api_factory_reject_nda(request_id):
    """Factory rejects NDA."""
    proto = PrototypeRequest.query.get_or_404(request_id)
    if not proto.factory or proto.factory.user_id != current_user.id:
        return jsonify({"error": "Unauthorized"}), 403

    proto.nda_status = "rejected"
    db.session.commit()

    from app.routes.notifications import notify
    from app.models.user import User
    notify(proto.user_id,
           "المصنع رفض NDA",
           f"رفض المصنع اتفاقية عدم الإفشاء للمشروع: {proto.title}",
           category="prototype",
           link=url_for("prototyping.view_request", req_id=proto.id))
    admins = User.query.filter_by(is_admin=True).all()
    for admin in admins:
        notify(admin.id,
               "المصنع رفض NDA",
               f"رفض المصنع اتفاقية عدم الإفشاء: {proto.title}",
               category="prototype",
               link=url_for("admin.admin_prototype_detail", req_id=proto.id))

    return jsonify({"success": True, "nda_status": "rejected"})


# ══════════════════════════════════════════════════════════════════════
#  Factory Dashboard
# ══════════════════════════════════════════════════════════════════════

@prototyping_bp.route("/factory/dashboard")
@login_required
def factory_dashboard():
    """Factory owner sees their incoming requests."""
    factory = FactoryPartner.query.filter_by(user_id=current_user.id, is_active=True).first()
    if not factory:
        flash("لا يوجد مصنع مرتبط بحسابك", "error")
        return redirect(url_for("dashboard.index"))

    reqs = PrototypeRequest.query.filter_by(factory_id=factory.id)\
        .order_by(PrototypeRequest.created_at.desc()).all()
    return render_template("prototyping/factory_dashboard.html",
                           factory=factory, requests=reqs)


@prototyping_bp.route("/factory/request/<int:req_id>")
@login_required
def factory_view_request(req_id):
    """Factory owner views a specific request."""
    proto = PrototypeRequest.query.get_or_404(req_id)
    factory = FactoryPartner.query.filter_by(user_id=current_user.id).first()
    if not factory or proto.factory_id != factory.id:
        flash("غير مصرح", "error")
        return redirect(url_for("prototyping.factory_dashboard"))

    quotes = PrototypeQuote.query.filter_by(request_id=req_id)\
        .order_by(PrototypeQuote.created_at.desc()).all()
    messages = PrototypeMessage.query.filter_by(request_id=req_id)\
        .order_by(PrototypeMessage.created_at.asc()).all()
    return render_template("prototyping/factory_view_request.html",
                           proto=proto, factory=factory, quotes=quotes, messages=messages)


@prototyping_bp.route("/factory/request/<int:req_id>/quote", methods=["POST"])
@login_required
@csrf.exempt
def factory_submit_quote(req_id):
    """Factory submits a price quote for a request."""
    proto = PrototypeRequest.query.get_or_404(req_id)
    factory = FactoryPartner.query.filter_by(user_id=current_user.id).first()
    if not factory or proto.factory_id != factory.id:
        return jsonify({"error": "Unauthorized"}), 403

    data = request.get_json() or {}
    quote = PrototypeQuote(
        request_id=req_id,
        factory_id=factory.id,
        unit_price=float(data.get("unit_price", 0)),
        total_price=float(data.get("total_price", 0)),
        currency=data.get("currency", "SAR"),
        lead_time_days=int(data.get("lead_time_days", 0)),
        notes=data.get("notes", ""),
        status="pending",
    )
    db.session.add(quote)
    proto.status = "quoted"
    db.session.commit()

    from app.routes.notifications import notify
    notify(proto.user_id,
           "عرض سعر جديد 💰",
           f"أرسل المصنع {factory.name_ar or factory.name} عرض سعر لطلبك: {proto.title}",
           category="prototype",
           link=url_for("prototyping.view_request", req_id=proto.id))

    return jsonify({"success": True, "quote_id": quote.id})
