from fastapi import APIRouter, Depends, HTTPException
from sqlmodel import Session, select
from datetime import datetime
from backend.models.models import Order, OrderItem
from backend.schemas.order import OrderRead, OrderCreate, OrderUpdate, OrderList, OrderWithItems
from backend.database import get_session

router = APIRouter()

@router.post("/", response_model=OrderRead)
def create_order(order: OrderCreate, session: Session = Depends(get_session)):
    new_order = Order(
        user_id=1,  # Cần cập nhật logic lấy user từ authentication
        shop_id=order.shop_id,
        total_price=order.total_price,
        status="pending",
        created_at=datetime.utcnow(),
    )
    session.add(new_order)
    session.commit()
    session.refresh(new_order)
    return new_order

@router.get("/{order_id}", response_model=OrderWithItems)
def read_order(order_id: int, session: Session = Depends(get_session)):
    order = session.get(Order, order_id)
    if not order:
        raise HTTPException(status_code=404, detail="Order not found")
    return order

@router.get("/user/{user_id}", response_model=OrderList)
def list_user_orders(user_id: int, session: Session = Depends(get_session)):
    orders = session.exec(select(Order).where(Order.user_id == user_id)).all()
    return {"orders": orders}

@router.get("/", response_model=OrderList)
def list_all_orders(session: Session = Depends(get_session)):
    orders = session.exec(select(Order)).all()
    return {"orders": orders}

@router.get("/{order_id}/calculate-total", response_model=float)
def calculate_total_price(order_id: int, session: Session = Depends(get_session)):
    order_items = session.exec(select(OrderItem).where(OrderItem.order_id == order_id)).all()
    total_price = sum(item.price * item.quantity for item in order_items)
    return total_price

@router.put("/{order_id}", response_model=OrderRead)
def update_order(order_id: int, order_update: OrderUpdate, session: Session = Depends(get_session)):
    order = session.get(Order, order_id)
    if not order:
        raise HTTPException(status_code=404, detail="Order not found")

    for key, value in order_update.dict(exclude_unset=True).items():
        setattr(order, key, value)

    session.add(order)
    session.commit()
    session.refresh(order)
    return order

@router.delete("/{order_id}")
def delete_order(order_id: int, session: Session = Depends(get_session)):
    order = session.get(Order, order_id)
    if not order:
        raise HTTPException(status_code=404, detail="Order not found")
    session.delete(order)
    session.commit()
    return {"message": "Order deleted successfully"}