import java.io.IOException;
import java.nio.charset.StandardCharsets;
import java.nio.file.Files;
import java.nio.file.Path;
import java.util.ArrayList;
import java.util.List;

// Ekspor laporan CSV: baris pertama nama kolom, pemisah koma, nilai yang
// memuat karakter khusus dibungkus kutip ganda sesuai RFC 4180.
public final class LaporanCsv {

    private LaporanCsv() {
        // Kelas utilitas: seluruh anggota static, tidak perlu instance.
    }

    /** Laporan tabel barang: kode, nama, satuan, harga, stok, stok_minimum. */
    public static void eksporBarang(List<Barang> barang, Path berkas) {
        List<String> baris = new ArrayList<>();
        baris.add("kode,nama,satuan,harga,stok,stok_minimum");
        for (Barang b : barang) {
            baris.add(csv(b.kode()) + "," + csv(b.nama()) + "," + csv(b.satuan())
                    + "," + b.harga().toPlainString() + "," + b.stok() + ","
                    + b.stokMinimum());
        }
        tulis(berkas, baris);
    }

    /** Laporan jurnal mutasi: id, tanggal, kode_barang, jenis, jumlah, petugas, catatan. */
    public static void eksporMutasi(List<MutasiStok> mutasi, Path berkas) {
        List<String> baris = new ArrayList<>();
        baris.add("id,tanggal,kode_barang,jenis,jumlah,petugas,catatan");
        for (MutasiStok m : mutasi) {
            baris.add(m.id() + "," + m.tanggal() + "," + csv(m.kodeBarang()) + ","
                    + m.jenis() + "," + m.jumlah() + "," + csv(m.petugas()) + ","
                    + csv(m.catatan()));
        }
        tulis(berkas, baris);
    }

    /**
     * Meloloskan satu nilai CSV: bila nilai memuat koma, kutip ganda, atau
     * baris baru, seluruh nilai dibungkus kutip ganda dan setiap kutip asli
     * digandakan (" menjadi "").
     */
    static String csv(String nilai) {
        if (nilai.indexOf(',') >= 0 || nilai.indexOf('"') >= 0
                || nilai.indexOf('\n') >= 0) {
            return '"' + nilai.replace("\"", "\"\"") + '"';
        }
        return nilai;
    }

    private static void tulis(Path berkas, List<String> baris) {
        try {
            Files.write(berkas, baris, StandardCharsets.UTF_8);
        } catch (IOException e) {
            throw new GudangException("gagal menulis laporan: " + berkas, e);
        }
    }
}
