from fastapi import APIRouter, Request, Depends, Query
from fastapi.responses import HTMLResponse, RedirectResponse
from fastapi.templating import Jinja2Templates
from sqlalchemy.ext.asyncio import AsyncSession
from sqlalchemy import select, func
from app.core.database import get_db
from app.core.security import require_roles, get_current_user
from app.models.models import Customer
import os
import traceback

router = APIRouter(dependencies=[Depends(require_roles("admin_cs", "teknisi", "agen_voucher"))])
BASE_DIR = os.path.dirname(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
templates = Jinja2Templates(directory=os.path.join(BASE_DIR, "app/templates"))

@router.get("/customers", response_class=HTMLResponse)
async def list_customers(
    request: Request,
    type: str | None = Query(default=None),
    status: str | None = Query(default=None),
    page: int = Query(default=1, ge=1),
    db: AsyncSession = Depends(get_db),
    user = Depends(get_current_user),
):
    """Server-side pagination: safe for large customer populations."""
    if user.role == "teknisi":
        return RedirectResponse(url="/tasks", status_code=303)
    try:
        page_size = 25
        filters = [Customer.is_archived == False]
        if type:
            filters.append(Customer.type == type)
        if status == "pending":
            filters.append(Customer.status.in_(("request", "pending_provisioning")))
        elif status:
            filters.append(Customer.status == status)
        total = await db.scalar(select(func.count(Customer.id)).where(*filters)) or 0
        total_pages = max(1, (total + page_size - 1) // page_size)
        page = min(page, total_pages)
        from sqlalchemy.orm import selectinload
        result = await db.execute(
            select(Customer).options(selectinload(Customer.odp), selectinload(Customer.service_package), selectinload(Customer.olt_device)).where(*filters).order_by(Customer.created_at.desc()).offset((page - 1) * page_size).limit(page_size)
        )
        customers = result.scalars().all()
        return templates.TemplateResponse(
            request=request, name="customers.html",
            context={
                "customers": customers, "type_filter": type, "status_filter": status,
                "page": page, "page_size": page_size, "total": total, "total_pages": total_pages,
                "page_numbers": range(max(1, page - 2), min(total_pages, page + 2) + 1),
            },
        )
    except Exception:
        traceback.print_exc()
        return HTMLResponse(content="Gagal memuat data pelanggan.", status_code=500)
