import java.io.IOException;
import java.math.BigDecimal;
import java.nio.charset.StandardCharsets;
import java.nio.file.Files;
import java.nio.file.Path;
import java.time.LocalDate;
import java.util.Locale;

// Bagian 4: ekspor laporan CSV untuk tabel barang dan jurnal mutasi.
public class DemoGudang {

    public static void main(String[] args) throws IOException {
        Gudang gudang = new Gudang(new GudangRepositoryMemori());
        isiData(gudang);
        gudang.barangMasuk("BRG-001", 50, LocalDate.of(2026, 1, 5), "Budi", "penerimaan awal");
        gudang.barangMasuk("BRG-002", 10, LocalDate.of(2026, 1, 5), "Budi", "penerimaan awal");
        gudang.barangMasuk("BRG-003", 20, LocalDate.of(2026, 1, 6), "Dewi", "penerimaan awal");
        gudang.barangMasuk("BRG-004", 12, LocalDate.of(2026, 1, 6), "Dewi", "penerimaan awal");
        gudang.barangMasuk("BRG-005", 30, LocalDate.of(2026, 1, 7), "Dewi", "penerimaan awal");
        gudang.barangKeluar("BRG-001", 25, LocalDate.of(2026, 1, 15), "Siti",
                "permintaan divisi keuangan");
        gudang.barangKeluar("BRG-002", 8, LocalDate.of(2026, 1, 20), "Siti",
                "koreksi hasil \"stok opname\", selisih 8");
        gudang.barangKeluar("BRG-003", 17, LocalDate.of(2026, 1, 22), "Siti",
                "permintaan divisi keuangan");

        // 1. Laporan tabel barang.
        Path berkasBarang = Path.of("laporan-barang.csv");
        LaporanCsv.eksporBarang(gudang.semuaBarang(), berkasBarang);
        System.out.println("== laporan-barang.csv ==");
        System.out.print(Files.readString(berkasBarang, StandardCharsets.UTF_8));
        System.out.println();

        // 2. Laporan jurnal mutasi, termasuk catatan yang memuat koma dan kutip.
        Path berkasMutasi = Path.of("laporan-mutasi.csv");
        LaporanCsv.eksporMutasi(gudang.riwayat(), berkasMutasi);
        System.out.println("== laporan-mutasi.csv ==");
        System.out.print(Files.readString(berkasMutasi, StandardCharsets.UTF_8));
        System.out.println();

        // 3. Daftar pembelian: barang yang perlu dipesan ulang.
        System.out.println("== perlu restok ==");
        for (Barang b : gudang.barangPerluRestok()) {
            System.out.printf(Locale.US, "%-22s stok %d, minimum %d%n",
                    b.nama(), b.stok(), b.stokMinimum());
        }
    }

    static void isiData(Gudang gudang) {
        gudang.daftar(new Barang("BRG-001", "Kertas HVS A4", "RIM",
                new BigDecimal("47500"), 0, 10));
        gudang.daftar(new Barang("BRG-002", "Tinta Printer Hitam", "BOTOL",
                new BigDecimal("185000"), 0, 8));
        gudang.daftar(new Barang("BRG-003", "Kertas HVS F4", "RIM",
                new BigDecimal("52000"), 0, 8));
        gudang.daftar(new Barang("BRG-004", "Pulpen Gel Hitam 0.5", "BOX",
                new BigDecimal("62000"), 0, 5));
        gudang.daftar(new Barang("BRG-005", "Amplop Cokelat Folio", "PAK",
                new BigDecimal("15500"), 0, 10));
    }
}
