from fastapi import APIRouter, Depends, HTTPException, Query from sqlalchemy.ext.asyncio import AsyncSession from typing import Annotated, Optional from app.database import get_db from app.services.customer import CustomerService from app.core.security import decode_token from app.api.v1.deps import get_current_user_id router = APIRouter() @router.get("") async def list_customers( status: Optional[str] = None, page: int = Query(1, ge=1), size: int = Query(20, ge=1, le=100), user_id: str = Depends(get_current_user_id), db: Annotated[AsyncSession, Depends(get_db)] = None, ): service = CustomerService(db) return await service.list_customers(user_id, status, page, size) @router.get("/silent") async def get_silent( days: int = Query(3, ge=1), user_id: str = Depends(get_current_user_id), db: Annotated[AsyncSession, Depends(get_db)] = None, ): service = CustomerService(db) customers = await service.get_silent_customers(user_id, days) return { "customers": customers, "count": len(customers), "silence_days": days, } @router.get("/{customer_id}") async def get_customer( customer_id: str, user_id: str = Depends(get_current_user_id), db: Annotated[AsyncSession, Depends(get_db)] = None, ): service = CustomerService(db) customer = await service.get_customer(user_id, customer_id) if not customer: raise HTTPException(status_code=404, detail="Customer not found") return customer @router.post("") async def create_customer( data: dict, user_id: str = Depends(get_current_user_id), db: Annotated[AsyncSession, Depends(get_db)] = None, ): service = CustomerService(db) customer = await service.create_customer(user_id, data) return customer @router.patch("/{customer_id}") async def update_customer( customer_id: str, data: dict, user_id: str = Depends(get_current_user_id), db: Annotated[AsyncSession, Depends(get_db)] = None, ): service = CustomerService(db) customer = await service.update_customer(user_id, customer_id, data) if not customer: raise HTTPException(status_code=404, detail="Customer not found") return customer @router.delete("/{customer_id}") async def delete_customer( customer_id: str, user_id: str = Depends(get_current_user_id), db: Annotated[AsyncSession, Depends(get_db)] = None, ): service = CustomerService(db) deleted = await service.delete_customer(user_id, customer_id) if not deleted: raise HTTPException(status_code=404, detail="Customer not found") return {"message": "Customer deleted"} @router.get("/{customer_id}/conversation") async def get_conversation( customer_id: str, page: int = Query(1, ge=1), size: int = Query(50, ge=1, le=200), user_id: str = Depends(get_current_user_id), db: Annotated[AsyncSession, Depends(get_db)] = None, ): service = CustomerService(db) return await service.get_conversation(user_id, customer_id, page, size)