from fastapi import APIRouter, Depends, Query
from sqlalchemy import select, func, or_
from sqlalchemy.ext.asyncio import AsyncSession
from app.core.database import get_db
from app.core.dependencies import get_current_user, require_permission
from app.models.customer import Customer
from app.schemas.customer import CustomerCreate, CustomerUpdate, CustomerOut
from app.services.customer_service import CustomerService
router = APIRouter(prefix="/customers", tags=["Customers"])

@router.post("", response_model=CustomerOut)
async def create(data: CustomerCreate, user=Depends(require_permission("customers.manage")), db=Depends(get_db)):
    return await CustomerService.create(db, user.brand_id, data)

@router.get("", response_model=list[CustomerOut])
async def list_customers(page:int=Query(1,ge=1), limit:int=Query(25,ge=1,le=100), search:str|None=None, user=Depends(require_permission("customers.view")), db:AsyncSession=Depends(get_db)):
    q = select(Customer).where(Customer.brand_id == user.brand_id)
    if search:
        term=f"%{search}%"
        q=q.where(or_(Customer.name.like(term), Customer.mobile.like(term), Customer.customer_code.like(term), Customer.city.like(term)))
    q=q.order_by(Customer.created_at.desc()).offset((page-1)*limit).limit(limit)
    return list((await db.scalars(q)).all())

@router.get("/{customer_id}", response_model=CustomerOut)
async def get_customer(customer_id:int, user=Depends(require_permission("customers.view")), db=Depends(get_db)):
    return await CustomerService.get(db, user.brand_id, customer_id)

@router.put("/{customer_id}", response_model=CustomerOut)
async def update_customer(customer_id:int, data:CustomerUpdate, user=Depends(require_permission("customers.manage")), db=Depends(get_db)):
    obj=await CustomerService.get(db,user.brand_id,customer_id)
    for k,v in data.model_dump(exclude_unset=True).items(): setattr(obj,k,v)
    await db.commit(); await db.refresh(obj); return obj

@router.delete("/{customer_id}")
async def delete_customer(customer_id:int, user=Depends(require_permission("customers.manage")), db=Depends(get_db)):
    obj=await CustomerService.get(db,user.brand_id,customer_id)
    obj.status="inactive"; await db.commit()
    return {"success":True,"message":"Customer deactivated","data":None}
