<?php

declare(strict_types=1);

namespace App\Services\Reports\Formatters;

use App\Support\CsvFormulaGuard;

/**
 * Excel-friendly CSV: BOM (U+FEFF), ; разделитель, \r\n EOL, escape двойными
 * кавычками для значений с ; / " / \n. Совместимость с MS Excel ru-RU без
 * импортного wizard'а — открывается двойным кликом.
 *
 * F-CSV: ячейки данных нейтрализуются от formula-инъекции (CsvFormulaGuard) —
 * единый писатель для всех типов отчётов. Числа не трогаются.
 */
class CsvFormatter implements ReportFormatter
{
    public function format(array $headers, array $rows): string
    {
        $lines = ["\u{FEFF}".implode(';', array_map([$this, 'escape'], $headers))];

        foreach ($rows as $row) {
            $cells = array_map(fn ($v) => $this->escape(CsvFormulaGuard::neutralizeCell($v)), $row);
            $lines[] = implode(';', $cells);
        }

        return implode("\r\n", $lines)."\r\n";
    }

    public function fileExtension(): string
    {
        return 'csv';
    }

    private function escape(string $value): string
    {
        if (str_contains($value, ';') || str_contains($value, '"') || str_contains($value, "\n")) {
            return '"'.str_replace('"', '""', $value).'"';
        }

        return $value;
    }
}
