from flask import Blueprint, render_template, request, redirect, url_for, jsonify
from flask_login import login_required, current_user
from app.extensions import db, csrf
from app.models.features import Notification

notifications_bp = Blueprint("notifications", __name__, url_prefix="/notifications")


@notifications_bp.route("/")
@login_required
def index():
    page = request.args.get("page", 1, type=int)
    pagination = Notification.query.filter_by(user_id=current_user.id).order_by(
        Notification.created_at.desc()).paginate(page=page, per_page=20, error_out=False)
    return render_template("notifications/index.html", pagination=pagination)


@notifications_bp.route("/read/<int:nid>", methods=["POST"])
@csrf.exempt
@login_required
def mark_read(nid):
    notif = Notification.query.get_or_404(nid)
    if notif.user_id == current_user.id:
        notif.is_read = True
        db.session.commit()
    if notif.link:
        return redirect(notif.link)
    return redirect(url_for("notifications.index"))


@notifications_bp.route("/read-all", methods=["POST"])
@csrf.exempt
@login_required
def mark_all_read():
    Notification.query.filter_by(user_id=current_user.id, is_read=False).update({"is_read": True})
    db.session.commit()
    return redirect(url_for("notifications.index"))


@notifications_bp.route("/api/count")
@login_required
def unread_count():
    count = Notification.query.filter_by(user_id=current_user.id, is_read=False).count()
    return jsonify({"count": count})


def notify(user_id, title, message="", category="info", link=None):
    n = Notification(user_id=user_id, title=title, message=message, category=category, link=link)
    db.session.add(n)
    db.session.commit()
    return n
