"""Support blueprint — user chat with admins."""
from functools import wraps
from flask import Blueprint, request, redirect, url_for, render_template, session
from app.extensions import db
from app.models.user import User
from app.models.support import SupportMessage

bp = Blueprint("support", __name__)


def require_login(f):
    @wraps(f)
    def decorated(*args, **kwargs):
        if "user_id" not in session:
            return redirect(url_for("auth.login"))
        return f(*args, **kwargs)
    return decorated


@bp.route("/support")
@require_login
def support_page():
    user = db.session.get(User, session["user_id"])
    # All threads of this user (root messages = no parent)
    threads = (SupportMessage.query
               .filter_by(user_id=user.id, parent_id=None)
               .order_by(SupportMessage.updated_at.desc())
               .all())
    return render_template("webapp/support.html", user=user, threads=threads)


@bp.route("/api/support/messages")
@require_login
def support_messages():
    """Full conversation of the current user, oldest -> newest."""
    user_id = session["user_id"]
    root_id = request.args.get("thread_id", type=int)
    q = SupportMessage.query.filter_by(user_id=user_id)
    if root_id:
        root = SupportMessage.query.filter_by(id=root_id, user_id=user_id, parent_id=None).first()
        if not root:
            return {"ok": False, "error": "thread not found"}, 404
        msgs = [root] + list(root.replies)
    else:
        msgs = q.order_by(SupportMessage.created_at).all()
    return {
        "ok": True,
        "messages": [{
            "id": m.id,
            "thread_id": m.parent_id or m.id,
            "from_admin": bool(m.is_admin_reply),
            "admin_name": (m.admin.display_name if m.admin else "Support"),
            "subject": m.subject or "",
            "message": m.message,
            "status": m.status,
            "claimed_by": (m.claimed_by.display_name if m.claimed_by else None),
            "created_at": m.created_at.isoformat(),
        } for m in msgs]
    }


@bp.route("/api/support/send", methods=["POST"])
@require_login
def support_send():
    from app.models.notification import Notification
    data = request.get_json(silent=True) or {}
    subject = (data.get("subject") or "").strip()[:200]
    message = (data.get("message") or "").strip()
    if not message:
        return {"ok": False, "error": "Empty message"}, 400
    user = db.session.get(User, session["user_id"])
    msg = SupportMessage(user_id=user.id, subject=subject, message=message,
                         is_admin_reply=False, status="open")
    db.session.add(msg)
    # Notify ALL admins
    for adm in User.query.filter(User.role.has(code="admin") | User.role.has(code="superadmin")).all():
        db.session.add(Notification(
            user_id=adm.id,
            type="support_message",
            title=f"📨 Support Message from {user.display_name}",
            body=f"[{subject}] {message[:100]}{'...' if len(message) > 100 else ''}"
        ))
    db.session.commit()
    return {"ok": True, "id": msg.id, "thread_id": msg.id}


@bp.route("/api/support/status", methods=["GET"])
@require_login
def support_status():
    """Quick poll: latest thread activity so the chat can auto-refresh."""
    user_id = session["user_id"]
    latest = (SupportMessage.query.filter_by(user_id=user_id)
              .order_by(SupportMessage.created_at.desc()).first())
    if not latest:
        return {"ok": True, "count": 0, "last_id": 0}
    return {"ok": True, "count": SupportMessage.query.filter_by(user_id=user_id).count(),
            "last_id": latest.id}
