from fastapi import APIRouter, Request, Form, Depends
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.models.models import VoucherAgent
from app.core.security import require_roles
import os
import math

router = APIRouter(dependencies=[Depends(require_roles("agen_voucher", "admin_cs"))])
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("/voucher-agents", response_class=HTMLResponse)
async def voucher_agents(request: Request, db: AsyncSession = Depends(get_db), page: int = 1):
    per_page = 5
    total_count = await db.scalar(select(func.count(VoucherAgent.id)).where(VoucherAgent.is_active == True))
    total_pages = math.ceil(total_count / per_page)
    
    result = await db.execute(
        select(VoucherAgent)
        .where(VoucherAgent.is_active == True)
        .order_by(VoucherAgent.area, VoucherAgent.name)
        .limit(per_page)
        .offset((page - 1) * per_page)
    )
    agents = result.scalars().all()
    
    return templates.TemplateResponse(request=request, name="voucher_agents.html", context={
        "agents": agents, 
        "page": page, 
        "total_pages": total_pages
    })

@router.post("/voucher-agents")
async def add_voucher_agent(
    name: str = Form(...),
    phone: str = Form(...),
    area: str = Form(...),
    nama_isp: str = Form(None),
    domain_isp: str = Form(None),
    prefix: str = Form(None),
    db: AsyncSession = Depends(get_db)
):
    db.add(VoucherAgent(
        name=name.strip(),
        phone=phone.strip(),
        area=area.strip(),
        nama_isp=nama_isp.strip() if nama_isp else None,
        domain_isp=domain_isp.strip() if domain_isp else None,
        prefix=prefix.strip() if prefix else None,
        commission_rate=20
    ))
    await db.commit()
    return RedirectResponse(url="/voucher-agents", status_code=303)

@router.post("/voucher-agents/{agent_id}/delete")
async def delete_voucher_agent(
    agent_id: int,
    db: AsyncSession = Depends(get_db)
):
    agent = await db.get(VoucherAgent, agent_id)
    if agent:
        agent.is_active = False
        await db.commit()
    return RedirectResponse(url="/voucher-agents", status_code=303)
