"""
inventory/services/export_service.py
──────────────────────────────────────
Excel (.xlsx) export helper, built on openpyxl. Mirrors the shape of
pdf_service.render_pdf(): give it rows + column definitions, get back an
HttpResponse with the file attached.
"""

import csv
import io

from django.http import HttpResponse
from openpyxl import Workbook
from openpyxl.styles import Font, PatternFill
from openpyxl.utils import get_column_letter

_HEADER_FILL = PatternFill(start_color="F2A71B", end_color="F2A71B", fill_type="solid")
_HEADER_FONT = Font(color="000000", bold=True)
_XLSX_CONTENT_TYPE = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"


def _write_sheet(ws, rows, columns):
    """columns: list of (header, key) or (header, key, number_format) tuples."""
    for col_idx, col in enumerate(columns, start=1):
        cell = ws.cell(row=1, column=col_idx, value=col[0])
        cell.font = _HEADER_FONT
        cell.fill = _HEADER_FILL

    for row_idx, row in enumerate(rows, start=2):
        for col_idx, col in enumerate(columns, start=1):
            key = col[1]
            value = row.get(key) if isinstance(row, dict) else getattr(row, key, "")
            cell = ws.cell(row=row_idx, column=col_idx, value=value)
            if len(col) > 2 and col[2]:
                cell.number_format = col[2]

    for col_idx, col in enumerate(columns, start=1):
        ws.column_dimensions[get_column_letter(col_idx)].width = max(len(str(col[0])) + 2, 14)


def _workbook_response(wb: Workbook, filename: str) -> HttpResponse:
    buffer = io.BytesIO()
    wb.save(buffer)
    response = HttpResponse(buffer.getvalue(), content_type=_XLSX_CONTENT_TYPE)
    response["Content-Disposition"] = f'attachment; filename="{filename}"'
    return response


def render_xlsx(rows, columns, filename: str, sheet_name: str = "Report") -> HttpResponse:
    """Single-sheet export. rows: iterable of dicts/objects. columns: see _write_sheet."""
    wb = Workbook()
    ws = wb.active
    ws.title = sheet_name[:31]
    _write_sheet(ws, rows, columns)
    return _workbook_response(wb, filename)


def render_xlsx_multi(sheets: list[dict], filename: str) -> HttpResponse:
    """Multi-sheet export. sheets: [{"name": str, "rows": ..., "columns": ...}, ...]."""
    wb = Workbook()
    wb.remove(wb.active)
    for sheet in sheets:
        ws = wb.create_sheet(title=sheet["name"][:31])
        _write_sheet(ws, sheet["rows"], sheet["columns"])
    return _workbook_response(wb, filename)


def render_csv(rows, columns, filename: str) -> HttpResponse:
    """CSV export. rows: iterable of dicts/objects. columns: see _write_sheet (number_format ignored)."""
    response = HttpResponse(content_type="text/csv")
    response["Content-Disposition"] = f'attachment; filename="{filename}"'
    writer = csv.writer(response)
    writer.writerow([col[0] for col in columns])
    for row in rows:
        writer.writerow([
            row.get(col[1]) if isinstance(row, dict) else getattr(row, col[1], "")
            for col in columns
        ])
    return response
