from fastapi import APIRouter, Depends, Query
from sqlalchemy.orm import Session

from app.api.deps import get_current_user
from app.db.session import get_db
from app.schemas.common import PaginatedResponse
from app.schemas.customer import CustomerCreate, CustomerDedupMatch, CustomerResponse, CustomerUpdate
from app.schemas.policy import VehicleCreate, VehicleResponse
from app.schemas.user_context import CurrentUser
from app.services.customer_service import CustomerService
from app.services.vehicle_service import VehicleService

router = APIRouter()


@router.get("", response_model=PaginatedResponse[CustomerResponse])
def list_customers(
    page: int = Query(1, ge=1),
    page_size: int = Query(20, ge=1, le=100),
    search: str | None = None,
    current_user: CurrentUser = Depends(get_current_user),
    db: Session = Depends(get_db),
):
    items, total = CustomerService(db).list_customers(current_user.agency_id, page, page_size, search)
    return PaginatedResponse(total=total, page=page, page_size=page_size, items=items)


@router.get("/dedup-check", response_model=list[CustomerDedupMatch])
def dedup_check(
    name: str,
    mobile: str,
    current_user: CurrentUser = Depends(get_current_user),
    db: Session = Depends(get_db),
):
    return CustomerService(db).check_duplicates(current_user.agency_id, name, mobile)


@router.post("", response_model=CustomerResponse)
def create_customer(
    payload: CustomerCreate,
    current_user: CurrentUser = Depends(get_current_user),
    db: Session = Depends(get_db),
):
    return CustomerService(db).create_customer(current_user.agency_id, payload, user_id=current_user.id)


@router.get("/{customer_id}", response_model=CustomerResponse)
def get_customer(
    customer_id: int,
    current_user: CurrentUser = Depends(get_current_user),
    db: Session = Depends(get_db),
):
    return CustomerService(db).get_customer(current_user.agency_id, customer_id)


@router.get("/{customer_id}/history")
def customer_history(
    customer_id: int,
    current_user: CurrentUser = Depends(get_current_user),
    db: Session = Depends(get_db),
):
    return CustomerService(db).get_history(current_user.agency_id, customer_id)


@router.get("/{customer_id}/vehicles", response_model=list[VehicleResponse])
def list_customer_vehicles(
    customer_id: int,
    current_user: CurrentUser = Depends(get_current_user),
    db: Session = Depends(get_db),
):
    return VehicleService(db).list_for_customer(current_user.agency_id, customer_id)


@router.post("/{customer_id}/vehicles", response_model=VehicleResponse)
def create_customer_vehicle(
    customer_id: int,
    payload: VehicleCreate,
    current_user: CurrentUser = Depends(get_current_user),
    db: Session = Depends(get_db),
):
    return VehicleService(db).create_for_customer(current_user.agency_id, customer_id, payload)


@router.put("/{customer_id}", response_model=CustomerResponse)
def update_customer(
    customer_id: int,
    payload: CustomerUpdate,
    current_user: CurrentUser = Depends(get_current_user),
    db: Session = Depends(get_db),
):
    return CustomerService(db).update_customer(current_user.agency_id, customer_id, payload, user_id=current_user.id)


@router.delete("/{customer_id}")
def delete_customer(
    customer_id: int,
    current_user: CurrentUser = Depends(get_current_user),
    db: Session = Depends(get_db),
):
    CustomerService(db).delete_customer(current_user.agency_id, customer_id, user_id=current_user.id)
    return {"message": "Customer deleted"}
