"""In-memory ZIP archive builder for multi-day C59 XML exports."""

from __future__ import annotations

import io
import zipfile
from datetime import datetime

from django.utils import timezone

from istat.xml_export.models.zip_export_result import (
    ISTAT_ZIP_CONTENT_TYPE,
    IstatZipExportResult,
)


def build_c59_zip_result(
    *,
    zip_filename: str,
    daily_files: list[tuple[str, str]],
    generated_at: datetime | None = None,
) -> IstatZipExportResult:
    """Pack a list of (filename, xml_content) pairs into an in-memory ZIP.

    Args:
        zip_filename:  Name of the resulting ZIP archive.
        daily_files:   Ordered list of ``(xml_filename, xml_content_str)``
                       tuples — one entry per calendar day.
        generated_at:  Optional UTC timestamp; defaults to ``timezone.now()``.

    Returns:
        An :class:`IstatZipExportResult` with the raw ZIP bytes ready for
        an HTTP download response.  No filesystem I/O is performed.
    """
    buffer = io.BytesIO()

    with zipfile.ZipFile(buffer, mode="w", compression=zipfile.ZIP_DEFLATED) as zf:
        for xml_filename, xml_content in daily_files:
            zf.writestr(xml_filename, xml_content.encode("utf-8"))

    zip_bytes = buffer.getvalue()

    return IstatZipExportResult(
        filename=zip_filename,
        content=zip_bytes,
        content_type=ISTAT_ZIP_CONTENT_TYPE,
        generated_at=generated_at or timezone.now(),
        byte_size=len(zip_bytes),
        file_count=len(daily_files),
    )
