<?php

namespace App\Services;

/**
 * CSV入出力サービス
 * - UtilsのcsvToArrayラッパー＋将来のエクスポート共通化
 */
class CsvService
{
    /**
     * CSV → 配列
     *
     * @param string $path ファイルパス
     * @param string $delimiter 区切り文字
     * @return array|false
     */
    public function toArray(string $path, string $delimiter = ',')
    {
        return \App\Utils::csvToArray($path, $delimiter);
    }

    /**
     * 配列 → CSV（簡易版）
     *
     * @param string $path 出力パス
     * @param array<array-key, array<array-key, string|int|float|null>> $rows 行データ
     * @param string $delimiter 区切り文字
     */
    public function fromArray(string $path, array $rows, string $delimiter = ','): bool
    {
        $fp = fopen($path, 'w');
        if ($fp === false) return false;
        foreach ($rows as $row) {
            // null を空文字として扱う
            $normalized = array_map(static function ($v) {
                return $v === null ? '' : (string) $v;
            }, $row);
            fputcsv($fp, $normalized, $delimiter);
        }
        fclose($fp);
        return true;
    }

    /**
     * 配列 → CSV文字列（メモリ構築）
     *
     * @param array<array-key, array<array-key, string|int|float|null>> $rows 行データ
     * @param string $delimiter 区切り文字（デフォルト: カンマ）
     * @param bool $withBom 先頭にUTF-8 BOMを付与するか
     * @return string CSVテキスト
     */
    public function buildCsvString(array $rows, string $delimiter = ',', bool $withBom = true): string
    {
        $stream = fopen('php://temp', 'r+');
        if ($stream === false) {
            return '';
        }
        foreach ($rows as $row) {
            $normalized = array_map(static function ($v) {
                return $v === null ? '' : (string) $v;
            }, $row);
            fputcsv($stream, $normalized, $delimiter);
        }
        rewind($stream);
        $csv = stream_get_contents($stream) ?: '';
        fclose($stream);
        return $withBom ? ("\xEF\xBB\xBF" . $csv) : $csv;
    }
}


