from __future__ import annotations

from fastapi import APIRouter, Request
from fastapi.responses import RedirectResponse

from app.core.db.common import CommonSessionLocal
from app.core.http_responses import ui_access_denied
from app.core.security.csrf import get_or_create_csrf_token
from app.core.security.session_auth import get_current_user
from app.core.templating import templates
from app.modules.core.rbac.deps import get_user_permissions, get_user_roles
from app.modules.manager_dashboard.service import build_manager_dashboard_payload, can_access_manager_dashboard

router = APIRouter(prefix="/manager", tags=["manager-dashboard-v2-ui"])

VALID_TABS = {
    "overview": "modules/manager_dashboard/templates/manager_dashboard/partials/overview.html",
    "team-work": "modules/manager_dashboard/templates/manager_dashboard/partials/team_work.html",
    "due-calendar": "modules/manager_dashboard/templates/manager_dashboard/partials/due_calendar.html",
    "review-queue": "modules/manager_dashboard/templates/manager_dashboard/partials/review_queue.html",
    "client-pending": "modules/manager_dashboard/templates/manager_dashboard/partials/client_pending.html",
    "documents": "modules/manager_dashboard/templates/manager_dashboard/partials/documents.html",
    "escalations": "modules/manager_dashboard/templates/manager_dashboard/partials/escalations.html",
    "reports": "modules/manager_dashboard/templates/manager_dashboard/partials/reports.html",
    "wizards": "modules/manager_dashboard/templates/manager_dashboard/partials/wizards.html",
}


def _ctx(request: Request, db, current_user, *, active_tab: str = "overview"):
    payload = build_manager_dashboard_payload(db, request, current_user)
    return {
        "request": request,
        "current_user": current_user,
        "current_user_roles": get_user_roles(db, current_user.id),
        "current_user_permissions": get_user_permissions(db, current_user.id),
        "csrf_token": get_or_create_csrf_token(request),
        "title": "Manager Dashboard",
        "active_tab": active_tab,
        **payload,
    }


@router.get("/dashboard")
def dashboard(request: Request, tab: str = "overview"):
    db = CommonSessionLocal()
    try:
        current_user = get_current_user(request, db=db)
        if not current_user:
            return RedirectResponse(url="/login", status_code=303)
        if not can_access_manager_dashboard(db, current_user):
            return ui_access_denied()
        active_tab = tab if tab in VALID_TABS else "overview"
        return templates.TemplateResponse(
            "modules/manager_dashboard/templates/manager_dashboard/dashboard.html",
            _ctx(request, db, current_user, active_tab=active_tab),
        )
    finally:
        db.close()


@router.get("/dashboard/tab/{tab_name}")
def dashboard_tab(request: Request, tab_name: str):
    db = CommonSessionLocal()
    try:
        current_user = get_current_user(request, db=db)
        if not current_user:
            return RedirectResponse(url="/login", status_code=303)
        if not can_access_manager_dashboard(db, current_user):
            return ui_access_denied()
        active_tab = tab_name if tab_name in VALID_TABS else "overview"
        return templates.TemplateResponse(
            VALID_TABS[active_tab],
            _ctx(request, db, current_user, active_tab=active_tab),
        )
    finally:
        db.close()
