from fastapi import APIRouter, Depends, status
from sqlalchemy.orm import Session
from sqlalchemy import func
from typing import List
import uuid
from app.api import deps
from app.db.session import get_db
from app.models.order import Order
from app.models.product import Product
from app.schemas.order import OrderResponse
from app.core.exceptions import BadRequestException

router = APIRouter()

@router.get("/stats")
def get_admin_stats(
    db: Session = Depends(get_db),
    current_admin: Session = Depends(deps.get_current_active_superuser)
):
    """Retrieve overview statistics for the admin dashboard (revenue, total orders, active products)."""
    # 1. Total Pendapatan dari Order Sukses/Pending (bukan Cancelled)
    revenue_query = db.query(func.sum(Order.total_price)).filter(Order.status != "cancelled").scalar() or 0.0
    
    # 2. Total Order Masuk
    total_orders = db.query(Order).count()
    
    # 3. Jumlah Produk Aktif di Toko
    total_products = db.query(Product).filter(Product.deleted_at == None).count()

    return {
        "success": True,
        "data": {
            "total_revenue": float(revenue_query),
            "total_orders": total_orders,
            "total_products": total_products
        }
    }

@router.get("/orders", response_model=List[OrderResponse])
def get_all_orders(
    db: Session = Depends(get_db),
    current_admin: Session = Depends(deps.get_current_active_superuser)
):
    """Fetch list of all customer transaction invoices (admin only)."""
    return db.query(Order).order_by(Order.created_at.desc()).all()

@router.put("/orders/{order_id}/status", response_model=OrderResponse)
def update_order_status(
    order_id: uuid.UUID,
    status_in: str,  # pending, completed, cancelled
    db: Session = Depends(get_db),
    current_admin: Session = Depends(deps.get_current_active_superuser)
):
    """Update status of a transaction (e.g. pending -> completed) (admin only)."""
    status_clean = status_in.lower().strip()
    if status_clean not in ["pending", "completed", "cancelled"]:
        raise BadRequestException("Invalid status value. Must be 'pending', 'completed', or 'cancelled'.")

    order = db.query(Order).filter(Order.id == order_id).first()
    if not order:
        raise BadRequestException("Order not found.")

    order.status = status_clean
    db.add(order)
    db.commit()
    db.refresh(order)
    return order
