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.features import CompetitorMonitor, MarketAlert

market_bp = Blueprint("market", __name__, url_prefix="/market")


@market_bp.route("/<int:report_id>")
@login_required
def index(report_id):
    report = Report.query.get_or_404(report_id)
    if report.user_id != current_user.id:
        return redirect(url_for("dashboard.index"))

    monitors = CompetitorMonitor.query.filter_by(
        report_id=report_id, user_id=current_user.id
    ).order_by(CompetitorMonitor.created_at.desc()).all()

    alerts = MarketAlert.query.filter_by(
        report_id=report_id, user_id=current_user.id
    ).order_by(MarketAlert.created_at.desc()).limit(20).all()

    unread_count = MarketAlert.query.filter_by(
        report_id=report_id, user_id=current_user.id, is_read=False
    ).count()

    return render_template("market/index.html",
        report=report, monitors=monitors, alerts=alerts, unread_count=unread_count)


@market_bp.route("/add-competitor/<int:report_id>", methods=["POST"])
@login_required
def add_competitor(report_id):
    report = Report.query.get_or_404(report_id)
    if report.user_id != current_user.id:
        return redirect(url_for("dashboard.index"))

    url = request.form.get("competitor_url", "").strip()
    if not url:
        flash("رابط المنافس مطلوب.", "error")
        return redirect(url_for("market.index", report_id=report_id))

    existing = CompetitorMonitor.query.filter_by(
        report_id=report_id, user_id=current_user.id, competitor_url=url
    ).first()
    if existing:
        flash("هذا المنافس مضاف مسبقاً.", "error")
        return redirect(url_for("market.index", report_id=report_id))

    monitor = CompetitorMonitor(
        user_id=current_user.id,
        report_id=report_id,
        competitor_url=url,
    )
    db.session.add(monitor)
    db.session.commit()
    flash("تم إضافة المنافس للمراقبة.", "success")
    return redirect(url_for("market.index", report_id=report_id))


@market_bp.route("/remove-competitor/<int:monitor_id>", methods=["POST"])
@login_required
def remove_competitor(monitor_id):
    monitor = CompetitorMonitor.query.get_or_404(monitor_id)
    if monitor.user_id != current_user.id:
        return redirect(url_for("dashboard.index"))
    report_id = monitor.report_id
    db.session.delete(monitor)
    db.session.commit()
    flash("تم إزالة المنافس.", "success")
    return redirect(url_for("market.index", report_id=report_id))


@market_bp.route("/api/scan/<int:report_id>", methods=["POST"])
@csrf.exempt
@login_required
def scan_market(report_id):
    """AI generates market analysis and competitor insights."""
    report = Report.query.get_or_404(report_id)
    if report.user_id != current_user.id:
        return jsonify({"error": "Unauthorized"}), 403

    monitors = CompetitorMonitor.query.filter_by(
        report_id=report_id, user_id=current_user.id, is_active=True
    ).all()

    try:
        from app.ai.diamond import call_ai, run_sync, _parse_json

        lang = "Arabic" if report.language == "ar" else "English"

        competitor_list = "\n".join([f"- {m.competitor_url}" for m in monitors]) if monitors else "No specific competitors tracked"

        synthesis = ""
        if report.synthesis_result:
            synthesis = json.dumps(report.synthesis_result, ensure_ascii=False)[:2000]

        messages = [
            {"role": "system", "content": (
                f"You are a competitive intelligence analyst. Based on the project and competitors below, "
                f"generate a market update report with alerts.\n"
                f"Return JSON: {{\"alerts\": [{{\"type\": \"competitor_change|market_trend|price_change|new_competitor|opportunity\", "
                f"\"title\": \"...\", \"description\": \"...\", \"severity\": \"info|warning|critical\"}}], "
                f"\"market_summary\": \"...\", \"recommendations\": [\"...\"]}}\n"
                f"Generate 3-6 realistic and actionable alerts based on the project's industry.\n"
                f"Include market trends, potential competitor moves, pricing insights, and opportunities.\n"
                f"Language: {lang}"
            )},
            {"role": "user", "content": (
                f"Project: {report.project_name}\n"
                f"Description: {report.project_description}\n"
                f"Competitors being monitored:\n{competitor_list}\n"
                f"Feasibility Study:\n{synthesis}"
            )}
        ]

        response = run_sync(call_ai(messages, model_type="fast"))
        data = _parse_json(response)

        if not data or "alerts" not in data:
            return jsonify({"error": "AI response invalid"}), 500

        # Save alerts
        for alert_data in data.get("alerts", []):
            alert = MarketAlert(
                user_id=current_user.id,
                report_id=report_id,
                alert_type=alert_data.get("type", "market_trend"),
                title=alert_data.get("title", ""),
                description=alert_data.get("description", ""),
                severity=alert_data.get("severity", "info"),
            )
            db.session.add(alert)

        # Update last_checked for monitors
        for m in monitors:
            m.last_checked = datetime.utcnow()

        db.session.commit()

        return jsonify({
            "status": "ok",
            "market_summary": data.get("market_summary", ""),
            "recommendations": data.get("recommendations", []),
            "alerts_count": len(data.get("alerts", []))
        })

    except Exception as e:
        current_app.logger.error(f"Market scan failed: {e}")
        return jsonify({"error": str(e)}), 500


@market_bp.route("/api/mark-read/<int:alert_id>", methods=["POST"])
@csrf.exempt
@login_required
def mark_read(alert_id):
    alert = MarketAlert.query.get_or_404(alert_id)
    if alert.user_id != current_user.id:
        return jsonify({"error": "Unauthorized"}), 403
    alert.is_read = True
    db.session.commit()
    return jsonify({"status": "ok"})


@market_bp.route("/api/mark-all-read/<int:report_id>", methods=["POST"])
@csrf.exempt
@login_required
def mark_all_read(report_id):
    MarketAlert.query.filter_by(
        report_id=report_id, user_id=current_user.id, is_read=False
    ).update({"is_read": True})
    db.session.commit()
    return jsonify({"status": "ok"})
