from flask import Blueprint, render_template, redirect, url_for, session, flash, request

from extensions import db
from models import Order


orders_bp = Blueprint("orders", __name__)


# ============================================================
# ADMIN ORDERS
# ============================================================

@orders_bp.route(
    "/admin/orders",
    endpoint="admin_orders"
)
def admin_orders():

    if "user_id" not in session:
        return redirect(url_for("auth.login"))

    status = request.args.get(
        "status",
        ""
    ).strip()

    query = Order.query

    if status:
        query = query.filter_by(
            order_status=status
        )

    orders = (
        query
        .order_by(Order.created_at.desc())
        .all()
    )

    total_orders = Order.query.count()

    pending_orders = Order.query.filter_by(
        order_status="pending"
    ).count()

    processing_orders = Order.query.filter_by(
        order_status="processing"
    ).count()

    completed_orders = Order.query.filter_by(
        order_status="completed"
    ).count()

    cancelled_orders = Order.query.filter_by(
        order_status="cancelled"
    ).count()

    return render_template(
        "admin/orders.html",
        orders=orders,
        total_orders=total_orders,
        pending_orders=pending_orders,
        processing_orders=processing_orders,
        completed_orders=completed_orders,
        cancelled_orders=cancelled_orders,
        current_status=status
    )


# ============================================================
# UPDATE ORDER STATUS
# ============================================================

@orders_bp.route(
    "/admin/orders/<int:order_id>/status",
    methods=["POST"],
    endpoint="update_order_status"
)
def update_order_status(order_id):

    if "user_id" not in session:
        return redirect(url_for("auth.login"))

    order = Order.query.get_or_404(order_id)

    new_status = request.form.get(
        "order_status",
        ""
    ).strip()

    allowed_statuses = {
        "pending",
        "processing",
        "completed",
        "cancelled"
    }

    if new_status not in allowed_statuses:

        flash(
            "Invalid order status.",
            "error"
        )

        return redirect(
            url_for("orders.admin_orders")
        )

    old_status = order.order_status

    if old_status == new_status:

        flash(
            "Order status has not changed.",
            "success"
        )

        return redirect(
            url_for("orders.admin_orders")
        )

    order.order_status = new_status

    db.session.commit()

    flash(
        "Order status updated successfully.",
        "success"
    )

    return redirect(
        url_for("orders.admin_orders")
    )