from flask import (
    Blueprint,
    render_template,
    redirect,
    url_for,
    session,
    flash
)

from extensions import db
from models import Review


reviews_bp = Blueprint(
    "reviews",
    __name__
)


# ============================================================
# ADMIN REVIEWS
# ============================================================

@reviews_bp.route(
    "/admin/reviews",
    endpoint="admin_reviews"
)
def admin_reviews():

    if "user_id" not in session:
        return redirect(
            url_for("auth.login")
        )

    reviews = (
        Review.query
        .order_by(
            Review.created_at.desc()
        )
        .all()
    )

    total_reviews = len(
        reviews
    )

    approved_reviews = sum(
        1
        for review in reviews
        if review.is_approved
    )

    pending_reviews = sum(
        1
        for review in reviews
        if not review.is_approved
    )

    return render_template(
        "admin/reviews.html",
        reviews=reviews,
        total_reviews=total_reviews,
        approved_reviews=approved_reviews,
        pending_reviews=pending_reviews
    )


# ============================================================
# APPROVE / UNAPPROVE REVIEW
# ============================================================

@reviews_bp.route(
    "/admin/reviews/<int:review_id>/toggle",
    methods=["POST"],
    endpoint="toggle_review"
)
def toggle_review(review_id):

    if "user_id" not in session:
        return redirect(
            url_for("auth.login")
        )

    review = Review.query.get_or_404(
        review_id
    )

    review.is_approved = (
        not review.is_approved
    )

    db.session.commit()

    if review.is_approved:

        flash(
            "Review approved successfully.",
            "success"
        )

    else:

        flash(
            "Review has been unapproved.",
            "success"
        )

    return redirect(
        url_for("reviews.admin_reviews")
    )


# ============================================================
# DELETE REVIEW
# ============================================================

@reviews_bp.route(
    "/admin/reviews/<int:review_id>/delete",
    methods=["POST"],
    endpoint="delete_review"
)
def delete_review(review_id):

    if "user_id" not in session:
        return redirect(
            url_for("auth.login")
        )

    review = Review.query.get_or_404(
        review_id
    )

    db.session.delete(
        review
    )

    db.session.commit()

    flash(
        "Review deleted successfully.",
        "success"
    )

    return redirect(
        url_for("reviews.admin_reviews")
    )