import csv

from django.http import StreamingHttpResponse


class Echo:
    def write(self, value):
        return value


def safe_cell(value):
    if value is None:
        return ""
    text = str(value)
    # Cover whitespace/control-prefixed formulas as well as direct prefixes.
    if text.lstrip(" \t\r\n\ufeff").startswith(("=", "+", "-", "@")) or text.startswith(("\t", "\r", "\n")):
        return "'" + text
    return text


def csv_response(report):
    writer = csv.writer(Echo())

    def content():
        yield "\ufeff" + writer.writerow(report.headers)
        for row in report.values(report.rows.iterator(chunk_size=1000)):
            yield writer.writerow([safe_cell(cell) for cell in row])

    response = StreamingHttpResponse(content(), content_type="text/csv; charset=utf-8")
    response["Content-Disposition"] = f'attachment; filename="{report.key}.csv"'
    response["Cache-Control"] = "private, no-store"
    response["X-Content-Type-Options"] = "nosniff"
    return response
