"""Audit log endpoints."""

import base64
import io
from datetime import datetime, timezone
from pathlib import Path
from zipfile import ZIP_DEFLATED, ZipFile

from fastapi import APIRouter, Depends, HTTPException, status

from ..database import get_session
from ..models import AdminAudit
from ..security import require_roles
from ..utils import log_action

router = APIRouter()

LOG_FILE_PATH = Path("server.log")


@router.get("/")
def list_logs(session=Depends(get_session), _admin=Depends(require_roles("super-admin"))):
    logs = (
        session.query(AdminAudit)
        .order_by(AdminAudit.created_at.desc())
        .limit(200)
        .all()
    )
    return [
        {
            "actor": log.actor_email,
            "action": log.action,
            "target": log.target,
            "details": log.details,
            "created_at": log.created_at.isoformat() if log.created_at else None,
        }
        for log in logs
    ]


@router.get("/download")
def download_logs(session=Depends(get_session), _admin=Depends(require_roles("super-admin"))):
    if not LOG_FILE_PATH.exists():
        raise HTTPException(status_code=status.HTTP_404_NOT_FOUND, detail="Fichier de logs introuvable")

    data = LOG_FILE_PATH.read_bytes()
    if len(data) > 1_000_000:  # limite à 1MB pour un export rapide
        data = data[-1_000_000:]

    buffer = io.BytesIO()
    with ZipFile(buffer, mode="w", compression=ZIP_DEFLATED) as archive:
        archive.writestr("server.log", data)

    encoded = base64.b64encode(buffer.getvalue()).decode("ascii")
    filename = f"logs_{datetime.now(timezone.utc).date()}.zip"

    log_action(session, _admin.email, "logs_downloaded", metadata={"filename": filename})
    session.commit()

    return {"filename": filename, "content_base64": encoded}
