"""Data export views — dashboard + per-module download endpoints."""
from __future__ import annotations

import datetime

from django.contrib.auth.decorators import login_required
from django.core.exceptions import PermissionDenied
from django.http import HttpResponse
from django.shortcuts import render
from django.template import engines
from django.views.decorators.http import require_GET

from apps.core.exports.services import EXPORT_REGISTRY
from apps.core.permissions.roles import UserRole

_ALLOWED_ROLES = {
    UserRole.ADMIN, UserRole.SYSTEM_ADMIN,
    UserRole.GRANTS_MANAGER, UserRole.PROGRAM_DIRECTOR,
    UserRole.FINANCE_DIRECTOR, UserRole.MEL_OFFICER,
    UserRole.PROGRAMME_OFFICER, UserRole.PROGRAM_MANAGER,
}


def _require_export_access(request):
    if not request.user.is_authenticated:
        raise PermissionDenied
    role = getattr(request.user, "role", "")
    if role not in _ALLOWED_ROLES and not request.user.is_superuser:
        raise PermissionDenied


@login_required
@require_GET
def export_dashboard(request):
    _require_export_access(request)
    return render(request, "exports/dashboard.html", {
        "exports": [
            {"key": key, **meta, "fn": None}   # don't pass the callable to template
            for key, meta in EXPORT_REGISTRY.items()
        ]
    })


@login_required
@require_GET
def export_download(request, module: str):
    _require_export_access(request)
    entry = EXPORT_REGISTRY.get(module)
    if not entry:
        from django.http import Http404
        raise Http404

    today = datetime.date.today().strftime("%Y-%m-%d")
    filename = f"{entry['filename']}_{today}.xlsx"
    data = entry["fn"]()
    response = HttpResponse(
        data,
        content_type="application/vnd.openxmlformats-officedocument.spreadsheetml.sheet",
    )
    response["Content-Disposition"] = f'attachment; filename="{filename}"'
    return response
