import json
from datetime import datetime, timedelta
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 ProjectMilestone, MilestoneTask
from app.helpers.access import has_report_access

roadmap_bp = Blueprint("roadmap", __name__, url_prefix="/roadmap")


@roadmap_bp.route("/<int:report_id>")
@login_required
def index(report_id):
    report = Report.query.get_or_404(report_id)
    if not has_report_access(current_user, report):
        return redirect(url_for("dashboard.index"))
    milestones = ProjectMilestone.query.filter_by(
        report_id=report_id, user_id=current_user.id
    ).order_by(ProjectMilestone.week_number, ProjectMilestone.position).all()

    total_tasks = sum(len(m.tasks) for m in milestones)
    done_tasks = sum(sum(1 for t in m.tasks if t.is_done) for m in milestones)
    progress = round(done_tasks / total_tasks * 100) if total_tasks > 0 else 0

    return render_template("roadmap/index.html",
        report=report, milestones=milestones,
        total_tasks=total_tasks, done_tasks=done_tasks, progress=progress)


@roadmap_bp.route("/generate/<int:report_id>", methods=["POST"])
@csrf.exempt
@login_required
def generate(report_id):
    report = Report.query.get_or_404(report_id)
    if report.user_id != current_user.id:
        return jsonify({"error": "Unauthorized"}), 403
    if not report.synthesis_result:
        return jsonify({"error": "Report not complete"}), 400

    existing = ProjectMilestone.query.filter_by(report_id=report_id, user_id=current_user.id).first()
    if existing:
        return jsonify({"error": "Roadmap already exists", "redirect": url_for("roadmap.index", report_id=report_id)})

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

        lang = "Arabic" if report.language == "ar" else "English"
        synthesis = json.dumps(report.synthesis_result, ensure_ascii=False)[:3000]

        messages = [
            {"role": "system", "content": (
                f"You are a startup execution planner. Based on the feasibility study below, "
                f"create a 12-week execution roadmap with milestones and tasks.\n"
                f"Return JSON: {{\"milestones\": [{{\"week\": 1, \"title\": \"...\", \"description\": \"...\", "
                f"\"tasks\": [\"task1\", \"task2\", ...]}}]}}\n"
                f"Create 8-12 milestones covering: legal setup, branding, product development, "
                f"marketing launch, first customers, operations, hiring, scaling.\n"
                f"Each milestone should have 3-5 actionable tasks.\n"
                f"Language: {lang}"
            )},
            {"role": "user", "content": f"Project: {report.project_name}\n\nFeasibility Study:\n{synthesis}"}
        ]

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

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

        now = datetime.utcnow()
        for i, m in enumerate(data["milestones"]):
            week = m.get("week", i + 1)
            milestone = ProjectMilestone(
                report_id=report_id,
                user_id=current_user.id,
                title=m.get("title", f"Week {week}"),
                description=m.get("description", ""),
                week_number=week,
                due_date=now + timedelta(weeks=week),
                position=i,
            )
            db.session.add(milestone)
            db.session.flush()

            for j, task_title in enumerate(m.get("tasks", [])):
                task = MilestoneTask(
                    milestone_id=milestone.id,
                    title=task_title if isinstance(task_title, str) else str(task_title),
                    position=j,
                )
                db.session.add(task)

        db.session.commit()
        return jsonify({"status": "ok", "redirect": url_for("roadmap.index", report_id=report_id)})

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


@roadmap_bp.route("/task/<int:task_id>/toggle", methods=["POST"])
@csrf.exempt
@login_required
def toggle_task(task_id):
    task = MilestoneTask.query.get_or_404(task_id)
    milestone = task.milestone
    if milestone.user_id != current_user.id:
        return jsonify({"error": "Unauthorized"}), 403

    task.is_done = not task.is_done
    db.session.commit()

    all_done = all(t.is_done for t in milestone.tasks)
    if all_done and milestone.status != "completed":
        milestone.status = "completed"
        milestone.completed_at = datetime.utcnow()
        db.session.commit()
    elif not all_done and milestone.status == "completed":
        milestone.status = "in_progress"
        milestone.completed_at = None
        db.session.commit()

    return jsonify({"status": "ok", "is_done": task.is_done, "milestone_complete": all_done})


@roadmap_bp.route("/milestone/<int:milestone_id>/status", methods=["POST"])
@csrf.exempt
@login_required
def update_milestone_status(milestone_id):
    milestone = ProjectMilestone.query.get_or_404(milestone_id)
    if milestone.user_id != current_user.id:
        return jsonify({"error": "Unauthorized"}), 403

    data = request.get_json(silent=True) or {}
    new_status = data.get("status", "pending")
    if new_status in ("pending", "in_progress", "completed", "skipped"):
        milestone.status = new_status
        if new_status == "completed":
            milestone.completed_at = datetime.utcnow()
        else:
            milestone.completed_at = None
        db.session.commit()

    return jsonify({"status": "ok"})
